You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 22:05:20