OpenXml pivot table:如何读取总计和小计以显示它们?

OpenXml pivot table: how do you read the total and subtotals in order to display them?

我正在尝试使用 OpenXml 从头开始​​创建一个 Excel 枢轴 table。

我已经成功创建了数据透视表 table 本身(创建了数据透视表Table 定义、缓存定义、所有缓存记录、数据透视字段、RowItems 等)。

但是我如何显示任何数据?如何读取 PivotTable 计算以便将这些值写入单元格?

例如:

当我查看 xl\worksheets\sheet2.xml 中的 XML 时,这些值都 "hard coded" 到单元格中。

如果我自己创建单元格(使用 OpenXml),那么我如何 "query" 这些值,让 Pivot Table 为我计算它们?

PS: 我一直在广泛使用 OpenXml Productivity Tool ... 但它也只是 "hard codes" 总计和小计 ... 没有提供任何线索 how/where 实际计算了这些值。

如果不想使用 EPPlus,可以使用单元格公式:

cell.DataType = new EnumValue<CellValue.Number);
cell.CellFormula = new CellFormula($"=SUBTOTAL{"109"}{rowName}");

//force full recalculation of the cells
workbookPart.workbook.CalculationProperties.ForceFullCalculation = true;
workbookPart.workbook.CalculationProperties.FullCalculationLoad = true;

这样您就可以通过 OpenXml 使用每个公式来计算您需要的任何内容。

为了加载到数据表中:

DataTable dt = new DataTable();

using (SpreadsheetDocument spreadSheetDocument = SpreadsheetDocument.Open(@"..\..\example.xlsx", false))
{

    WorkbookPart workbookPart = spreadSheetDocument.WorkbookPart;
    IEnumerable<Sheet> sheets = spreadSheetDocument.WorkbookPart.Workbook.GetFirstChild<Sheets>().Elements<Sheet>();
    string relationshipId = sheets.First().Id.Value;
    WorksheetPart worksheetPart = (WorksheetPart)spreadSheetDocument.WorkbookPart.GetPartById(relationshipId);
    Worksheet workSheet = worksheetPart.Worksheet;
    SheetData sheetData = workSheet.GetFirstChild<SheetData>();
    IEnumerable<Row> rows = sheetData.Descendants<Row>();

    foreach (Cell cell in rows.ElementAt(0))
    {
        dt.Columns.Add(GetCellValue(spreadSheetDocument, cell));
    }

    foreach (Row row in rows) //this will also include your header row...
    {
        DataRow tempRow = dt.NewRow();

        for (int i = 0; i < row.Descendants<Cell>().Count(); i++)
        {
            tempRow[i] = GetCellValue(spreadSheetDocument, row.Descendants<Cell>().ElementAt(i-1));
        }

        dt.Rows.Add(tempRow);
    }

}