excel OpenXml数据透视表:如何读取总计和小计以显示它们?

oknrviil  于 2023-11-20  发布在  其他
关注(0)|答案(1)|浏览(116)

我尝试使用OpenXml从头开始创建一个Excel数据透视表。
我已经成功地创建了数据透视表本身(创建了一个数据透视表定义、一个缓存定义、所有的该高速缓存记录、数据透视表字段、行项目等)。
但是我如何 * 显示 * 任何数据?我如何读取计算结果以便将这些值写入单元格?
举例来说:


的数据

  • “总计”为86,631.62美元。
  • 两项小计分别为61 631.12美元和25 000.50美元。

当我查看xl\worksheets\sheet2.xml中的XML时,这些值都被“硬编码”到单元格中。
如果我自己创建单元格(使用OpenXml),那么我如何“查询”这些值,让数据透视表为我计算它们?
附言:我一直在广泛使用OpenXml生产力工具.

z0qdvdin

z0qdvdin1#

如果你不想使用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中:

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);
    }


}

相关问题