注意:我有一个相关问题here,但是已完全更改了代码并仍然获得相同的错误信息,即" 数据透视表字段名称无效。若要创建数据透视表,您必须使用组织为带有标记列的列表的数据。如果要更改数据透视表字段的名称,则必须为该字段键入新名称。"
正如您在下面的代码中看到的那样,数据透视表字段被赋予了名称(第一个"描述"然后"几个月"):
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,错误的msg有误导性或名称要求很奇怪。
当代码工作并生成工作表时,它应该如下所示,使用" Month"和"描述"数据透视表字段:
以下是我生成的工作表当前的外观,但没有数据透视表或其字段(这是在注释掉数据透视表代码时生成的内容):
问题的可能原因可能与错误消息的第二部分有关,即" ...您必须使用组织为带有标记列的列表的数据。"但正如您在上面的屏幕截图中看到的那样,是从
(实际上,数据在Totals行接管之前继续通过第1570行。)
我收到的完整错误信息是:
数据透视表字段名称无效。若要创建数据透视表,您必须使用组织为带有标记列的列表的数据。如果要更改数据透视表字段的名称,则必须为该字段键入新名称。 例外来源:Microsoft Office Excel 异常StackTrace:在System.Dynamic.ComRuntimeHelpers.CheckThrowException(Int32 hresult,ExcepInfo& excepInfo,UInt32 argErr,String message) 在CallSite.Target(Closure,CallSite,ComObject,Object,String,Object,Object) 在System.Dynamic.UpdateDelegates.UpdateAndExecute5 [T0,T1,T2,T3,T4,TRet](CallSite站点,T0 arg0,T1 arg1,T2 arg2,T3 arg3,T4 arg4) 在CallSite.Target(Closure,CallSite,PivotCache,Object,String,Object,Object) 在System.Dynamic.UpdateDelegates.UpdateAndExecuteVoid5 [T0,T1,T2,T3,T4](CallSite站点,T0 arg0,T1 arg1, T2 arg2,T3 arg3,T4 arg4) at C:\ Projects \ ReportRunner \ ReportRunner中的ReportRunner.ProduceUsage.ProduceUsageRpt.AddPivotTable() \ ProduceUsage \ ProduceUsageRpt.cs:第3195行 at C:\ Projects \ ReportRunner中的ReportRunner.ProduceUsage.ProduceUsageRpt.GenerateProduceUsageRpt() \ ReportRunner \ ProduceUsage \ ProduceUsageRpt.cs:第192行
第3195行就是这个:
pch.Add(XlPivotTableSourceType.xlDatabase, "A6:F94")
.CreatePivotTable(_xlSheet.Cells[6, 1], "PivTab1", Type.Missing, Type.Missing);
第192行是对AddPivotTable()的调用
cyboashu的回答听起来很有希望,但我不知道" 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);
......但他们都无法编译:
答案 0 :(得分:1)
IS A7:A10合并?您不能在数据透视表数据中合并单元格
答案 1 :(得分:1)
您没有提供完整的合格范围地址。
.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-Object Model中的错误消息有点令人困惑。
UPADTE
你正在搅拌它。如果工作表名称是按月生成使用情况"然后 而不是"按月生成用法" .Range(" A6:F94"))使用"按月生成用法!A6:F94"
提示;在Excel中记录一个宏,看看语法是如何工作的。