NPOI を使用して Excel Tables 2010 xlsx を読み取り、データを DataTables にエクスポートしたいのですが、使い方がわかりません。ExcelをDatatableにエクスポートする方法を段階的に教えてもらえますか? NPOI.dll をダウンロードし、参照に追加しましたが、それ以上のことはわかりません...
質問する
33777 次
11 に答える
20
NPOI を使用して Excel ファイルを DataSet に変換するために使用できる最小限のコードは次のとおりです。
IWorkbook workbook;
using (var stream = new FileStream(excelFilePath, FileMode.Open, FileAccess.Read))
{
workbook = new HSSFWorkbook(stream); // XSSFWorkbook for XLSX
}
var sheet = workbook.GetSheetAt(0); // zero-based index of your target sheet
var dataTable = new DataTable(sheet.SheetName);
// write the header row
var headerRow = sheet.GetRow(0);
foreach (var headerCell in headerRow)
{
dataTable.Columns.Add(headerCell.ToString());
}
// write the rest
for(int i = 1; i< sheet.PhysicalNumberOfRows; i++)
{
var sheetRow = sheet.GetRow(i);
var dtRow = dataTable.NewRow();
dtRow.ItemArray = dataTable.Columns
.Cast<DataColumn>()
.Select(c => sheetRow.GetCell(c.Ordinal, MissingCellPolicy.CREATE_NULL_AS_BLANK).ToString())
.ToArray();
dataTable.Rows.Add(dtRow);
}
于 2015-11-03T08:54:28.847 に答える
2
@Saeb Amini コードを編集して、空白のセルを許可しました。
IWorkbook workbook;
using (FileStream stream = new FileStream(excelFilePath, FileMode.Open, FileAccess.Read))
{
workbook = new HSSFWorkbook(stream);
}
ISheet sheet = workbook.GetSheetAt(0);
DataTable dt = new DataTable(sheet.SheetName);
// write header row
IRow headerRow = sheet.GetRow(0);
foreach (ICell headerCell in headerRow)
{
dt.Columns.Add(headerCell.ToString());
}
// write the rest
int rowIndex = 0;
foreach (IRow row in sheet)
{
// skip header row
if (rowIndex++ == 0) continue;
// add row into datatable
var cells = new List<ICell>();
for (int i = 0; i < dt.Columns.Count; i++)
{
cells.Add(row.GetCell(i, MissingCellPolicy.CREATE_NULL_AS_BLANK));
}
// Columns formatted as DateTime will be printed as '01-Jul-2005',
// which can be converted to datetime in the SQL server.
// select cast('01-Jul-2005' as DateTime).
// In SQL Server we can convert DateTime to whatever string we want, for example
// select convert(nvarchar(255), cast('01-Jul-2005' as datetime), 112) will print '20050701'.
// http://www.sqlusa.com/bestpractices/datetimeconversion/
dt.Rows.Add(cells.Select(c => c.ToString()).ToArray());
// Datetimes also can be reformatted directly like this :
// dt.Rows.Add(cells.Select(c =>
// c.CellType == CellType.Numeric && DateUtil.IsCellDateFormatted(c)
// ? c.DateCellValue.ToString("yyyyMMdd")
// : c.ToString()
// ).ToArray());
}
//return dt;
于 2018-11-14T12:33:10.990 に答える
1
ここのダウンロード セクションのCodeplex Web サイトにはexample package
、C# の例のパックがあります。まだ試していない場合は、試してみてください。
これはその最も簡単な例です -
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
//.....
private void button1_Click(object sender, EventArgs e)
{
HSSFWorkbook hssfwb;
using (FileStream file = new FileStream(@"c:\test.xls", FileMode.Open, FileAccess.Read))
{
hssfwb= new HSSFWorkbook(file);
}
ISheet sheet = hssfwb.GetSheet("Arkusz1");
for (int row = 0; row <= sheet.LastRowNum; row++)
{
if (sheet.GetRow(row) != null) //null is when the row only contains empty cells
{
MessageBox.Show(string.Format("Row {0} = {1}", row, sheet.GetRow(row).GetCell(0).StringCellValue));
}
}
}
于 2012-11-11T17:13:33.253 に答える
1
Toxy プロジェクトで ToxySpreadsheet を試すことができます - https://github.com/nissl-lab/toxy。ToxySpreadsheet.ToDataSet() はあなたが望むものです。
于 2014-05-20T04:12:42.330 に答える