NPOI-讀取excel進DataTable
2023.03.31更新: 發現如果有空行,可能會被讀取到, 因而多做防呆, 修改如下:
public static DataTable getexcel(String fileName)
{
DataTable dt = new DataTable();
try
{
IWorkbook workbook = null; //新建IWorkbook對象
FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read);
if (fileName.IndexOf(".xlsx") > 0) // 2007版本
{
workbook = new HSSFWorkbook(fileStream); //xlsx數據讀入workbook
}
else if (fileName.IndexOf(".xls") > 0) // 2003版本
{
workbook = new HSSFWorkbook(fileStream); //xls數據讀入workbook
}
ISheet sheet = workbook.GetSheetAt(0); //獲取第一個工作表
IRow row;// = sheet.GetRow(0); //新建當前工作表行數據
// MessageBox.Show(sheet.LastRowNum.ToString());
row = sheet.GetRow(0); //row讀入頭部
if (row != null)
{
for (int m = 0; m < row.LastCellNum; m++) //表頭
{
string cellValue = row.GetCell(m).ToString(); //獲取i行j列數據
//Console.WriteLine(cellValue);
dt.Columns.Add(cellValue);
}
}
for (int i = 1; i <= sheet.LastRowNum; i++) //對工作表每一行
{
System.Data.DataRow dr = dt.NewRow();
row = sheet.GetRow(i); //row讀入第i行數據
if (row != null)
{
if (row.LastCellNum > 0) // 2023.03.28 有時空行好像會造成多了空白列,因而加此判斷
{
for (int j = 0; j < row.LastCellNum; j++) //對工作表每一列
{
object currCell = row.GetCell(j);
if (currCell != null)
{
string cellValue = currCell.ToString(); //獲取i行j列數據
//Console.WriteLine(cellValue);
dr[j] = cellValue;
}
}
dt.Rows.Add(dr);
}
}
}
//Console.ReadLine();//這個有問題,讀不出來,反正它只是debug用的,所以取消它
fileStream.Close();
return dt;
}
finally
{ }
}
---------------------------------------------------------------------------
為何要寫這個常用的功能? 因為昨天debug一個既有的讀取excel功能時, 發現當有些選填欄位如果不填,最後讀取出的資料是順序錯亂的。
後來找一陣子, 測試後發現用下面方式寫可以處理好: (ref. https://ithelp.ithome.com.tw/articles/10212249)
/// <summary>
/// 讀Excel.
/// </summary>
/// <param name="fileName"></param>
/// <returns></returns>
public static DataTable getexcel(String fileName)
{
DataTable dt = new DataTable();
try
{
IWorkbook workbook = null; //新建IWorkbook對象
FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read);
if (fileName.IndexOf(".xlsx") > 0) // 2007版本
{
workbook = new XSSFWorkbook(fileStream); //xlsx數據讀入workbook
}
else if (fileName.IndexOf(".xls") > 0) // 2003版本
{
workbook = new HSSFWorkbook(fileStream); //xls數據讀入workbook
}
ISheet sheet = workbook.GetSheetAt(0); //獲取第一個工作表
IRow row;// = sheet.GetRow(0); //新建當前工作表行數據
// MessageBox.Show(sheet.LastRowNum.ToString());
row = sheet.GetRow(0); //row讀入頭部
if (row != null)
{
for (int m = 0; m < row.LastCellNum; m++) //表頭
{
string cellValue = row.GetCell(m).ToString(); //獲取i行j列數據
//Console.WriteLine(cellValue);
dt.Columns.Add(cellValue);
}
}
for (int i = 1; i <= sheet.LastRowNum; i++) //對工作表每一行
{
System.Data.DataRow dr = dt.NewRow();
row = sheet.GetRow(i); //row讀入第i行數據
if (row != null)
{
for (int j = 0; j < row.LastCellNum; j++) //對工作表每一列
{
string cellValue = row.GetCell(j).ToString(); //獲取i行j列數據
//Console.WriteLine(cellValue);
dr[j] = cellValue;
}
}
dt.Rows.Add(dr);
}
//Console.ReadLine();//這個有問題,讀不出來,反正它只是debug用的,所以取消它
fileStream.Close();
return dt;
}
catch(Exception ex)
{
throw ex;
}
return dt;
}
留言
張貼留言