http://www.cnblogs.com/yinrq/p/5590970.html
.NET NPOI導出Excel詳解
NPOI,顧名思義,就是POI的.NET版本。那POI又是什么呢?POI是一套用Java寫成的庫,能夠幫助開發者在沒有安裝微軟Office的情況下讀寫Office的文件。
支持的文件格式包括xls, doc, ppt等。
官方網站:http://npoi.codeplex.com/
nuget直接獲取使用

一、NPOI生成Excel
//創建工作薄
var workbook = new HSSFWorkbook();
//創建表
var table = workbook.CreateSheet("joye.net");
//模擬20行20列數據
for (var i = 0; i < 20; i++)
{
var row = table.CreateRow(i);
for (int j = 0; j < 20; j++)
{
var cell = row.CreateCell(j);
cell.SetCellValue(j);
}
}
//打開xls文件,如沒有則創建,如存在則在創建是不要打開該文件
using (var fs = File.OpenWrite(@"c:/joye.net.xls"))
{
workbook.Write(fs); //向打開的這個xls文件中寫入mySheet表並保存。
Console.WriteLine("生成成功");
}
二、NPOI讀取Excel
using (var fs = File.OpenRead(@"c:/joye.net.xls"))
{
//把xls文件中的數據寫入workbook1中
var workbook1 = new HSSFWorkbook(fs);
for (var i = 0; i < workbook1.NumberOfSheets; i++)
{
var sheet = workbook1.GetSheetAt(i);
for (var j = 0; j <= sheet.LastRowNum; j++)
{
//讀取當前行數據
var row = sheet.GetRow(j);
if (row != null)
{
for (var k = 0; k <= row.LastCellNum; k++)
{ //當前表格
var cell = row.GetCell(k);
if (cell != null)
{
Console.Write(cell.ToString() + " ");
}
}
}
Console.WriteLine();
}
}
}
讀出的結果

三、簡單學習
學習代碼
代碼調用
四、NPOI導出Excel 65536問題
public static HSSFWorkbook BuildWorkbook(DataTable dt)
{
var book = new HSSFWorkbook();
ISheet sheet = book.CreateSheet("Sheet1");
//Data Rows
for (int i = 0; i < dt.Rows.Count; i++)
{
IRow drow = sheet.CreateRow(i);
for (int j = 0; j < dt.Columns.Count; j++)
{
ICell cell = drow.CreateCell(j, CellType.String);
cell.SetCellValue(dt.Rows[i][j].ToString());
}
}
//自動列寬
for (int i = 0; i <= dt.Columns.Count; i++)
sheet.AutoSizeColumn(i, true);
return book;
}
NPOI導出Excel超過65536會報異常,原來是由於NPOI這個動態庫導致的,然后看了下版本,發現是1.2.5。然后百度了下,發現這個版本的NPOI只支持office2003,二office2003最多支持65536行
解決方式:
1、只是在插入數據的時候,加個判斷,如果數據條數大於65536時,就在創建一個sheet
//65536判斷處理
public static HSSFWorkbook BuildWorkbook(DataTable dt)
{
var book = new HSSFWorkbook();
ISheet sheet1 = book.CreateSheet("Sheet1");
ISheet sheet2 = book.CreateSheet("Sheet2");
//填充數據
for (int i = 0; i < dt.Rows.Count; i++)
{
if (i < 65536)
{
IRow drow = sheet1.CreateRow(i);
for (int j = 0; j < dt.Columns.Count; j++)
{
ICell cell = drow.CreateCell(j, CellType.String);
cell.SetCellValue(dt.Rows[i][j].ToString());
}
}
if (i >= 65536)
{
IRow drow = sheet2.CreateRow(i - 65536);
for (int j = 0; j < dt.Columns.Count; j++)
{
ICell cell = drow.CreateCell(j, CellType.String);
cell.SetCellValue(dt.Rows[i][j].ToString());
}
}
}
//自動列寬
for (int i = 0; i <= dt.Columns.Count; i++)
{
sheet1.AutoSizeColumn(i, true);
sheet2.AutoSizeColumn(i, true);
}
return book;
}

2、考慮使用高版本Office,使用用對象支持高版本的NPOI
//高版本
public static XSSFWorkbook BuildWorkbook(DataTable dt)
{
var book = new XSSFWorkbook();
ISheet sheet = book.CreateSheet("Sheet1");
//Data Rows
for (int i = 0; i < dt.Rows.Count; i++)
{
IRow drow = sheet.CreateRow(i);
for (int j = 0; j < dt.Columns.Count; j++)
{
ICell cell = drow.CreateCell(j, CellType.String);
cell.SetCellValue(dt.Rows[i][j].ToString());
}
}
//自動列寬
for (int i = 0; i <= dt.Columns.Count; i++)
sheet.AutoSizeColumn(i, true);
return book;
}

五、web開發中導出Excel
public static void ExportExcel(DataTable dt, string fileName = "")
{
//生成Excel
IWorkbook book = BuildWorkbook(dt);
//web 下載
if (fileName == "")
fileName = string.Format("{0:yyyyMMddHHmmssffff}", DateTime.Now);
fileName = fileName.Trim();
string ext = Path.GetExtension(fileName);
if (ext.ToLower() == ".xls" || ext.ToLower() == ".xlsx")
fileName = fileName.Replace(ext, string.Empty);
HttpResponse httpResponse = HttpContext.Current.Response;
httpResponse.Clear();
httpResponse.Buffer = true;
httpResponse.Charset = Encoding.UTF8.BodyName;
httpResponse.AppendHeader("Content-Disposition", "attachment;filename=" + fileName + ".xls");
httpResponse.ContentEncoding = Encoding.UTF8;
httpResponse.ContentType = "application/vnd.ms-excel; charset=UTF-8";
book.Write(httpResponse.OutputStream);
httpResponse.End();
}
基於.xls模板生成Excel文件有時間再看
代碼下載:https://yunpan.cn/cRBVnTCSchz7k (提取碼:779e)

