.NET NPOI导出Excel详解
http://www.cnblogs.com/yinrq/p/5590970.html
?
?
.NET NPOI導(dǎo)出Excel詳解
NPOI,顧名思義,就是POI的.NET版本。那POI又是什么呢?POI是一套用Java寫成的庫,能夠幫助開發(fā)者在沒有安裝微軟Office的情況下讀寫Office的文件。
支持的文件格式包括xls, doc, ppt等。
官方網(wǎng)站:http://npoi.codeplex.com/
nuget直接獲取使用
一、NPOI生成Excel
//創(chuàng)建工作薄var workbook = new HSSFWorkbook();//創(chuàng)建表var table = workbook.CreateSheet("joye.net");//模擬20行20列數(shù)據(jù)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文件,如沒有則創(chuàng)建,如存在則在創(chuàng)建是不要打開該文件using (var fs = File.OpenWrite(@"c:/joye.net.xls")){workbook.Write(fs); //向打開的這個(gè)xls文件中寫入mySheet表并保存。Console.WriteLine("生成成功");}二、NPOI讀取Excel
using (var fs = File.OpenRead(@"c:/joye.net.xls")) {//把xls文件中的數(shù)據(jù)寫入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++){ //讀取當(dāng)前行數(shù)據(jù)var row = sheet.GetRow(j);if (row != null){for (var k = 0; k <= row.LastCellNum; k++){ //當(dāng)前表格var cell = row.GetCell(k);if (cell != null){Console.Write(cell.ToString() + " ");}}}Console.WriteLine();}}}讀出的結(jié)果
?三、簡單學(xué)習(xí)
?學(xué)習(xí)代碼 ?代碼調(diào)用四、NPOI導(dǎo)出Excel 65536問題
public static HSSFWorkbook BuildWorkbook(DataTable dt){var book = new HSSFWorkbook(); ISheet sheet = book.CreateSheet("Sheet1");//Data Rowsfor (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導(dǎo)出Excel超過65536會報(bào)異常,原來是由于NPOI這個(gè)動態(tài)庫導(dǎo)致的,然后看了下版本,發(fā)現(xiàn)是1.2.5。然后百度了下,發(fā)現(xiàn)這個(gè)版本的NPOI只支持office2003,二office2003最多支持65536行
解決方式:
1、只是在插入數(shù)據(jù)的時(shí)候,加個(gè)判斷,如果數(shù)據(jù)條數(shù)大于65536時(shí),就在創(chuàng)建一個(gè)sheet
//65536判斷處理public static HSSFWorkbook BuildWorkbook(DataTable dt){var book = new HSSFWorkbook();ISheet sheet1 = book.CreateSheet("Sheet1");ISheet sheet2 = book.CreateSheet("Sheet2");//填充數(shù)據(jù)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 Rowsfor (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開發(fā)中導(dǎo)出Excel
public static void ExportExcel(DataTable dt, string fileName = ""){//生成ExcelIWorkbook 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文件有時(shí)間再看
代碼下載:https://yunpan.cn/cRBVnTCSchz7k (提取碼:779e)?
+ 關(guān)注
轉(zhuǎn)載于:https://www.cnblogs.com/lacey/p/6634004.html
總結(jié)
以上是生活随笔為你收集整理的.NET NPOI导出Excel详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到一堆小蛇预示着什么意思
- 下一篇: ASP.NET Core 源码学习之 L