c# - 如何根据数据字段数据透视字段的内容对数据透视表进行排序/排序?

标签 c# excel sorting pivot-table excel-interop

我有一个数据透视数据(源数据)页面,用于在另一张工作表上创建数据透视表。我这样做是这样的:

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 http://stackoverflow.com/questions/40031858/how-can-i-change-the-text-of-the-automatically-added-labels-on-these-excel-inter
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 http://stackoverflow.com/questions/40003146/how-can-i-get-this-pivottable-to-display-the-values-i-want-it-to-in-the-locatio
pvt.DataPivotField.Orientation = XlPivotFieldOrientation.xlRowField;

源数据“有点”按描述的字母顺序排列,但不是真正/严格的。不过,源数据的数据透视表化按描述按字母顺序排列。

有没有办法在输入源数据时阻止数据透视表被排序?如果是这样,我想最简单的事情就是按照我想要的方式对源数据进行排序,这通过按“TotalSales”列降序排序就足够容易了。

所以我要么需要更改我的源数据 - 如果我可以告诉数据透视表保留源数据的顺序,而不是尝试以任何方式对其本身进行排序 - 或者我需要一种方法来对数据透视表中的数据进行排序数据透视表由特定数据字段数据透视字段(“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”(具有各种“子值”)中,自动排序按总购买量排序,“2”参数表示降序。无论如何,尽管它不直观且似乎没有文档记录,但它确实按照我想要的方式工作。

关于c# - 如何根据数据字段数据透视字段的内容对数据透视表进行排序/排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40141927/

相关文章:

c# - GUI在获取数据时未响应

ruby-on-rails - 在 ruby​​ 中从 Excel xls 转换为 xlsx

c++ - 排序后丢失 "some"十进制值

c# - 根据另一个列表中的相关值对 c# 中的列表进行排序

c# - 十进制值检查是否为零

c# - Visual Studio 编译时 SQL 验证

c# - 从后台 worker 更新 GUI

Excel 单元格显示零而不是计算/引用值

excel - Powershell 函数如何指定 ComObject 参数类型?

objective-c - 如何将 NSMutableArray 中的字符串按字母顺序排序?