public class NPOIHelper
{
protected static void CreateHeader(HSSFSheet excelSheet, DataTable table)
{
HSSFRow rowHeader = excelSheet.CreateRow(0);
foreach (DataColumn column in table.Columns)
rowHeader.CreateCell(column.Ordinal).SetCellValue(column.Caption);
}
/// <summary>
/// 插入数据行
/// </summary>
protected static void InsertRow(DataTable dtSource, HSSFWorkbook excelWorkbook)
{
int rowCount = 0;
int sheetCount = 1;
HSSFSheet newsheet = null;
//循环数据源导出数据集
newsheet = excelWorkbook.CreateSheet("Sheet" + sheetCount); //创建第一个sheet
CreateHeader(newsheet, dtSource);//加载sheet的头信息
foreach (DataRow dr in dtSource.Rows) //循环DataTable里面的数据行
{
rowCount++;
//超出50000条数据 创建新的工作簿
if (rowCount % 50000 == 0) //超过50000行数据就新建一个sheet
{
rowCount = 1;
sheetCount++;
newsheet = excelWorkbook.CreateSheet("Sheet" + sheetCount); //新建sheet
CreateHeader(newsheet, dtSource);//新建sheet的头信息
}
foreach (DataColumn column in dtSource.Columns)
{
HSSFRow row = newsheet.CreateRow(rowCount);
row.CreateCell(column.Ordinal).SetCellValue(dtSource.Rows[rowCount][column.Ordinal].ToString());
}
}
}
/// <summary>
/// 将DataTable转换成MemoryStream,用于导出到Excel
/// </summary>
/// <param name="table"></param>
/// <returns></returns>
public static MemoryStream RenderToExcel(DataTable table)
{
HSSFWorkbook hssfworkbook = new HSSFWorkbook();
InsertRow(table, hssfworkbook);
using (MemoryStream ms = new MemoryStream())
{
hssfworkbook.Write(ms);
ms.Flush();
ms.Position = 0;
return ms;
}
}
/// <summary>
/// 用于Excel数据导入到数据库
/// </summary>
/// <param name="excelFileStream"></param>
/// <returns></returns>
public static DataTable RenderFromExcel(string strFileName)
{
DataTable table = new DataTable();
HSSFWorkbook workbook = null;
using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read))
{
workbook = new HSSFWorkbook(file);
}
HSSFSheet sheet = workbook.GetSheetAt(0);
HSSFRow headerRow = sheet.GetRow(0);
int cellCount = headerRow.LastCellNum;
int rowCount = sheet.LastRowNum;
for (int i = headerRow.FirstCellNum; i < cellCount; i++)
{
DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue);
table.Columns.Add(column);
}
for (int i = (sheet.FirstRowNum + 1); i <= rowCount; i++)
{
HSSFRow row = sheet.GetRow(i);
DataRow dataRow = table.NewRow();
if (row != null)
{
for (int j = row.FirstCellNum; j < cellCount; j++)
{
if (row.GetCell(j) != null)
dataRow[j] = row.GetCell(j);
}
}
table.Rows.Add(dataRow);
}
return table;
}
}
导出
/// <summary>
/// 导出到Excel
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btnExport_Click(object sender, EventArgs e)
{
try
{
string filename = "Barcode.xls";
Response.ContentType = "application/vnd.ms-excel";
Response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}", filename));
Response.Clear();
DataTable dt = new DataTable();
dt.Columns.Add("Barcode");
dt.Columns.Add("Product");
dt.Columns.Add("Score");
var data = context.BarcodeLists;
if (context.BarcodeLists.FirstOrDefault() != null)
{
foreach (BarcodeList item in data)
{
dt.Rows.Add(new object[] { item.Barcode, item.ProductList.ProductID, item.Score });
}
}
MemoryStream ms = NPOIHelper.RenderToExcel(dt);
Response.BinaryWrite(ms.GetBuffer());
Response.End();
}
catch (Exception ex)
{
Prj.showMessage(this, ex.Message);
Prj.Log.Error("Error", ex);
}
}
导入部分代码
DataTable dt = NPOIHelper.RenderFromExcel(HttpRuntime.AppDomainAppPath + path);
拿到了DataTable就可以插入数据库了