Il NPOI ha supporto al formato .xlsx?

Il file NPOI DLL riconoscerà il file .xlsx ?

Attualmente sto usando DLL di versione NPOI 1.2.5 per Microsoft Excel 97-2003, ma devo accedere anche ai fogli Excel di estensione .xlsx .

Will NPOI sostenere quanto sopra?

Codice snippet:

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

Sì, lo fa. NPOI 2.0 beta funziona. Ecco un codice di esempio per iniziare:

 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("-------------------------------------------"); } } } 

È ansible leggere i file di Excel in estensioni .xls e .xlsx con NPOI, è sufficiente aggiungere il successivo nella sezione usando

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

La cosa principale è nel momento in cui si apre il file, è necessario distinguere tra le estensioni in modo da utilizzare il componente appropriato e utilizzare un'interface ISheet in modo da poter fare riferimento al foglio indipendentemente dall'estensione del file

 //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); } 

Una volta che hai l'object excel è sufficiente leggerlo (nelle righe e colonne NPOI sono basate sullo zero)

 //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(); } 

Per leggere il valore della cella, è ansible utilizzare il metodo .ToString () o la properties; StringCellValue, ma attenzione che StringCellValue funziona solo con le celle di string, con le celle di numero e di data che genera un'exception.

NPOI 2.0 support xlsx. Puoi scaricarlo da https://npoi.codeplex.com/releases/view/112932

Può essere che la libreria non abbia avuto questa funzionalità quando le risposte originali sono state fornite, ma ora è ansible gestire sia xls che xlsx utilizzando la stessa base di codice senza verificare le estensioni di file.

Il trucco è usare la class WorkbookFactory per caricare in modo trasparente entrambi i tipi di file. Ciò functionrà finché non si utilizza funzioni specifiche specifiche per entrambe le versioni.

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