Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使数据透视表在我希望的位置显示我希望它显示的值?_C#_Excel_Pivot Table_Excel Interop - Fatal编程技术网

C# 如何使数据透视表在我希望的位置显示我希望它显示的值?

C# 如何使数据透视表在我希望的位置显示我希望它显示的值?,c#,excel,pivot-table,excel-interop,C#,Excel,Pivot Table,Excel Interop,在经历了大量的磨难之后,我在生成数据透视表方面取得了一些成功。它现在使用“行过滤器”(在“说明”中)和“列过滤器”(在“月-年”列中),如下所示: 这是通过以下代码实现的: var pch = _xlBook.PivotCaches(); Range sourceData = _xlBook.Worksheets["PivotData"].Range["A1:G318"]; // TODO: Make range dynamic PivotCache pc = pch.Create(XlPi

在经历了大量的磨难之后,我在生成数据透视表方面取得了一些成功。它现在使用“行过滤器”(在“说明”中)和“列过滤器”(在“月-年”列中),如下所示:

这是通过以下代码实现的:

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;
源数据(“数据透视”)如下所示:

数据透视表应该是这样的,当所有的数据都被表示和编码时,是这样的:

我需要做什么来实现这种外观(这些数据,以及在这些位置)?我认为部分原因与将更多XlPivotFieldOrientation值分配给更多PivotField有关,但我不知道它们应该是什么

首先,但可能是最不重要的(但仍然很重要),“行标签”应该是“说明”,而“列标签”应该是“月份”

更新 我正试图一件一件地添加显示各个列所需的代码。我试过这个:

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

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

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

我如何让“总包装”标签显示在“模型”屏幕截图中的位置

更新2 汉伯恩在回答中提到了我的待办事项;我回到它,并以这种方式使其充满活力:

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”使范围成为动态的。一个非常好的方法是将范围转换为表。完成此操作后,可以传递表格而不是范围。您可能从以前的文章中了解到,该表如下:

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;

一旦你这样做了,我认为透视表将看起来更像你期望的样子。

有几件事。。。您并没有明确地问这个问题,但在代码中,您有一个“TODO”使范围成为动态的。一个非常好的方法是将范围转换为表。完成此操作后,可以传递表格而不是范围。您可能从以前的文章中了解到,该表如下:

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;

完成此操作后,我认为数据透视表的外观将更符合您的预期。

使用第一段代码,是否会更改我现有的代码:PivotCache pc=pch.Create(XlPivotTableSourceType.xlDatabase,sourceData);到:PivotCache pc=pch.Create(XlPivotTableSourceType.xlDatabase,tab)?是的,没错。表(ListObjects)是真正的游戏规则改变者。我绝对喜欢它们。第一段代码是否会改变我现有的代码:PivotCache pc=pch.Create(XlPivotTableSourceType.xlDatabase,sourceData);到:PivotCache pc=pch.Create(XlPivotTableSourceType.xlDatabase,tab)?是的,没错。表(ListObjects)是真正的游戏规则改变者。我绝对爱他们。