我怎样才能得到这个数据透视表显示我想要的值,在我想要他们的位置?

在咬牙切齿之后,我可以通过生成数据透视表取得一点成功。 现在,它同时包含“行筛选器”(在“描述”上)和“列筛选器”(在“年份”列中),如下所示:

在这里输入图像说明

这是用下面的代码完成的:

var pch = _xlBook.PivotCaches(); Range sourceData = _xlBook.Worksheets["PivotData"].Range["A1:G318"]; // TODO: Make range dynamic PivotCache pc = pch.Create(XlPivotTableSourceType.xlDatabase, sourceData); PivotTable pvt = pc.CreatePivotTable(_xlPivotTableSheet.Range["A8"], "PivotTable"); pvt.PivotFields("Description").Orientation = XlPivotFieldOrientation.xlRowField; pvt.PivotFields("MonthYr").Orientation = XlPivotFieldOrientation.xlColumnField; 

源数据(“PivotData”)如下所示:

在这里输入图像说明

当数据透视表被编码时,数据透视表应该是什么样的:

在这里输入图像说明

我需要做些什么才能达到这个目的(这些数据,在这些地方)? 我认为它的一部分与更多的XlPivotFieldOrientation值赋值给更多的PivotFields有关,但是不知道它们应该是什么。

首先但可能最less(但仍然重要),“行标签”应该说“说明”和“列标签”应该说“月”

UPDATE

我试图逐个添加使各个列显示所需的代码。 我试过这个:

pvt.AddDataField(pvt.PivotFields(“TotalQty”),“Total Packages”,XlConsolidationFunction.xlSum).NumberFormat =“###,## 0”;

…希望源数据的“TotalQty”列中的数据将显示在“Total Packages”

它确实显示,但标签“总包”,出现在一个奇怪的/偏离的地方:

在这里输入图像说明

我怎样才能得到“总包”标签显示在“模型”屏幕截图中的位置?

更新2

Hambone在他的回答中提到了我的TODO; 我回到了它,并通过这种方式使其dynamic变化:

 int rowsUsed = _xlBook.Worksheets["PivotData"].UsedRange.Rows.Count; int colsUsed = _xlBook.Worksheets["PivotData"].UsedRange.Columns.Count; string colsUsedAsAlpha = GetExcelColumnName(colsUsed); string endRange = string.Format("{0}{1}", colsUsedAsAlpha, rowsUsed); Range sourceData = _xlBook.Worksheets["PivotData"].Range[string.Format("A1:{0}", endRange)]; // Pass "1", get "A", etc.; from http://stackoverflow.com/questions/181596/how- to-convert-a-column-number-eg-127-into-an-excel-column-eg-aa public static string GetExcelColumnName(int columnNumber) { int dividend = columnNumber; string columnName = String.Empty; while (dividend > 0) { var modulo = (dividend - 1) % 26; columnName = Convert.ToChar(65 + modulo).ToString() + columnName; dividend = (dividend - modulo) / 26; } return columnName; } 

顺便说一句,我找不到我的青铜徽章。

有几件事…你并没有特别提出这个问题,但是在你的代码中,你有一个“TODO”来使得范围dynamic化。 一个非常好的方法是将您的范围转换为表格。 一旦你这样做,你可以通过表而不是范围。 该表,你可能从以前的post知道将是:

 ListObject tab = _xlPivotTableSheet.ListObjects["Table1"]; PivotCache pc = pch.Create(XlPivotTableSourceType.xlDatabase, tab); 

如果你这样做,边界并不重要 – 表格会作为一个数据源。

回到你手头的问题。 你添加了你的数据字段好吧:

 pvt.AddDataField(pvt.PivotFields("TotalQty"), "Total Packages", XlConsolidationFunction.xlSum); pvt.AddDataField(pvt.PivotFields("TotalSales"), "Total Purchases", XlConsolidationFunction.xlSum); 

计算的字段有点棘手。 我不太了解“总数百分比”的计算方法,但是出于说明的目的,这就是你如何做平均价格:

 PivotField avg = pvt.CalculatedFields().Add("Average Price", "=TotalSales/TotalQty", true); avg.Orientation = XlPivotFieldOrientation.xlDataField; 

你是对的 – 方向不是你所期望的。 这个设置是在数据透视表级完成的 – 它可以是行或列。 要获得您正在查找的视图,请将其从默认列更改为行:

 pvt.DataPivotField.Orientation = XlPivotFieldOrientation.xlRowField; 

一旦你这样做,我认为数据透视表将看起来更符合你的期望。