如何将数据透视表直接合并到 sheet 上的源数据中(使用 EPPlus)?
How can I incorporate a PivotTable right into the source data on the sheet (using EPPlus)?
我已经能够创建一个与 raw/source 数据分开的数据透视表,但现在我想将两者结合起来,数据透视表允许通过提供过滤器来过滤传播 sheet 数据在列标题行上,像这样:
我试过这段代码:
private void AddPivotTable()
{
// The commented-out code below placess the PivotTable below the actual data, separate from it:
//string colAlphaRowNum = string.Format("A{0}", locationWorksheet.Dimension.End.Row+5);
// Here I am attempting to incorporate the PivotTable within the data itself (one row above it, actually)
string colAlphaRowNum = "A5";
ExcelAddressBase eab = locationWorksheet.Cells[colAlphaRowNum];
ExcelRangeBase erb = locationWorksheet.Cells[6, 1, locationWorksheet.Dimension.End.Row, locationWorksheet.Dimension.End.Column];
var pt = locationWorksheet.PivotTables.Add(eab, erb, "Pivotous");
pt.RowFields.Add(pt.Fields[0]);
pt.RowFields.Add(pt.Fields[1]);
pt.RowFields.Add(pt.Fields[2]);
pt.RowFields.Add(pt.Fields[3]);
pt.RowFields.Add(pt.Fields[4]);
pt.RowFields.Add(pt.Fields[5]);
pt.MultipleFieldFilters = true;
pt.RowGrandTotals = true;
pt.ColumGrandTotals = true;
pt.Compact = true;
pt.CompactData = true;
pt.GridDropZones = false;
pt.Outline = false;
pt.OutlineData = false;
pt.ShowError = true;
pt.ErrorCaption = "[error]";
pt.ShowHeaders = true;
pt.UseAutoFormatting = true;
pt.ApplyWidthHeightFormats = true;
pt.ShowDrill = true;
pt.DataOnRows = false;
pt.FirstHeaderRow = 1; // first row has headers
pt.FirstDataCol = 1; // first col of data
pt.FirstDataRow = 2; // first row of data
pt.TableStyle = TableStyles.Medium6; // There is a "custom" and several Dark, Light, and Medium options
}
...但这不起作用。打开生成的 sheet:
时出现此对话框
如果我 select "Yes" 这是我看到的:
如果我select"No",我看到这个:
...这是有希望的,但是如果我然后放下 "Row Labels",deselect“(Select 全部)”然后 select第一项 ("Stern"),我看到了这个:
这不是我想要的;在模型 (hand-crafted) sheet 中,deselecting "Select All" 然后 selecting 单个项目过滤数据以仅包含该数据 ("Foster" 在这种情况下),像这样:
...而不是用受限制的数据透视表替换数据的第一部分。
我需要做什么才能使这项工作按预期进行?
也许我的命名有误,因为我认为我真正想要的不一定是 PivotTable,而是过滤的能力。
而且,尽管尝试这样做,这似乎合乎逻辑,甚至在理论上也是正确的:
using (var shortNameCell = locationWorksheet.Cells[rowToPop, SHORTNAME_BYDCBYLOC_COL])
{
shortNameCell.Value = "Short Name";
shortNameCell.Style.WrapText = false;
shortNameCell.Style.Font.Size = 12;
shortNameCell.AutoFilter = true;
}
using (var companyNameCell = locationWorksheet.Cells[rowToPop, COMPANYNAME_BYDCBYLOC_COL])
{
. . .
companyNameCell.AutoFilter = true;
}
using (var reasonDescCell = locationWorksheet.Cells[rowToPop, REASONDESC_BYDCBYLOC_COL])
{
. . .
reasonDescCell.AutoFilter = true;
}
using (var transTypeCell = locationWorksheet.Cells[rowToPop, TRANSTYPE_BYDCBYLOC_COL])
{
. . .
transTypeCell.AutoFilter = true;
}
...结果只有最后一列因此被指定为运动过滤能力,以下适用于所有四个:
locationWorksheet.Cells["A6:D6"].AutoFilter = true;
使用最后一个,我得到以下信息:
更新
它毕竟是我需要的一个枢轴 Table,我为开始如何完成我需要的事情所做的工作显示在我的自动回答 中。
我已经能够创建一个与 raw/source 数据分开的数据透视表,但现在我想将两者结合起来,数据透视表允许通过提供过滤器来过滤传播 sheet 数据在列标题行上,像这样:
我试过这段代码:
private void AddPivotTable()
{
// The commented-out code below placess the PivotTable below the actual data, separate from it:
//string colAlphaRowNum = string.Format("A{0}", locationWorksheet.Dimension.End.Row+5);
// Here I am attempting to incorporate the PivotTable within the data itself (one row above it, actually)
string colAlphaRowNum = "A5";
ExcelAddressBase eab = locationWorksheet.Cells[colAlphaRowNum];
ExcelRangeBase erb = locationWorksheet.Cells[6, 1, locationWorksheet.Dimension.End.Row, locationWorksheet.Dimension.End.Column];
var pt = locationWorksheet.PivotTables.Add(eab, erb, "Pivotous");
pt.RowFields.Add(pt.Fields[0]);
pt.RowFields.Add(pt.Fields[1]);
pt.RowFields.Add(pt.Fields[2]);
pt.RowFields.Add(pt.Fields[3]);
pt.RowFields.Add(pt.Fields[4]);
pt.RowFields.Add(pt.Fields[5]);
pt.MultipleFieldFilters = true;
pt.RowGrandTotals = true;
pt.ColumGrandTotals = true;
pt.Compact = true;
pt.CompactData = true;
pt.GridDropZones = false;
pt.Outline = false;
pt.OutlineData = false;
pt.ShowError = true;
pt.ErrorCaption = "[error]";
pt.ShowHeaders = true;
pt.UseAutoFormatting = true;
pt.ApplyWidthHeightFormats = true;
pt.ShowDrill = true;
pt.DataOnRows = false;
pt.FirstHeaderRow = 1; // first row has headers
pt.FirstDataCol = 1; // first col of data
pt.FirstDataRow = 2; // first row of data
pt.TableStyle = TableStyles.Medium6; // There is a "custom" and several Dark, Light, and Medium options
}
...但这不起作用。打开生成的 sheet:
时出现此对话框如果我 select "Yes" 这是我看到的:
如果我select"No",我看到这个:
...这是有希望的,但是如果我然后放下 "Row Labels",deselect“(Select 全部)”然后 select第一项 ("Stern"),我看到了这个:
这不是我想要的;在模型 (hand-crafted) sheet 中,deselecting "Select All" 然后 selecting 单个项目过滤数据以仅包含该数据 ("Foster" 在这种情况下),像这样:
...而不是用受限制的数据透视表替换数据的第一部分。
我需要做什么才能使这项工作按预期进行?
也许我的命名有误,因为我认为我真正想要的不一定是 PivotTable,而是过滤的能力。
而且,尽管尝试这样做,这似乎合乎逻辑,甚至在理论上也是正确的:
using (var shortNameCell = locationWorksheet.Cells[rowToPop, SHORTNAME_BYDCBYLOC_COL])
{
shortNameCell.Value = "Short Name";
shortNameCell.Style.WrapText = false;
shortNameCell.Style.Font.Size = 12;
shortNameCell.AutoFilter = true;
}
using (var companyNameCell = locationWorksheet.Cells[rowToPop, COMPANYNAME_BYDCBYLOC_COL])
{
. . .
companyNameCell.AutoFilter = true;
}
using (var reasonDescCell = locationWorksheet.Cells[rowToPop, REASONDESC_BYDCBYLOC_COL])
{
. . .
reasonDescCell.AutoFilter = true;
}
using (var transTypeCell = locationWorksheet.Cells[rowToPop, TRANSTYPE_BYDCBYLOC_COL])
{
. . .
transTypeCell.AutoFilter = true;
}
...结果只有最后一列因此被指定为运动过滤能力,以下适用于所有四个:
locationWorksheet.Cells["A6:D6"].AutoFilter = true;
使用最后一个,我得到以下信息:
更新
它毕竟是我需要的一个枢轴 Table,我为开始如何完成我需要的事情所做的工作显示在我的自动回答