c#:访问Excel工作表中的单元格时抛出NullReferenceException

mzillmmw  于 2023-05-01  发布在  C#
关注(0)|答案(2)|浏览(684)

所以我一直在尝试编写一个控制台应用程序(。Net Core)从Excel文件中读取数据,但我有点卡住了。
我一直在尝试让这个代码样例工作:https://www.csharp-console-examples.com/general/reading-excel-file-in-c-console-application/
我需要显式地使用(Range)cell,因为当示例代码试图直接访问单元格时,Visual Studio会抛出错误。
当尝试加载工作表和使用的范围m_ObjectToDataMap = null时,工作表和范围都是m_ObjectToDataMap = null。使用excelRange访问行。行因系统而失败。NullReferenceException:'对象引用未设置为对象的示例。”

static void Main(string[] args)
{
    //Create COM Objects.
    Application excelApp = new Application();

    if (excelApp == null)
    {
        Console.WriteLine("Excel is not installed!!");
        return;
    }

    Workbook excelBook = excelApp.Workbooks.Open(@"D:\test.xlsx");
    _Worksheet excelSheet = (_Worksheet)excelBook.Sheets[1];
    Range excelRange = excelSheet.UsedRange;

    foreach (Range row in excelRange.Rows)  // Here is the NullReference Error
    {
        // create new line
        Console.Write("\r\n");
        foreach (Range col in excelRange.Columns)
        {
            Range cell = (Range)excelRange.Cells[row, col];
            // write the console
            if (excelRange.Cells[row, col] != null && cell.Value2 != null)
                Console.Write(cell.Value2.ToString() + "\t");
        }
    }
    //after reading, relaase the excel project
    excelApp.Quit();
    System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);
    Console.ReadLine();
}

我尝试了很多不同的代码,循环遍历所有的工作表或按其名称调用工作表,但它总是以工作表和范围加载错误和NullReferenceException结束。
任何帮助将不胜感激。

uidvcgyl

uidvcgyl1#

我认为你使用的代码参考是中的控制台应用程序。NET Framework.我使用了您引用的here中的代码,并将其放入。NET Framework控制台应用程序,它工作得很完美。我把同样的代码放进了a。NET Core控制台应用程序,它不工作。所以你可能需要换成。NET Framework或您可以使用另一个Excel库。我使用NPOI,你可以按照一个例子here或做一些更多的谷歌搜索找到其他例子。可能还有更多的库,比如EPPlus。NET Core用于解析Excel,但我没有使用或研究过任何其他的。

kwvwclae

kwvwclae2#

我使用下面的代码经过广泛的测试,它似乎工作。NET Framework以及。NET核心:

using Excel = Microsoft.Office.Interop.Excel;

string svalue = getStrFromValue((worksheet.Cells[iRow, j] as Excel.Range).Value

string getStrFromValue(dynamic value)
{
    if (value != null)
        return (string)(value.ToString()).Trim();
    else
        return "";
}

请注意,Excel中有两个值。范围-对象:价值与价值2对于Date-Value,'Value'返回Date-String,而'Value 2'返回数字。Interop真的很酷,但非常bug,同时也没有很好的文档记录。.

相关问题