为什么我的数据透视表字段名称被认为是无效的和/或我的数据被视为没有组织成带有标签列的列表?

注意:我在这里有一个相关的问题,但是已经完全改变了代码,仍然得到相同的错误信息,即“ 数据透视表字段名称无效。要创build数据透视表报表,必须使用组织为列表的数据带有标签的列如果您要更改数据透视表字段的名称,则必须为该字段键入一个新的名称。

正如您在下面的代码中所看到的,数据透视表字段被赋予名称(第一个“描述”,然后是“月”):

private void AddPivotTable() { var pch = _xlBook.PivotCaches(); pch.Add(XlPivotTableSourceType.xlDatabase, "A6:F94") .CreatePivotTable(_xlSheet.Cells[6, 1], "PivTab1", Type.Missing, Type.Missing); var pvt = _xlSheet.PivotTables("PivTab1") as PivotTable; if (pvt != null) { pvt.MergeLabels = true; pvt.ErrorString = ""; pvt.DisplayErrorString = true; var fld = ((PivotField)pvt.PivotFields("Description")); fld.Orientation = XlPivotFieldOrientation.xlRowField; fld = ((PivotField)pvt.PivotFields("Month")); fld.Orientation = XlPivotFieldOrientation.xlColumnField; fld.NumberFormat = "MMM yy"; fld.DataRange.Interior.Color = ColorTranslator.ToOle(Color.LightBlue); } } 

我想也许问题是相同的PivotField(“fld”)被用于“说明”行字段和“月”列字段,所以我重构了代码:

 private void AddPivotTable() { var pch = _xlBook.PivotCaches(); pch.Add(XlPivotTableSourceType.xlDatabase, "A6:F94") .CreatePivotTable(_xlSheet.Cells[6, 1], "PivTab1", Type.Missing, Type.Missing); var pvt = _xlSheet.PivotTables("PivTab1") as PivotTable; if (pvt != null) { pvt.MergeLabels = true; pvt.ErrorString = ""; pvt.DisplayErrorString = true; var descriptionPivotField = (PivotField)pvt.PivotFields("Description"); descriptionPivotField.Orientation = XlPivotFieldOrientation.xlRowField; var monthPivotField = (PivotField)pvt.PivotFields("Month"); monthPivotField.Orientation = XlPivotFieldOrientation.xlColumnField; monthPivotField.NumberFormat = "MMM yy"; monthPivotField.DataRange.Interior.Color = ColorTranslator.ToOle(Color.LightBlue); } } 

…但没有区别 它仍然告诉我数据透视表字段名称是无效的 – 但哪一个,“描述”或“月”? 都? 为什么? ISTM要么是误导性的,要么名称要求很奇怪。

当代码工作并生成工作表时,应如下所示,使用“Month”和“Description”数据透视表字段:

在这里输入图像说明

下面是我生成的工作表当前的外观,虽然没有数据透视表或它的字段(这是数据透视表代码注释掉时产生的):

在这里输入图像描述

这个问题的一个可能的真正原因可能与错误信息的第二部分有关,即“ …你必须使用被组织成带有标签列的列表的数据但是正如你可以直接在屏幕截图中看到的那样上面有数据从A6开始(这是标题行的第一列),并且通过列F和行94与testing数据一起继续:

在这里输入图像描述

(实际上,在总计行接pipe之前数据继续通过行1570)。

我收到的完整的错误信息是:

数据透视表字段名称无效。 要创build数据透视表报表,您必须使用组织为具有标签列的列表的数据。 如果要更改数据透视表字段的名称,则必须为该字段键入一个新名称。 在CallSite.Target(Closure,CallSite,ComObject,Object,String,Object,Object)的System.Dynamic.ComRuntimeHelpers.CheckThrowException(Int32 hresult,ExcepInfo&excepInfo,UInt32 argErr,String消息)exception来源:Microsoft Office ExcelexceptionStackTrace: CallSite.Target中的System.Dynamic.UpdateDelegates.UpdateAndExecute5 [T0,T1,T2,T3,T4,TRet](CallSite站点,T0 arg0,T1 arg1,T2 arg2,T3 arg3,T4 arg4)(Closure,CallSite,PivotCache,对象,string,对象,对象)在System.Dynamic.UpdateDelegates.UpdateAndExecuteVoid5 [T0,T1,T2,T3,T4](CallSite站点,T0 arg0,T1 arg1,T2 arg2,T3 arg3,T4 arg4)在ReportRunner.ProduceUsage c:\ Projects \ ReportRunner \ ReportRunner \ ProduceUsage \ ProduceUsageRpt.cs中的ReportPunner.ProduceUsage.ProduceUsageRpt.GenerateProduceUsageRpt()的第3195行:.ProduceUsageRpt.AddPivotTable() 192行

3195行是这一个:

 pch.Add(XlPivotTableSourceType.xlDatabase, "A6:F94") .CreatePivotTable(_xlSheet.Cells[6, 1], "PivTab1", Type.Missing, Type.Missing); 

192行是对AddPivotTable()的调用

UPDATE

诸如此类的答案听起来很有希望,但是我不知道他的例子中的“Sheet1”是表单对象的名字还是表名。

这是我的代码:

 private Worksheet _xlSheet; private static readonly String ProduceUsageByMonthSheetName = "Produce Usage by Month"; _xlSheet.Name = ProduceUsageByMonthSheetName; 

…我尝试了所有我能想到的排列方式:

 //pch.Add(XlPivotTableSourceType.xlDatabase, _xlSheet.Range("A6:F94")) //"PivotData!A1:H" + rowIdx) //pch.Add(XlPivotTableSourceType.xlDatabase, _xlSheet!"A6:F94") //pch.Add(XlPivotTableSourceType.xlDatabase, ProduceUsageByMonthSheetName!"A6:F94") //pch.Add(XlPivotTableSourceType.xlDatabase, ProduceUsageByMonthSheetName.Range("A6:F94")) //pch.Add(XlPivotTableSourceType.xlDatabase, "Produce Usage by Month"!"A6:F94") pch.Add(XlPivotTableSourceType.xlDatabase, "Produce Usage by Month".Range("A6:F94")) .CreatePivotTable(_xlSheet.Cells[6, 1], "PivTab1", Type.Missing, Type.Missing); 

…但他们都没有编译:

您没有提供完全合格的范围地址。

 .Add(XlPivotTableSourceType.xlDatabase, "A6:F94") .CreatePivotTable(_xlSheet.Cells[6, 1], "PivTab1", Type.Missing, Type.Missing); 

"A6:F94"更改为包含Sheet1!"A6:F94"Sheet1.Range("A6:F94"")

它将纠正错误。Excel对象模型中的错误消息有点混乱。

UPADTE

你正在混合它。 如果工作表名称为“按月生产使用”,则不使用“按月生产使用”.Range(“A6:F94”)),则使用“按月生产使用!A6:F94”

小费; 在Excel中loggingmacros以查看语法是如何工作的。

是A7:A10合并? 您不能在数据透视表中合并单元格