【问题标题】:Invalid index exception with Excel InteropExcel 互操作的无效索引异常
【发布时间】:2021-08-31 06:16:48
【问题描述】:

我用 C# winform 获取数据。

private void ReleaseExcelObject(object obj)
        {
            try
            {
                if (obj != null)
                {
                    Marshal.ReleaseComObject(obj);
                    obj = null;
                }
            }
            catch (Exception ex)
            {
                obj = null;
                throw ex;
            }
            
        }
        private void buttonOpen_Click(object sender, EventArgs e)
        {
            Microsoft.Office.Interop.Excel.Application application = null;
            Workbook workBook = null;

            int tempNum = 0;
            try
            {
                OpenFileDialog dlg = new OpenFileDialog();
                if (dlg.ShowDialog() != DialogResult.OK)
                    return;

                application = new Microsoft.Office.Interop.Excel.Application();
                application.Visible = true;
                workBook = application.Workbooks.Open(dlg.FileName);

                Worksheet newWorkSheet = workBook.Worksheets.Add(After: workBook.Worksheets.Item[workBook.Worksheets.Count]);
               

                int newSheetRow = 0;

                Dictionary<int, string> upData = new Dictionary<int, string>();
                for (int sheetIndex = 1; sheetIndex<workBook.Worksheets.Count; sheetIndex++)
                {

                    for (int row = 1; row < workBook.Worksheets[sheetIndex].UsedRange.Rows.Count; row++)
                    {
                        upData.Add(row, null);

                        for (int col = 1; col < workBook.Worksheets[sheetIndex].UsedRange.Columns.Count; col++)
                        {
                            tempNum++;

                            if (workBook.Worksheets[sheetIndex].Cells[col, row] != null)
                            {
                                string cellData = workBook.Worksheets[sheetIndex].Cells[col, row].value;
                                string[] datas = cellData.Split(' ');
                                string dataName = null;

                                for (int k = 1; k < datas.Length; k++)
                                {
                                    dataName += datas[k];
                                }
                                string icd11 = datas[0];

                                newWorkSheet.Cells[newSheetRow,0] = icd11;
                                newWorkSheet.Cells[newSheetRow,1] = dataName;
                                newWorkSheet.Cells[newSheetRow,2] = upData[col - 1];

                                upData[col] = dataName;


                                continue;
                            }
                        }
                    }
                }
            }
            catch (Exception exc)
            {
                MessageBox.Show(tempNum + exc.Message);   
            }
            finally
            {
                ReleaseExcelObject(workBook);
                ReleaseExcelObject(application);
            }
        }

发生错误的部分是 MessageBox.Show(workBook.Sheets[0].ToString()); 这部分。
并强制workBookSheet.getitem("hardCording").
这样做会导致单元格直接数据访问部分出错。

我想知道如何查询和插入excel数据。

错误是Invalid index. (Exception from HRESULT: 0x8002000B (DISP_E_BADINDEX))

Excel 数据:

编辑工作表[0] 工作表[0] 无法

我不懂VBA

如何实现

excel树示例

【问题讨论】:

  • 文档给出了一个例子,你看过了吗?您可以从该示例中得出或必须得出 (?) 结论,即第一张纸的索引为 1。请参阅:docs.microsoft.com/en-us/office/vba/api/excel.workbook.sheets
  • @Luuk 我更改开始工作表索引 =1 工作表对象是只读的??也许我理解正确
  • Try/Catch 让你很难找到代码出错的地方。你可以禁用它,看看你的错误就在这里:i.stack.imgur.com/ZwHlx.png
  • 但是我确实在您的问题中看到了一些其他错误,而且您要达到的目标还不清楚。但是看到你的回答你解决了你自己的问题......
  • @LuukThankyou COM EXCEPTION 太可怕了哈哈

标签: c# excel winforms office-interop excel-interop


【解决方案1】:
  Worksheet newWorkSheet = workBook.Worksheets.Add(After: workBook.Worksheets.Item[workBook.Worksheets.Count]);
               

                int newSheetRow = 1;

                Dictionary<int, string> upData = new Dictionary<int, string>();
            

                for (int sheetIndex = 1; sheetIndex<workBook.Worksheets.Count; sheetIndex++)
                {
                    int rowMax=workBook.Worksheets[sheetIndex].UsedRange.Rows.Count;
                    int colMax = workBook.Worksheets[sheetIndex].UsedRange.Columns.Count;

                    for (int i = 0; i < workBook.Worksheets[sheetIndex].UsedRange.Rows.Count; i++)
                        upData.Add(i, "000000");

                    for (int row = 1; row < workBook.Worksheets[sheetIndex].UsedRange.Rows.Count; row++)
                    {
                        

                        for (int col = 1; col < workBook.Worksheets[sheetIndex].UsedRange.Columns.Count; col++)
                        {
                            tempRow = row;
                            tempCol = col;

                            if (workBook.Worksheets[sheetIndex].Cells[row, col] != null)
                            {
                                Range cell = workBook.Worksheets[sheetIndex].Cells[row, col];
                                string cellData = cell.Value;
                                if (cellData != null)
                                {
                                    string[] datas = cellData.Split(null);
                                    string dataName = null;

                                    for (int k = 1; k < datas.Length; k++)
                                    {
                                        dataName += datas[k];
                                    }
                                    string icd11 = datas[0];
                                    
                                    Range newCellData1 = newWorkSheet.Cells[newSheetRow, 1];
                                    newCellData1.Value = icd11;
                                    Range newCellData2 = newWorkSheet.Cells[newSheetRow, 2];
                                    newCellData2.Value = dataName;

                                    Range newCellData3 = newWorkSheet.Cells[newSheetRow, 3];
                                    newCellData3.Value = upData[col - 1];
                                    upData[col] = datas[0];
                                    newSheetRow++;
                                }

                                continue;
                            }
                        }
                    }
                    upData.Clear();
                }
            }

excel 调试在 Visual Studio 中不起作用 我修复了代码中的错误。 细胞。值且这些子项不可见

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 2010-10-02
    • 1970-01-01
    • 2013-05-26
    相关资源
    最近更新 更多