Created
March 4, 2017 11:28
-
-
Save VictorZhang2014/034591ae696dc51b36e6eacc668b78a4 to your computer and use it in GitHub Desktop.
NPOI imports Excel to DataTable and exports DataTable to Excel
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Data; | |
using System.IO; | |
using NPOI.HSSF.UserModel; | |
using NPOI.SS.UserModel; | |
using NPOI.XSSF.UserModel; | |
namespace MyNameSpace | |
{ | |
public static class NPOIHelper | |
{ | |
/// <summary> | |
/// 将excel导入到datatable | |
/// </summary> | |
/// <param name="filePath">excel路径</param> | |
/// <param name="isColumnName">第一行是否是列名</param> | |
/// <returns>返回datatable</returns> | |
public static Tuple<string, DataTable> ImportExcelToDataTable(string filePath, bool isColumnName) | |
{ | |
DataTable dataTable = null; | |
FileStream fs = null; | |
DataColumn column = null; | |
DataRow dataRow = null; | |
IWorkbook workbook = null; | |
ISheet sheet = null; | |
IRow row = null; | |
ICell cell = null; | |
int startRow = 0; | |
try | |
{ | |
using (fs = File.OpenRead(filePath)) | |
{ | |
// 2007版本 | |
if (filePath.IndexOf(".xlsx") > 0) | |
workbook = new XSSFWorkbook(fs); | |
// 2003版本 | |
else if (filePath.IndexOf(".xls") > 0) | |
workbook = new HSSFWorkbook(fs); | |
if (workbook != null) | |
{ | |
sheet = workbook.GetSheetAt(0);//读取第一个sheet,当然也可以循环读取每个sheet | |
dataTable = new DataTable(); | |
if (sheet != null) | |
{ | |
int rowCount = sheet.LastRowNum;//总行数 | |
if (rowCount > 0) | |
{ | |
IRow firstRow = sheet.GetRow(0);//第一行 | |
int cellCount = firstRow.LastCellNum;//列数 | |
//构建datatable的列 | |
if (isColumnName) | |
{ | |
startRow = 1;//如果第一行是列名,则从第二行开始读取 | |
for (int i = firstRow.FirstCellNum; i < cellCount; ++i) | |
{ | |
cell = firstRow.GetCell(i); | |
if (cell != null) | |
{ | |
if (cell.StringCellValue != null) | |
{ | |
column = new DataColumn(cell.StringCellValue); | |
dataTable.Columns.Add(column); | |
} | |
} | |
} | |
} | |
else | |
{ | |
for (int i = firstRow.FirstCellNum; i < cellCount; ++i) | |
{ | |
column = new DataColumn("column" + (i + 1)); | |
dataTable.Columns.Add(column); | |
} | |
} | |
//填充行 | |
for (int i = startRow; i <= rowCount; ++i) | |
{ | |
row = sheet.GetRow(i); | |
if (row == null) continue; | |
dataRow = dataTable.NewRow(); | |
for (int j = row.FirstCellNum; j < cellCount; ++j) | |
{ | |
cell = row.GetCell(j); | |
if (cell == null) | |
{ | |
dataRow[j] = ""; | |
} | |
else | |
{ | |
//CellType(Unknown = -1,Numeric = 0,String = 1,Formula = 2,Blank = 3,Boolean = 4,Error = 5,) | |
switch (cell.CellType) | |
{ | |
case CellType.Blank: | |
dataRow[j] = ""; | |
break; | |
case CellType.Numeric: | |
short format = cell.CellStyle.DataFormat; | |
//对时间格式(2015.12.5、2015/12/5、2015-12-5等)的处理 | |
if (format == 14 || format == 31 || format == 57 || format == 58) | |
dataRow[j] = cell.DateCellValue; | |
else | |
dataRow[j] = cell.NumericCellValue; | |
break; | |
case CellType.String: | |
dataRow[j] = cell.StringCellValue; | |
break; | |
} | |
} | |
} | |
dataTable.Rows.Add(dataRow); | |
} | |
} | |
} | |
} | |
} | |
return Tuple.Create<string, DataTable>("", dataTable); | |
} | |
catch (Exception ex) | |
{ | |
if (fs != null) | |
{ | |
fs.Close(); | |
} | |
return Tuple.Create<string, DataTable>(ex.Message, null); | |
} | |
} | |
public static Tuple<bool, string> ExportDataTableToExcel(DataTable dt, string saveTopath) | |
{ | |
bool result = false; | |
string message = ""; | |
IWorkbook workbook = null; | |
FileStream fs = null; | |
IRow row = null; | |
ISheet sheet = null; | |
ICell cell = null; | |
try | |
{ | |
if (dt != null && dt.Rows.Count > 0) | |
{ | |
workbook = new HSSFWorkbook(); | |
sheet = workbook.CreateSheet("Sheet0");//创建一个名称为Sheet0的表 | |
int rowCount = dt.Rows.Count;//行数 | |
int columnCount = dt.Columns.Count;//列数 | |
//设置列头 | |
row = sheet.CreateRow(0);//excel第一行设为列头 | |
for (int c = 0; c < columnCount; c++) | |
{ | |
cell = row.CreateCell(c); | |
cell.SetCellValue(dt.Columns[c].ColumnName); | |
} | |
//设置每行每列的单元格, | |
for (int i = 0; i < rowCount; i++) | |
{ | |
row = sheet.CreateRow(i + 1); | |
for (int j = 0; j < columnCount; j++) | |
{ | |
cell = row.CreateCell(j);//excel第二行开始写入数据 | |
cell.SetCellValue(dt.Rows[i][j].ToString()); | |
} | |
} | |
using (fs = File.OpenWrite(saveTopath)) | |
{ | |
workbook.Write(fs);//向打开的这个xls文件中写入数据 | |
result = true; | |
} | |
} | |
else | |
{ | |
message = "没有解析到数据!"; | |
} | |
return new Tuple<bool, string>(result, message); | |
} | |
catch (Exception ex) | |
{ | |
if (fs != null) | |
{ | |
fs.Close(); | |
} | |
return new Tuple<bool, string>(false, ex.Message); | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment