Le NPOI supportano il formato .xlsx?

La DLL NPOI riconosce il file .xlsx ?

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

L’NPOI supporterà quanto sopra?

Snippet di codice:

 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. La beta di NPOI 2.0 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("-------------------------------------------"); } } } 

Puoi leggere i file Excel con estensione .xls e .xlsx con NPOI, devi solo aggiungere il successivo nella sezione using

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

La cosa principale è quando apri il file, devi distinguere tra le estensioni in modo da utilizzare il componente appropriato e utilizzare un’interfaccia 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, devi solo leggerlo (in NPOI le righe e le colonne sono a base 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 la cella valur puoi usare il metodo .ToString () o la proprietà StringCellValue, ma fai attenzione che StringCellValue funzioni solo con celle stringa, con celle numero e data genera un'eccezione.

NPOI 2.0 supporta xlsx. È ansible scaricarlo da https://npoi.codeplex.com/releases/view/112932

Può essere che la libreria non abbia questa funzione quando sono state fornite le risposte originali, ma ora puoi gestire sia xls che xlsx usando lo stesso codice base senza verificare le estensioni dei file.

Il trucco è usare la class WorkbookFactory per caricare in modo trasparente entrambi i tipi di file. Questo funzionerà finché non utilizzi funzionalità speciali 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); }