2013-04-18 73 views
4

NPOI DLL会识别.xlsx文件吗?NPOI是否支持.xlsx格式?

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

NPOI是否支持上述?

代码片断:

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); 
} 
+1

是的,我经常导入NPOI的'.xlsx'文件 - 绝对没有问题 - 只要去代码吧! –

+0

但是当我尝试使用.xlsx加载文件时,它无法导入? – Ganeshja

+0

根据[本博客文章](http://www.zachhunter.com/2010/05/read-xlsx-data-for-npoi/),NPOI支持版本1.6以上的'.xlsx'。该博客文章还显示了NPOI –

回答

10

下载它是的。 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("-------------------------------------------"); 
    } 
} 
} 
+0

该OP说“目前我使用NPOI 1.2.5版本”,而不是版本2.0 ... – user3454439

13

您可以用NPOI .xls和.XLSX扩展读取Excel文件,你只需要添加下一个在使用部分

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

的主要的是,在打开文件时,必须让你用此时,相应componente延伸部之间进行区分,并使用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仅适用于字符串单元格,数字和日期单元格会引发异常。

1

当提供原始答案时,库可能不具备此功能,但现在您可以使用相同的代码库处理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); 
}