EPPlus设置RowField的SubTotalFunctions导致Excel文件报错求助
问题原因与解决方案
你遇到的Excel文件修复提示并非EPPlus的Bug,而是因为同时启用了互斥的透视表布局模式:代码中同时设置了r.Compact = true;和r.Outline = true;,但Excel透视表的紧凑布局(Compact)和大纲布局(Outline)是互斥的,不能同时开启,这会导致生成的文件结构冲突,触发修复提示。
修改后的代码
只需移除其中一个布局设置即可,以下是保留大纲布局的修改版本(若偏好紧凑布局,可替换为保留Compact并移除Outline):
using OfficeOpenXml; using OfficeOpenXml.Table.PivotTable; using System.Collections.Generic; using System.IO; var data = Datas(); // 使用using语句自动释放资源,避免泄漏 using var stream = new FileStream("Data.xlsx", FileMode.Create); using var pkg = new ExcelPackage(stream); var wsData = pkg.Workbook.Worksheets.Add("Data"); var wsPivot = pkg.Workbook.Worksheets.Add("Pivot Table"); var dataRange = wsData.Cells["A1"].LoadFromCollection(data, true); // 创建透视表 var pivotTable = wsPivot.PivotTables.Add(wsPivot.Cells["A1"], wsData.Cells[1, 1, dataRange.End.Row, 3], "Pivot Table"); pivotTable.DataFields.Add(pivotTable.Fields[0]); // 绑定FirstNumber数据字段 var rowField = pivotTable.RowFields.Add(pivotTable.Fields[1]); // 绑定SecondNumber为行字段 pivotTable.ColumnFields.Add(pivotTable.Fields[2]); // 绑定Text为列字段 // 设置行字段汇总与排序 rowField.SubtotalTop = true; rowField.SubTotalFunctions = eSubTotalFunctions.Sum; rowField.Sort = eSortType.Ascending; // 二选一:仅保留一种布局模式 rowField.Outline = true; pkg.Save(); // 测试数据生成 IEnumerable<Data> Datas() { return new List<Data> { new() { Text = "red", FirstNumber = 0, SecondNumber = 10 }, new() { Text = "red", FirstNumber = 1, SecondNumber = 10 }, new() { Text = "blue", FirstNumber = 2, SecondNumber = 10 }, new() { Text = "blue", FirstNumber = 3, SecondNumber = 20 }, new() { Text = "green", FirstNumber = 4, SecondNumber = 20 }, new() { Text = "green", FirstNumber = 5, SecondNumber = 40 } }; } internal class Data { public int FirstNumber { get; set; } public int SecondNumber { get; set; } public string Text { get; set; } }
额外说明
- 设置
SubTotalFunctions = eSubTotalFunctions.Sum本身是正确的,不会导致报错,只需确保布局模式唯一即可。 - 使用
using语句管理FileStream和ExcelPackage,能自动释放资源,避免潜在的文件占用问题。
内容的提问来源于stack exchange,提问作者Steven
相关产品推荐
相关产品推荐

