为什么试图创build数据透视表(Excel Interop)失败?

根据我在这里find的代码,我试图创build一个像这样的数据透视表:

var range = _xlSheet.Range[_xlSheet.Cells[6, 1], _xlSheet.Cells[6, _grandTotalsColumn]]; ListObject tbl = WriteToExcelTable(_xlSheet, "tbl", "A6"); var pch = _xlBook.PivotCaches(); pch.Add(XlPivotTableSourceType.xlDatabase, "Produce Usage by Month!A6:F94") .CreatePivotTable(tbl, "PivTab1", Type.Missing, Type.Missing); . . . public ListObject WriteToExcelTable(Worksheet WSheet, string TableName, string CellStr = "A1", bool ClearSheetContent = false) { Range range; if (ClearSheetContent) WSheet.Cells.ClearContents(); // clear sheet content // get upper left corner of range defined by CellStr range = (Range)WSheet.get_Range(CellStr).Cells[1, 1]; // Write table to range [ - don't have the helperfunc code commented this out ] //HelperFunc.WriteTableToExcelSheet(WSheet, this._tbl, range.Address); // derive range for table, +1 row for table header // [doesn't compile, so commented out] rang //range.get_Resize(this.RowCount + 1, this.ColumnCount); range = range.get_Resize(102, 5); // faking it to see what happens // add ListObject to sheet ListObject tbl = WSheet.ListObjects.AddEx( XlListObjectSourceType.xlSrcRange, range, XlListObjectHasHeaders: XlYesNoGuess.xlYes); // set name of excel table tbl.Name = TableName; // return excel table (ListObject) return tbl; } 

…但它在这条线上崩溃:

 pch.Add(XlPivotTableSourceType.xlDatabase, "Produce Usage by Month!A6:F94") .CreatePivotTable(tbl, "PivTab1", Type.Missing, Type.Missing); 

…有:

 System.ArgumentException was caught HResult=-2147024809 Message=The parameter is incorrect. (Exception from HRESULT: 0x80070057 (E_INVALIDARG)) Source="" StackTrace: at System.RuntimeType.ForwardCallToInvokeMember(String memberName, BindingFlags flags, Object target, Int32[] aWrapperTypes, MessageData& msgData) at Microsoft.Office.Interop.Excel.PivotCache.CreatePivotTable(Object TableDestination, Object TableName, Object ReadData, Object DefaultVersion) at ReportRunner.ProduceUsage.ProduceUsageRpt.AddPivotTable() in c:\Projects\ReportRunner\ReportRunner\ProduceUsage\ProduceUsageRpt.cs:line 3312 at ReportRunner.ProduceUsage.ProduceUsageRpt.GenerateProduceUsageRpt() in c:\Projects\ReportRunner\ReportRunner\ProduceUsage\ProduceUsageRpt.cs:line 180 InnerException: 

我的方法有什么问题? 请注意,我必须从借用方法(WriteToExcelTable())中注释掉两行,因为它们不会为我编译。

UPDATE

我也试过这个select:

 private void AddPivotTable() { int rowIdx = 42; // try 42 for now; adjust as/if necessary var pch = _xlBook.PivotCaches(); pch.Add(XlPivotTableSourceType.xlDatabase, "PivotData!A6:D" + rowIdx) .CreatePivotTable(_xlSheet.Cells[6, 1], "PivTab1", Type.Missing, Type.Missing); . . . 

…在最后一行上显示的是:

 System.Runtime.InteropServices.COMException was caught HelpLink=C:\Program Files (x86)\Microsoft Office\Office12\1033\XLMAIN11.CHM HResult=-2146827284 Message=Cannot open PivotTable source file 'C:\Users\cshannon\Documents\PivotData'. Source=Microsoft Office Excel ErrorCode=-2146827284 StackTrace: at System.Dynamic.ComRuntimeHelpers.CheckThrowException(Int32 hresult, ExcepInfo& excepInfo, UInt32 argErr, String message) at CallSite.Target(Closure , CallSite , ComObject , Object , String , Object , Object ) at System.Dynamic.UpdateDelegates.UpdateAndExecute5[T0,T1,T2,T3,T4,TRet](CallSite site, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4) at CallSite.Target(Closure , CallSite , PivotCache , Object , String , Object , Object ) at System.Dynamic.UpdateDelegates.UpdateAndExecuteVoid5[T0,T1,T2,T3,T4](CallSite site, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4) at ReportRunner.ProduceUsage.ProduceUsageRpt.AddPivotTable() in c:\Projects\ReportRunner\ReportRunner\ProduceUsage\ProduceUsageRpt.cs:line 3172 at ReportRunner.ProduceUsage.ProduceUsageRpt.GenerateProduceUsageRpt() in c:\Projects\ReportRunner\ReportRunner\ProduceUsage\ProduceUsageRpt.cs:line 180 InnerException: 

更新2

即使删除了“PivotData!”,这显然是指从中读取数据的文件,因此该行现在是:

 pch.Add(XlPivotTableSourceType.xlDatabase, "A6:D" + rowIdx) 

…它仍然崩溃,现在:

 System.Runtime.InteropServices.COMException was caught HelpLink=C:\Program Files (x86)\Microsoft Office\Office12\1033\XLMAIN11.CHM HResult=-2146827284 Message=Cannot change part of a merged cell. Source=Microsoft Office Excel ErrorCode=-2146827284 StackTrace: at System.Dynamic.ComRuntimeHelpers.CheckThrowException(Int32 hresult, ExcepInfo& excepInfo, UInt32 argErr, String message) at CallSite.Target(Closure , CallSite , ComObject , Object , String , Object , Object ) at System.Dynamic.UpdateDelegates.UpdateAndExecute5[T0,T1,T2,T3,T4,TRet](CallSite site, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4) at CallSite.Target(Closure , CallSite , PivotCache , Object , String , Object , Object ) at System.Dynamic.UpdateDelegates.UpdateAndExecuteVoid5[T0,T1,T2,T3,T4](CallSite site, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4) at ReportRunner.ProduceUsage.ProduceUsageRpt.AddPivotTable() in c:\Projects\ReportRunner\ReportRunner\ProduceUsage\ProduceUsageRpt.cs:line 3174 at ReportRunner.ProduceUsage.ProduceUsageRpt.GenerateProduceUsageRpt() in c:\Projects\ReportRunner\ReportRunner\ProduceUsage\ProduceUsageRpt.cs:line 180 InnerException: 

更新3

因为exception是指合并单元格的问题,所以我添加了这个:

 var pivotData = _xlSheet.Range["A6:D42"]; pivotData.UnMerge(); 

…但它仍然失败(现在使用“ PivotFields方法的数据透视表类失败exception来源:Microsoft Office ExcelexceptionStackTrace:在System.RuntimeType.ForwardCallToInvokeMember(stringmemberName,BindingFlags标志,对象目标,Int32 [] aWrapperTypes,MessageData&msgData) “)。

注意:我得到“ 您要在[Book3] Produce Usage by Month? ”(两次)之前replace目标单元格的内容

没有看到你的工作簿的细节,很难诊断你列出的一些问题。 生成数据透视表的基本方法是:

 Range sourceData = _xlBook.Worksheets["Produce Usage by Month"].Range["A6:F94"]; PivotCache pc = pch.Create(XlPivotTableSourceType.xlDatabase, sourceData); PivotTable pvt = pc.CreatePivotTable(sheet2.Range["A1"], "SummaryPivot"); pvt.PivotFields("Col1").Orientation = XlPivotFieldOrientation.xlRowField; pvt.PivotFields("Col2").Orientation = XlPivotFieldOrientation.xlColumnField; pvt.AddDataField(pvt.PivotFields("Col3"), "Sum of Col3", XlConsolidationFunction.xlSum); 

它看起来像你的代码是不是真的明确的一些对象。 例如Produce Usage by Month!A6:F94对于Excel Produce Usage by Month!A6:F94意味着什么(可能由VBA解释),但是我认为互操作库需要更多的显式声明对象。 在强types中,这将是我列出的sourceData对象。 sheet2因此是一个Excel.Worksheet对象。

关于某些警告(如覆盖警告),如果将Excel应用程序对象的DisplayAlerts属性更改为false,则会处理其中的许多警告。