在Aspose .NET 6中将Excel文件表头设置为帕斯卡命名法
解决Aspose.Cells导入JSON时表头转为帕斯卡命名法的问题
问题场景
现有一段使用Aspose.Cells将JSON数组映射为Excel文件的代码,生成的Excel表头为小写格式,需要将表头改为帕斯卡命名法(首字母大写,后续单词首字母也大写,无下划线)。尝试通过Worksheet的PageSetup设置表头,但未找到相关配置项,不清楚该通过预处理JSON还是Aspose自身方法实现。
现有JSON转Excel代码
private async Task<string> JsonToExcel(string jsonString) { try { Workbook workbook = new(); Worksheet worksheet = workbook.Worksheets[0]; // Set JsonLayoutOptions JsonLayoutOptions options = new(); options.ArrayAsTable = true; // Import JSON Data JsonUtility.ImportData(jsonString, worksheet.Cells, 0, 0, options); // Save Excel file Guid guid = Guid.NewGuid(); string filename = DateTimeOffset.Now.ToString("yyyy_MM_dd") + guid.ToString() + ".xlsx"; string path = _hostEnvironment.ContentRootPath + "Output\\"; worksheet.PageSetup.PrintGridlines = true; worksheet.PageSetup.FitToPagesWide = 1; workbook.Save(path + filename, SaveFormat.Xlsx); return (path + filename); } catch (Exception) { throw; } }
无效尝试(PageSetup设置)
// Instantiating a Workbook object Workbook excel = new Workbook(); // Obtaining the reference of the PageSetup of the worksheet PageSetup pageSetup = excel.Worksheets[0].PageSetup; // Setting worksheet name at the left section of the header pageSetup.SetHeader(0, "&A");
可行解决方案
方案1:预处理JSON,将键转为帕斯卡命名法后再导入
先解析JSON对象,把所有键名转换为帕斯卡格式,再重新序列化为JSON字符串,最后用Aspose导入。这里以Newtonsoft.Json为例:
using Newtonsoft.Json; using Newtonsoft.Json.Linq; private string ConvertJsonKeysToPascalCase(string jsonString) { var jArray = JArray.Parse(jsonString); var convertedArray = new JArray(); foreach (JObject obj in jArray) { var newObj = new JObject(); foreach (var prop in obj.Properties()) { // 将小写键转为帕斯卡命名法 string pascalKey = ToPascalCase(prop.Name); newObj.Add(pascalKey, prop.Value); } convertedArray.Add(newObj); } return convertedArray.ToString(Formatting.None); } private string ToPascalCase(string input) { if (string.IsNullOrEmpty(input)) return input; // 处理下划线分隔的情况(如果有的话),先拆分再转帕斯卡 var words = input.Split(new[] {'_'}, StringSplitOptions.RemoveEmptyEntries); return string.Concat(words.Select(word => char.ToUpper(word[0]) + word.Substring(1).ToLower())); }
修改原JsonToExcel方法,先处理JSON:
private async Task<string> JsonToExcel(string jsonString) { try { // 预处理JSON,转换键为帕斯卡命名法 string processedJson = ConvertJsonKeysToPascalCase(jsonString); Workbook workbook = new(); Worksheet worksheet = workbook.Worksheets[0]; JsonLayoutOptions options = new(); options.ArrayAsTable = true; JsonUtility.ImportData(processedJson, worksheet.Cells, 0, 0, options); // 后续保存逻辑不变 Guid guid = Guid.NewGuid(); string filename = DateTimeOffset.Now.ToString("yyyy_MM_dd") + guid.ToString() + ".xlsx"; string path = _hostEnvironment.ContentRootPath + "Output\\"; worksheet.PageSetup.PrintGridlines = true; worksheet.PageSetup.FitToPagesWide = 1; workbook.Save(path + filename, SaveFormat.Xlsx); return (path + filename); } catch (Exception) { throw; } }
方案2:导入Excel后,直接修改表头单元格内容
如果不想修改JSON,可以在Aspose导入数据后,遍历第一行的所有单元格,将文本转为帕斯卡命名法:
private async Task<string> JsonToExcel(string jsonString) { try { Workbook workbook = new(); Worksheet worksheet = workbook.Worksheets[0]; JsonLayoutOptions options = new(); options.ArrayAsTable = true; JsonUtility.ImportData(jsonString, worksheet.Cells, 0, 0, options); // 修改表头为帕斯卡命名法 Range headerRange = worksheet.Cells.Rows[0]; foreach (Cell cell in headerRange) { if (!string.IsNullOrEmpty(cell.StringValue)) { cell.PutValue(ToPascalCase(cell.StringValue)); } } // 后续保存逻辑不变 Guid guid = Guid.NewGuid(); string filename = DateTimeOffset.Now.ToString("yyyy_MM_dd") + guid.ToString() + ".xlsx"; string path = _hostEnvironment.ContentRootPath + "Output\\"; worksheet.PageSetup.PrintGridlines = true; worksheet.PageSetup.FitToPagesWide = 1; workbook.Save(path + filename, SaveFormat.Xlsx); return (path + filename); } catch (Exception) { throw; } } // 复用帕斯卡转换方法 private string ToPascalCase(string input) { if (string.IsNullOrEmpty(input)) return input; var words = input.Split(new[] {'_'}, StringSplitOptions.RemoveEmptyEntries); return string.Concat(words.Select(word => char.ToUpper(word[0]) + word.Substring(1).ToLower())); }
说明
Aspose.Cells的JsonUtility.ImportData方法目前没有直接配置表头命名格式的选项,因此只能通过上述两种方式实现:
- 方案1适合需要在源头统一修改键名的场景;
- 方案2更适合仅需要修改Excel显示表头,不改变原始JSON结构的场景。
内容的提问来源于stack exchange,提问作者Osama Mirza
相关产品推荐
相关产品推荐

