【问题标题】:Does NPOI have support to .xlsx format?NPOI 是否支持 .xlsx 格式?
【发布时间】:2013-04-18 10:02:58
【问题描述】:

NPOI DLL 会识别.xlsx 文件吗?

目前我正在为 Microsoft Excel 97-2003 使用 NPOI 1.2.5 版本的 DLL,但我还需要访问扩展名为 .xlsx 的 Excel 表。

NPOI 会支持上述内容吗?

代码sn-p:

static void Main(string[] args) {
    XSSFWorkbook xssfwb;

    using(FileStream file=new FileStream(
            @"C:\Users\347702\Desktop\Hello.xlsx",
            FileMode.Open, FileAccess.Read)) {
        xssfwb=new XSSFWorkbook(file);
    }

    ISheet sheet=xssfwb.GetSheet("sheet1");
    sheet.GetRow(1048576);
    Console.WriteLine(sheet.GetRow(1048576).GetCell(0).StringCellValue);
}

【问题讨论】:

  • 是的,我经常使用 NPOI 导入 .xlsx 文件 - 绝对没问题 - 去编码吧!
  • 但是当我尝试使用 .xlsx 加载文件时,它无法导入???
  • 根据this blog post,NPOI 从 1.6 版本开始支持.xlsx。该博客文章还显示了 NPOI 早期版本的“解决方法”
  • 是的,但是在上面的代码中 m 试图加载 .xlsx 文件并试图获取最后一行的值,最后一行:1,048,576,所以我在第 1048576 行提到了一个名为“Test”的示例值列:A.. 但它在 console.writeline 上引发以下错误:对象引用未设置为对象的实例
  • 所以你使用第0列(getcell(0)。在那种情况下,我猜行从0到...?1048575!

标签: c# excel npoi


【解决方案1】:

您可以读取带有NPOI的.xls和.xlsx扩展名的Excel文件,您只需在使用部分添加下一个

using NPOI.HSSF.UserModel;
using NPOI.HPSF;
using NPOI.POIFS.FileSystem;
using NPOI.XSSF.UserModel;
using NPOI.SS.UserModel;

主要是在您打开文件时,您必须区分扩展名以便使用适当的组件,并使用 ISheet 接口以便您可以独立于文件扩展名引用工作表

//We get the file extension
fileExt = Path.GetExtension(fileName);

//Declare the sheet interface
ISheet sheet;

//Get the Excel file according to the extension
if (fileExt.ToLower() == ".xls")
{
    //Use the NPOI Excel xls object
    HSSFWorkbook hssfwb;
    using (FileStream file = new FileStream(fileName, FileMode.Open, FileAccess.Read))
    {
        hssfwb = new HSSFWorkbook(file);
    }

    //Assign the sheet
    sheet = hssfwb.GetSheet(sheetName);
}
else //.xlsx extension
{
    //Use the NPOI Excel xlsx object
    XSSFWorkbook hssfwb;
    using (FileStream file = new FileStream(fileName, FileMode.Open, FileAccess.Read))
    {
        hssfwb = new XSSFWorkbook(file);
    }

    //Assign the sheet
    sheet = hssfwb.GetSheet(sheetName);
}

一旦你有了 excel 对象,你只需要阅读它(在 NPOI 中,行和列都是从零开始的)

//Loop through the rows until we find an empty one
for (int row = 0; row <= sheet.LastRowNum; row++)
{
    //Get the cell value
    string cellValue = sheet.GetRow(row).GetCell(0).ToString().Trim(); //In the method GetCell you specify the column number you want to read, in the method GetRow you spacify the row
    string cellValue2 = sheet.GetRow(row).GetCell(0).StringCellValue.Trim();
}

要读取单元格值,您可以使用 .ToString() 方法或 StringCellValue 属性,但请注意 StringCellValue 仅适用于字符串单元格,对于数字和日期单元格会引发异常。

【讨论】:

    【解决方案2】:

    是的。 NPOI 2.0 测试版有效。下面是一个示例代码,可帮助您入门:

    class Program
    {
    static XSSFWorkbook hssfworkbook;
    static DataSet dataSet1 = new DataSet();
    
    static void Main(string[] args)
    {
        InitializeWorkbook(@"E:\Docs\HoursWidget_RTM.xlsx");
        xlsxToDT();
    
        DisplayData(dataSet1.Tables[0]);
    
        Console.ReadLine();
    }
    
    static void InitializeWorkbook(string path)
    {
        using (FileStream file = new FileStream(path, FileMode.Open, FileAccess.Read))
        {
            hssfworkbook = new XSSFWorkbook(file);
        }
    }
    
    static void xlsxToDT()
    {
        DataTable dt = new DataTable();
        ISheet sheet = hssfworkbook.GetSheetAt(1);
        IRow headerRow = sheet.GetRow(0);
        IEnumerator rows = sheet.GetRowEnumerator();
    
        int colCount = headerRow.LastCellNum;
        int rowCount = sheet.LastRowNum;
    
        for (int c = 0; c < colCount; c++)
        {
    
            dt.Columns.Add(headerRow.GetCell(c).ToString());
        }
    
        bool skipReadingHeaderRow = rows.MoveNext();
        while (rows.MoveNext())
        {
            IRow row = (XSSFRow)rows.Current;
            DataRow dr = dt.NewRow();
    
            for (int i = 0; i < colCount; i++)
            {
                ICell cell = row.GetCell(i);
    
                if (cell != null)
                {
                    dr[i] = cell.ToString();
                }
            }
            dt.Rows.Add(dr);
        }
    
        hssfworkbook = null;
        sheet = null;
        dataSet1.Tables.Add(dt);
    }
    
    static void DisplayData(DataTable table)
    {
        foreach (DataRow row in table.Rows)
        {
            foreach (DataColumn col in table.Columns)
            {
                Console.WriteLine("{0} = {1}", col.ColumnName, row[col]);
            }
            Console.WriteLine("-------------------------------------------");
        }
    }
    }
    

    【讨论】:

    • OP 说“目前我使用的是 NPOI 1.2.5 版本”而不是 2.0 版本...
    【解决方案3】:

    可能是在提供原始答案时库没有此功能,但现在您可以使用相同的代码库同时处理 xls 和 xlsx 而无需检查文件扩展名。

    诀窍是使用 WorkbookFactory 类透明地加载这两种类型的文件。只要您不使用特定于任一版本的特殊功能,这将起作用。

    using (FileStream fileStream = File.OpenRead(fullPathToExcelFile)) //fullPathToExcelFile can hold either a xls or xlsx, we don't care
    {
       IWorkbook workbook = WorkbookFactory.Create(fileStream);
       ISheet worksheet = workbook.GetSheet("SampleSheet");
    
       //Now read from the worksheet anyway you like
       var value = worksheet.GetRow(1).GetCell(1);
    }
    

    【讨论】:

      【解决方案4】:

      NPOI 2.0 支持 xlsx。可以从https://npoi.codeplex.com/releases/view/112932下载

      【讨论】:

        猜你喜欢
        • 2013-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多