【问题标题】:Having a problem in reading an Excel file读取 Excel 文件时出现问题
【发布时间】:2020-10-16 09:01:59
【问题描述】:

我的项目是打开 excel 文件并在 C# 中逐行读取,但我的 excel 参考文件存在一些空行

例如第一行和第二行不是空的(没有单元格),但第三、第四和第五行的所有单元格都是

空然后下一行的单元格不为空等。现在当我的代码在 for just Reads 中运行时

只有文件的前几行是满的,一旦到达第一行完全是空的

退出循环 读取文件还没有结束。为什么会出现这种情况?如何解决?

    private void button1_Click(object sender, EventArgs e)
        {

           
            Excel.Application xlApp;
            Excel.Workbook xlWorkBook;
            Excel.Worksheet xlWorkSheet;
            Excel.Range range;

            string str;
            string table = null;
            int rCnt;
            int cCnt;
            int rw = 0;
            int cl = 0;

            xlApp = new Excel.Application();
            xlWorkBook = xlApp.Workbooks.Open(@"C:\Users\mostafaheydarsana\Desktop\mp.xlsx", 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
            xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);

            range = xlWorkSheet.UsedRange;
            rw = range.Rows.Count;
            cl = range.Columns.Count;
           
            string s = "'nbn";
            
            string table_row = null;

            int io = 0;
            
            string new_str = null;
            
            string question_field = null;
            
            int peymaeshrowaforaddquestioha;

            try
            {
                StreamWriter sw = new StreamWriter("C:\\Users\\user1\\Desktop\\Test.txt");

                for (rCnt = 1; rCnt <= rw; rCnt++)
                {
                    
                    if (range.Cells[rCnt, 1].Value != null)
                    {
                        sw.WriteLine("question is ( " + question_field + s[0] + "," + new_str + "');", io++);
                        
                        MessageBox.Show("rCnt is " + rCnt + "quesstion_field is insert in file ***" + question_field + "***");

                        question_field = null;
                       
                        new_str = null;

                        new_str += s[0] + range.Cells[rCnt, 1].Value2.ToString() + s[0] + "," + s[0] + range.Cells[rCnt, 2].Value2.ToString() + s[0] + "," + s[0] + range.Cells[rCnt, 3].Value2.ToString() + s[0];

                        question_field += range.Cells[rCnt, 4].Value2.ToString();

                    }
                    else if(range.Cells[rCnt, 1].Value == null)
                    {

                        question_field += range.Cells[rCnt, 4].Value2.ToString();

                        MessageBox.Show("rCnt is " + rCnt + "quesstion_field is ***" + question_field + "***");

                        peymaeshrowaforaddquestioha = rCnt + 1;

                    }
                }
                
                sw.Close();
            }

            catch (Exception ec)
            {
                Console.WriteLine("Exception: " + ec.Message);
            }
            finally
            {
                Console.WriteLine("Executing finally block.");
            }

            xlWorkBook.Close(true, null, null);
            
            xlApp.Quit();

            Marshal.ReleaseComObject(xlWorkSheet);
            Marshal.ReleaseComObject(xlWorkBook);
            Marshal.ReleaseComObject(xlApp);


        }

【问题讨论】:

  • 好吧,如果一行完全是“空的”,那么当你到达 if 语句时……if (range.Cells[rCnt, 1].Value != null)… 那么这将是false,因为该行上的所有单元格都是空的。因此,else 部分将执行……else if(range.Cells[rCnt, 1].Value == null)……这将是true 并执行下一行代码……question_field += range.Cells[rCnt, 4].Value2.ToString();……这将抛出一个null 异常,因为range.Cells[rCnt, 4].Value2 将是null. 是您在catch 部分没有看到此异常的输出?
  • @mostafa,你的问题解决了吗?请检查我的答案是否适合您。

标签: c# excel visual-studio office-interop


【解决方案1】:

在使用 MS OpenXML 库创建 Excel 输出进行了很多努力之后,我在 NuGet 中发现了 ClosedXML 包,结果证明这是一种更好、更简单的方法。说不定也能解决你的 Excel 阅读问题。

【讨论】:

    【解决方案2】:

    根据我的测试,问题是当您尝试访问空单元格时,您将收到异常“无法对空引用执行运行时绑定”。

    根据参考Cannot perform runtime binding on a null reference - Empty Excel Cells,可以尝试修改以下代码。

    改变

     question_field += range.Cells[rCnt, 4].Value2.ToString();
    

    进入:

      question_field +=Convert.ToString(range.Cells[rCnt, 4].Value2);
    

    它对我有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-12
      • 2020-04-06
      • 2016-07-02
      • 1970-01-01
      • 1970-01-01
      • 2023-01-18
      相关资源
      最近更新 更多