1

我正在尝试使用 OpenXML 在导出的 Excel 工作簿中创建一个组。

我的源数据表如下所示:

Row     State   Product Sales
1       NY      A       100
2       NY      A       200
3       NY      B       300
4       CA      A       100
5       CA      A       200
6       CA      B       300

我想按州创建大纲,然后按产品创建每个组的小计

我试过了

 ws.Outline.SummaryVLocation = XLOutlineSummaryVLocation.Top;
 ws.Rows(1, 3).Group(); // Create an outline (level 2) for rows 1-4
 ws.Rows(4, 6).Group();

但这并没有给我想要的东西,而且我看不到添加小计的选项。

我怎样才能做到这一点?

4

1 回答 1

3

您使用的文档中的代码示例已经过时或错误。
如果要将第 2 行到第 4 行分组,则需要使用代码ws.Rows(3, 4).Group();(见图)。这与 Excel 本身是一致的,您必须在单击组按钮之前仅选择第 3 行和第 4 行以获得相同的结果。

在此处输入图像描述

当您尝试像在代码中那样将第 1 行到第 3 行分组时,会将它们全部分组在第 0 行下,这会导致错误,因为没有第 0 行。您可以使用该XLOutlineSummaryVLocation属性在某种程度上控制此行为。如果您使用Bottom而不是顶部,则使用前两行对第 2 到 4 行进行分组:ws.Rows(2, 3).Group();

综上所述,还有两点:

  1. 您需要使用 Excel 行号而不是“行”列中的数字。
  2. 所有这些分组和折叠仅用于显示目的。要总结销售数字,您必须使用 Excel 中的小计函数(在这种情况下,我发现它相当混乱且无益)或直接在 C# 中添加列和结果。

使用此代码应该会导致您想要的结果(见下图):

ws.Outline.SummaryVLocation = XLOutlineSummaryVLocation.Top;
ws.Cell(1, 5).SetValue("Product subtotals");
ws.Cell(1, 6).SetValue("State subtotals");

ws.Rows(3, 4).Group();                      // group rows 2 to 4 (state NY), outline level 1
ws.Cell(2, 6).SetFormulaA1("=SUM(D2:D4)");  // subtotal for all NY sales
ws.Row(3).Group();                          // group rows 2 and 3 (product A), outline level 2
ws.Cell(2, 5).SetFormulaA1("=SUM(D2:D3)");  // subtotal for all NY, product A sales
ws.Cell(4, 5).SetFormulaA1("=SUM(D4)");     // subtotal for all NY, product B sales

ws.Rows(6, 7).Group();                      // group rows 5 to 7 (state CA), outline level 1
ws.Row(6).Group();                          // group rows 5 and 6 (product A), outline level 2
ws.CollapseRows(2);                         // collapse group level 2 (products)

在此处输入图像描述

于 2014-09-11T09:20:30.077 回答