1

我试图让 NPOI 与 ASP.NET (C#) 一起工作,我想读取一个 excel 文件并将其放入数据集中。这是我尝试的代码:

public static DataTable getExcelData(string FileName, string strSheetName)
{
    DataTable dt = new DataTable();
    HSSFWorkbook hssfworkbook;
    using (FileStream file = new FileStream(FileName, FileMode.Open, FileAccess.Read))
    {
        hssfworkbook = new HSSFWorkbook(file);
    }

    ISheet sheet = hssfworkbook.GetSheet(strSheetName);
    System.Collections.IEnumerator rows = sheet.GetRowEnumerator();

    while (rows.MoveNext())
    {
        IRow row = (HSSFRow)rows.Current;

        if (dt.Columns.Count == 0)
        {
            for (int j = 0; j < row.LastCellNum; j++)
            {
                dt.Columns.Add(row.GetCell(j).ToString());
            }

            continue;
        }

        DataRow dr = dt.NewRow();
        for (int i = 0; i < row.LastCellNum; i++)
        {
            ICell cell = row.GetCell(i);

            if (cell == null)
            {
                dr[i] = null;
            }
            else
            {
                dr[i] = cell.ToString();
            }
        }
        dt.Rows.Add(dr);
    }

    return dt;
}

我得到的错误是

+       $exception  {"Object reference not set to an instance of an object."}   System.Exception {System.NullReferenceException}

奇怪的是,这实际上适用于我拥有的 2 个 excel 文件,但是当我放入第三个文件时,它会因该错误而崩溃。

4

2 回答 2

2

尝试使用这个:

for (int j = row.FirstCellNum; j < row.LastCellNum; j++)

for (int i = row.FirstCellNum; i < row.LastCellNum; i++)

代替:

for (int j = 0; j < row.LastCellNum; j++)

for (int i = 0; i < row.LastCellNum; i++)

此外,请确保在第一行的单元格为时管理这种情况null

if (dt.Columns.Count == 0)
{
    int empty = 0;
    for (int j = row.FirstCellNum; j < row.LastCellNum; j++)
    {
        ICell cell = row.GetCell(j);
        if (cell == null)
        {
            dt.Columns.Add(String.Format("emptyColumnName_{0}", empty++));
        }
        else
        {
            dt.Columns.Add(row.GetCell(j).ToString());
        }
    }
    continue;
}

如果您总是想从第一个工作表中读取(可能是为了摆脱第二个方法参数,工作表名称,这也是您错误的原因),您可以使用:

// rest of the method's code
ISheet sheet = hssfworkbook.GetSheetAt(0);
if (sheet == null)
    return dt;
var rows = sheet.GetRowEnumerator();
// rest of the method's code
于 2013-07-12T13:26:30.177 回答
2

null如果未找到 strSheetName,则返回:

ISheet sheet = hssfworkbook.GetSheet(strSheetName);

尝试:

for( int iSheet = 0; iSheet < hssfworkbook.NumberOfSheets; ++iSheet )
{
    ISheet sheet = hssfworkbook.GetSheetAt(iSheet); // could cast to HSSFSheet
    String strSheetNameActual = sheet.SheetName;
}

然后弄清楚您要如何比较或strSheetNamestrSheetNameActual处理哪些工作表以及如何处理。

于 2013-07-12T13:58:11.203 回答