NPOI DLLは.xlsx
ファイルを認識しますか?
現在、Microsoft Excel97-2003用のNPOI1.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);
}
はい、そうです。 NPOI2.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("-------------------------------------------");
}
}
}
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は文字列セルでのみ機能し、数値セルと日付セルでは例外がスローされることに注意してください。
元の回答が提供されたときにライブラリにこの機能がなかった可能性がありますが、ファイル拡張子をチェックせずに同じコードベースを使用して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);
}
NPOI2.0はxlsxをサポートします。あなたはそれをダウンロードすることができます https://npoi.codeplex.com/releases/view/112932