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 计算以便将这些值写入单元格?
例如:
- "grand total" 是 86,631.62 美元。
- 两个小计是 $61,631,12 和 $25,000.50
当我查看 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);
}
}
我正在尝试使用 OpenXml 从头开始创建一个 Excel 枢轴 table。
我已经成功创建了数据透视表 table 本身(创建了数据透视表Table 定义、缓存定义、所有缓存记录、数据透视字段、RowItems 等)。
但是我如何显示任何数据?如何读取 PivotTable 计算以便将这些值写入单元格?
例如:
- "grand total" 是 86,631.62 美元。
- 两个小计是 $61,631,12 和 $25,000.50
当我查看 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);
}
}