为什么我的数据透视表字段名称被视为无效和/或我的数据被视为未组织为带有标记列的列表?

时间:2016-06-27 17:53:18

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

注意:我有一个相关问题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"和"描述"数据透视表字段:

enter image description here

以下是我生成的工作表当前的外观,但没有数据透视表或其字段(这是在注释掉数据透视表代码时生成的内容):

enter image description here

问题的可能原因可能与错误消息的第二部分有关,即" ...您必须使用组织为带有标记列的列表的数据。"但正如您在上面的屏幕截图中看到的那样,是从数据(这是标题行的第一列),并且继续通过列F和第94行继续测试数据:

enter image description here

(实际上,数据在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);

......但他们都无法编译:

2 个答案:

答案 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中记录一个宏,看看语法是如何工作的。