我如何 order/sort 基于 DataField PivotField 内容的数据透视表?
How can I order/sort a PivotTable based on the contents of a DataField PivotField?
我有一页 PivotData(源数据)用于在另一个 sheet 上创建数据透视表。我是这样做的:
var pch = _xlBook.PivotCaches();
int pivotDataRowsUsed = _xlBook.Worksheets["PivotData"].UsedRange.Rows.Count;
int pivotDataColsUsed = _xlBook.Worksheets["PivotData"].UsedRange.Columns.Count;
string lastColWrittenAsAlpha = ReportRunnerConstsAndUtils.GetExcelColumnName(pivotDataColsUsed);
string endRange = string.Format("{0}{1}", lastColWrittenAsAlpha, pivotDataRowsUsed);
Range sourceData = _xlBook.Worksheets["PivotData"].Range[string.Format("A1:{0}", endRange)];
PivotCache pc = pch.Create(XlPivotTableSourceType.xlDatabase, sourceData);
PivotTable pvt = pc.CreatePivotTable(_xlPivotTableSheet.Range["A6"], "PivotTable");
pvt.MergeLabels = true; // The only thing I noticed this doing was centering the heading labels
pvt.PivotFields("Description").Orientation = XlPivotFieldOrientation.xlRowField;
var monthField = pvt.PivotFields("MonthYr");
monthField.Orientation = XlPivotFieldOrientation.xlColumnField;
monthField.NumberFormat = "mmm yyyy";
monthField.DataRange.Interior.Color = ColorTranslator.ToOle(Color.LightBlue);
// from
pvt.CompactLayoutColumnHeader = "Months";
pvt.CompactLayoutRowHeader = "Description";
pvt.AddDataField(pvt.PivotFields("TotalQty"), "Total Packages", XlConsolidationFunction.xlSum).NumberFormat = "###,##0";
pvt.AddDataField(pvt.PivotFields("TotalSales"), "Total Purchases", XlConsolidationFunction.xlSum).NumberFormat = "$#,##0";
PivotField avg = pvt.CalculatedFields().Add("Average Price", "=TotalSales/TotalQty", true);
avg.Orientation = XlPivotFieldOrientation.xlDataField;
// TODO: This calculation needs to change (it needs to actually be made a calculation, rather than just the TotalSales val)
pvt.CalculatedFields()._Add("PercentOfTotal", "=TotalSales");
pvt.AddDataField(pvt.PivotFields("PercentOfTotal"), "% of Total", Type.Missing).NumberFormat = "###.##";
// suggestion from
pvt.DataPivotField.Orientation = XlPivotFieldOrientation.xlRowField;
源数据按描述的字母顺序 "sort of",但不是 really/strictly。不过,源数据的数据透视表确实按描述的字母顺序排列。
有没有办法防止在输入源数据时对数据透视表进行排序?如果是这样,我想最简单的事情就是按照我的需要对源数据进行排序,这通过按 "TotalSales" 列降序排序就足够容易了。
所以我要么需要更改我的源数据 - 如果我可以告诉数据透视表保留源数据的顺序,而不是尝试以任何方式自行排序 - 或者我需要一种方法来排序数据在数据透视表中由特定的 DataField PivotField ("TotalSales").
更新
为了按 TotalSales 排序,我尝试了这个:
pvt.AddDataField(pvt.PivotFields("TotalSales"), "Total Purchases", XlConsolidationFunction.xlSum).NumberFormat = "$#,##0";
pvt.AddDataField(pvt.PivotFields("TotalSales").SortDescending());
第二行完全是猜测,但编译通过了;不过,毫不奇怪,它会导致运行时错误。
更新 2
我也试过这个:
pvt.PivotFields("TotalSales").AutoSort(2, "Total Purchases");
...但它什么也没做。
我不明白为什么它有效,但这确实有效:
var fld = ((PivotField)pvt.PivotFields("Description"));
fld.AutoSort(2, "Total Purchases");
我最好的猜测是 在 描述 "umbrella"(其中有各种 "subvalues")中,自动排序是按总购买量排序,而“ 2" arg 表示降序。无论如何,尽管它不直观且看似没有记录,但它确实按我想要的方式工作。
我有一页 PivotData(源数据)用于在另一个 sheet 上创建数据透视表。我是这样做的:
var pch = _xlBook.PivotCaches();
int pivotDataRowsUsed = _xlBook.Worksheets["PivotData"].UsedRange.Rows.Count;
int pivotDataColsUsed = _xlBook.Worksheets["PivotData"].UsedRange.Columns.Count;
string lastColWrittenAsAlpha = ReportRunnerConstsAndUtils.GetExcelColumnName(pivotDataColsUsed);
string endRange = string.Format("{0}{1}", lastColWrittenAsAlpha, pivotDataRowsUsed);
Range sourceData = _xlBook.Worksheets["PivotData"].Range[string.Format("A1:{0}", endRange)];
PivotCache pc = pch.Create(XlPivotTableSourceType.xlDatabase, sourceData);
PivotTable pvt = pc.CreatePivotTable(_xlPivotTableSheet.Range["A6"], "PivotTable");
pvt.MergeLabels = true; // The only thing I noticed this doing was centering the heading labels
pvt.PivotFields("Description").Orientation = XlPivotFieldOrientation.xlRowField;
var monthField = pvt.PivotFields("MonthYr");
monthField.Orientation = XlPivotFieldOrientation.xlColumnField;
monthField.NumberFormat = "mmm yyyy";
monthField.DataRange.Interior.Color = ColorTranslator.ToOle(Color.LightBlue);
// from
pvt.CompactLayoutColumnHeader = "Months";
pvt.CompactLayoutRowHeader = "Description";
pvt.AddDataField(pvt.PivotFields("TotalQty"), "Total Packages", XlConsolidationFunction.xlSum).NumberFormat = "###,##0";
pvt.AddDataField(pvt.PivotFields("TotalSales"), "Total Purchases", XlConsolidationFunction.xlSum).NumberFormat = "$#,##0";
PivotField avg = pvt.CalculatedFields().Add("Average Price", "=TotalSales/TotalQty", true);
avg.Orientation = XlPivotFieldOrientation.xlDataField;
// TODO: This calculation needs to change (it needs to actually be made a calculation, rather than just the TotalSales val)
pvt.CalculatedFields()._Add("PercentOfTotal", "=TotalSales");
pvt.AddDataField(pvt.PivotFields("PercentOfTotal"), "% of Total", Type.Missing).NumberFormat = "###.##";
// suggestion from
pvt.DataPivotField.Orientation = XlPivotFieldOrientation.xlRowField;
源数据按描述的字母顺序 "sort of",但不是 really/strictly。不过,源数据的数据透视表确实按描述的字母顺序排列。
有没有办法防止在输入源数据时对数据透视表进行排序?如果是这样,我想最简单的事情就是按照我的需要对源数据进行排序,这通过按 "TotalSales" 列降序排序就足够容易了。
所以我要么需要更改我的源数据 - 如果我可以告诉数据透视表保留源数据的顺序,而不是尝试以任何方式自行排序 - 或者我需要一种方法来排序数据在数据透视表中由特定的 DataField PivotField ("TotalSales").
更新
为了按 TotalSales 排序,我尝试了这个:
pvt.AddDataField(pvt.PivotFields("TotalSales"), "Total Purchases", XlConsolidationFunction.xlSum).NumberFormat = "$#,##0";
pvt.AddDataField(pvt.PivotFields("TotalSales").SortDescending());
第二行完全是猜测,但编译通过了;不过,毫不奇怪,它会导致运行时错误。
更新 2
我也试过这个:
pvt.PivotFields("TotalSales").AutoSort(2, "Total Purchases");
...但它什么也没做。
我不明白为什么它有效,但这确实有效:
var fld = ((PivotField)pvt.PivotFields("Description"));
fld.AutoSort(2, "Total Purchases");
我最好的猜测是 在 描述 "umbrella"(其中有各种 "subvalues")中,自动排序是按总购买量排序,而“ 2" arg 表示降序。无论如何,尽管它不直观且看似没有记录,但它确实按我想要的方式工作。