0

在检索数据并将其存储在通用列表中之后,我得到了这段代码来使用 Excel 互操作代码填充 Excel 电子表格:

. . .
InitializeExcelObjects();
_currentTopRow = DATA_STARTING_ROW;
foreach (PriceVarianceData _pvd in _pvdList)
{
    AddData(_pvd);
    _currentTopRow = _currentTopRow + 1;
}
. . .

private void AddData(PriceVarianceData _pvd)
{
    var UnitCell = (Excel.Range)_xlSheet.Cells[_currentTopRow, 0];
    UnitCell.Value2 = _pvd.Unit;
    var ShortNameCell = (Excel.Range)_xlSheet.Cells[_currentTopRow, 1];
    ShortNameCell.Value2 = _pvd.ShortName;
    . . .
}

它在 AddData() 方法的第一行崩溃(尝试分配给 UnitCell),并带有“ System.Runtime.InteropServices.COMException 未处理... StackTrace: at System.RuntimeType.ForwardCallToInvokeMember(String memberName, BindingFlags flags, Object ……

我不知道为什么会这样;我在尝试添加数据之前调用它:

private void InitializeExcelObjects()
{
    _xlApp = new Excel.Application
    {
        SheetsInNewWorkbook = 1,
        StandardFont = "Calibri",
        StandardFontSize = 11
    };
    Thread.Sleep(2000);
    //var apartmentSt8 = Thread.CurrentThread.GetApartmentState(); <= STA, as it should be

    _xlBook = _xlApp.Workbooks.Add(Type.Missing);
    _xlSheets = _xlBook.Worksheets;
    _xlSheet = (Excel.Worksheet)_xlSheets.Item[1];
}

完整的例外是:

System.Runtime.InteropServices.COMException 未处理 HResult=-2146827284 Message=Exception from HRESULT: 0x800A03EC Source="" ErrorCode=-2146827284 StackTrace: at System.RuntimeType.ForwardCallToInvokeMember(String memberName, BindingFlags flags, Object target, Int32[] aWrapperTypes , MessageData& msgData) 在 Microsoft.Office.Interop.Excel.Range.get__Default(Object RowIndex, Object ColumnIndex) 在 Pivotal.FormMain.AddData(PriceVarianceData _pvd) 在 c:\Projects\Pivotal\Pivotal\Form1.cs:line 155 C:\Projects\Pivotal\Pivotal\Form1.cs 中的 Pivotal.FormMain.GenerateAndSaveSpreadsheetFile():c:\Projects\Pivotal\Pivotal\Form1.cs 中 Pivotal.FormMain.buttonRun_Click(Object sender, EventArgs e) 的第 134 行: System.Windows.Forms.Control.OnClick(EventArgs e) 处的第 77 行。Windows.Forms.Button.OnClick(EventArgs e) 在 System.Windows.Forms.Button.OnMouseUp(MouseEventArgs 事件) 在 System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) 在 System.Windows。 Forms.Control.WndProc(Message& m) 在 System.Windows.Forms.ButtonBase.WndProc(Message& m) 在 System.Windows.Forms.Button.WndProc(Message& m) 在 System.Windows.Forms.Control.ControlNativeWindow.OnMessage( Message& m) 在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 在 System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 在 System.Windows.Forms.UnsafeNativeMethods System.Windows.Forms.Application.ComponentManager.System.Windows.Forms 处的 .DispatchMessageW(MSG& msg)。UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData) at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) 在 System.Windows.Forms.Application.Run(Form mainForm) at Pivotal.Program.Main() in c:\Projects\Pivotal\Pivotal\Program.cs:line 19 at System.AppDomain._nExecuteAssembly(RuntimeAssembly 程序集, String[] args) 在 System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 在 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 在 System.Threading.ThreadHelper.ThreadStart_Context(Object state) 在 System .线程。ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback回调,对象状态)在 System.Threading.ThreadHelper.ThreadStart() InnerException:对象状态)在 System.Threading.ThreadHelper.ThreadStart() InnerException:对象状态)在 System.Threading.ThreadHelper.ThreadStart() InnerException:

这里可能是什么问题?我看了这个,但似乎没有任何建议适用于这种情况。

更新

今天早上我注意到我有大约 40 个 Excel 进程正在运行,所以想知道这是否可能是问题(我猜它们没有被关闭/处理)并将它们全部杀死。不过,我仍然得到了相同的结果 - 并且 Excel 进程也一直存在(正如可以预料的那样,突然停止执行会发生什么)。

4

1 回答 1

3

在您的AddData()方法的第一行中,您尝试使用Cells基于 0 的索引访问全部)。

要解决此问题,您必须在您的情况下做两件事:

  1. 确保它_currentTopRow是一个基于 1 的索引(即最小有效值为 1)
  2. 改变你的AddData()方法如下:

    private void AddData(PriceVarianceData _pvd)
    {
        // Note changed column index (from 0 to 1)
        var UnitCell = (Excel.Range)_xlSheet.Cells[_currentTopRow, 1];
        UnitCell.Value2 = _pvd.Unit;
    
        // Note changed column index (from 1 to 2)
        var ShortNameCell = (Excel.Range)_xlSheet.Cells[_currentTopRow, 2];
    
        ShortNameCell.Value2 = _pvd.ShortName;
        . . .
    }
    
于 2016-06-21T15:13:59.237 回答