使用C#错误读取动态Excel文件

时间:2013-12-28 16:27:00

标签: c# excel file-io

我正在尝试使用C#读取excel文件,并使用messagebox.Show()方法在消息框内显示工作表中的每个单元格。问题是我的excel文件有5行3列。这是我的excel表:http://postimg.org/image/xts9n1kif

它显示所有内容,直到“屋顶”,之后停止留下“光”和“铁”,但如果我填写stuff3列,它会完全正确地读取所有内容。就我而言,文件可能会改变。它可能包含更多列或行,其中一些可能为空。

知道为什么它不起作用吗?

这是我的代码:

using System;
using System.Windows.Forms;
using Excel = Microsoft.Office.Interop.Excel;

namespace ReadFromExcell
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.Load += new System.EventHandler(this.Form1_Load);
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Excel.Application xlApp = new Excel.Application();
            Excel.Workbook xlWorkbook = xlApp.Workbooks.Open("C:\\Users\\User1\\Desktop\\ItemDB.xlsx");
            Excel._Worksheet xlWorksheet = xlWorkbook.Sheets[1];
            Excel.Range xlRange = xlWorksheet.UsedRange;

            int rowCount = xlRange.Rows.Count;
            int colCount = xlRange.Columns.Count;


            for (int i = 1; i <= rowCount; i++)
            {
                for (int j = 1; j <= colCount; j++)
                {
                    MessageBox.Show(xlRange.Cells[i, j].Value2.ToString());
                }
            }
            //Close the excel file after reading it.
            xlWorkbook.Close();
        }



    }
}

2 个答案:

答案 0 :(得分:1)

您的代码中最有可能发生的事情是,当循环命中单元格 C4 (为空)时,xlRange.Cells[i, j].Value2变为 null

尝试在null引用上调用 ToString()方法(或任何其他方法)将导致 NullReferenceException

从...中更改循环内的代码

MessageBox.Show(xlRange.Cells[i, j].Value2.ToString());

......类似的事情:

MessageBox.Show( (xlRange.Cells[i, j].Value2 ?? "<no value>").ToString() );

?? operator 在这种情况下非常方便。如果表达式在左侧? (即xlRange.Cells[i, j].Value2)导致 null 值, ?? 运算符返回 ?? 而不是。


(单元格C4可能包含许多空格字符,在这种情况下,单元格的值不会是 null 。但是只有一些空白字符的单元格是一种相当不寻常的罕见发生。)

答案 1 :(得分:0)

现在试试这个..

        for (int i = 0; i <= rowCount-1; i++)
        {
            for (int j = 0; j <= xlRange.Rows[0].Columns.Count-1; j++)
            {
                MessageBox.Show(xlRange.Cells[i, j].Value2.ToString());
            }
        }