開發過程中各類報表導入導出防不勝防,網上也是各種解決方法層出不窮,比如Excel,CSV,Word,PDF,HTML等等。。。
網上各種導出插件也是層出不窮,NPOI,微軟Microsoft.Office.Interop.Excel,EPPlus等等,其實說起來,微軟自帶的家伙還是不錯的,但是必須要安裝office組件,這個不能忍,服務器上安裝一個office,呵呵噠!
今天給大家介紹的Excel導入導出用的是NPOI,這個組件還是蠻好用的,而且不依賴office組件。可以根據Excel格式進行自定義。根據平常用到的一些用法進行了封裝,旨在更方便的進行文檔操作。
我們在Ado.Net里面,DataTable用到的非常多;但是在EF里面,我們更多的是針對List進行操作,畢竟Linq的好處大家都是非常明白,下面通過幾個示例分別介紹Excel的導出:
DataTable導出Excel
/// <summary> /// DataTable導出到Excel /// </summary> /// <param name="dt"></param> /// <param name="filename">文件名</param> /// <param name="sheetname">表名</param> /// <param name="maxrow">超過行數新建表</param> /// <param name="isweb">是否web導出,默認是</param> /// <returns></returns> public static void DataTableToExcel(string filename, DataTable dt, string sheetname = "", int maxrow = 100, bool isweb = true) { if (dt == null || dt.Rows.Count < 1) return; if (filename.IndexOf(".xls", StringComparison.OrdinalIgnoreCase) < 0 && filename.IndexOf(".xlsx", StringComparison.OrdinalIgnoreCase) < 0) filename += ".xls"; IWorkbook workbook = new HSSFWorkbook(); if (sheetname.IsNullOrEmpty()) sheetname = filename; if (dt.Rows.Count < maxrow) WriteExcel(dt, 0, dt.Rows.Count - 1, workbook, sheetname); else { int page = dt.Rows.Count / maxrow; for (int i = 0; i < page; i++) { int start = i * maxrow; int end = (i * maxrow) + maxrow - 1; WriteExcel(dt, start, end, workbook, sheetname + i); } int lastPageItemCount = dt.Rows.Count % maxrow; WriteExcel(dt, dt.Rows.Count - lastPageItemCount, lastPageItemCount, workbook, sheetname + page); } using (MemoryStream ms = new MemoryStream()) { workbook.Write(ms); if (!isweb) { if (!filename.Contains("\\")) filename = Config.Config.GenerateFilePath("Office") + filename; if (!File.Exists(filename)) { using (FileStream fs = new FileStream(filename, FileMode.CreateNew)) { fs.Write(ms.ToArray(), 0, ms.ToArray().Length); fs.Close(); } } } else { //Web導出 HttpContext curContext = HttpContext.Current; curContext.Response.ContentType = "application/vnd.ms-excel"; curContext.Response.ContentEncoding = Encoding.UTF8; curContext.Response.Charset = ""; curContext.Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(filename, Encoding.UTF8)); curContext.Response.BinaryWrite(ms.GetBuffer()); curContext.Response.End(); } } } private static void WriteExcel(DataTable dt, int start, int end, IWorkbook book, string sheetName) { ISheet sheet = book.CreateSheet(sheetName); IRow header = sheet.CreateRow(0); for (int i = 0; i < dt.Columns.Count; i++) { ICell cell = header.CreateCell(i); string val = dt.Columns[i].Caption ?? dt.Columns[i].ColumnName; cell.SetCellValue(val); } int rowIndex = 1; for (int i = start; i <= end; i++) { DataRow dtRow = dt.Rows[i]; IRow excelRow = sheet.CreateRow(rowIndex++); for (int j = 0; j < dtRow.ItemArray.Length; j++) excelRow.CreateCell(j).SetCellValue(dtRow[j].ToString().Trim()); } }
調用方式:
public void Test() { Excel.DataTableToExcel("dt7.xls",dt,"人員名錄"); }
List導出Excel:
/// <summary> /// List導出Excel /// </summary> /// <typeparam name="T"></typeparam> /// <param name="filename">文件名稱和路徑</param> /// <param name="sheetname">表名稱</param> /// <param name="data">數據</param> /// <param name="title">表頭</param> /// <param name="isweb">是否web導出,默認是</param> public static void ListToExcel<T>(string filename, string sheetname, List<T> data, List<string> title = null, bool isweb = true) where T : new() { if (data.Count < 1) return; if (filename.IndexOf(".xls", StringComparison.OrdinalIgnoreCase) < 0 && filename.IndexOf(".xlsx", StringComparison.OrdinalIgnoreCase) < 0) filename += ".xls"; var wookbook = new HSSFWorkbook(); var sheet = wookbook.CreateSheet(sheetname); var entity = new T(); var propertys = entity.GetType().GetProperties(); if (title == null || title.Count < 1) { title = new List<string>(); foreach (PropertyInfo item in propertys) { if (!Ignore.IgnoreField(item.Name)) continue; title.Add(item.Name); } } var rowtitle = sheet.CreateRow(0); for (var i = 0; i < title.Count; i++) rowtitle.CreateCell(i).SetCellValue(title[i]); for (var i = 0; i < data.Count; i++) { var row = sheet.CreateRow(i + 1); //因為表頭名稱占了一行,所以加1 for (var j = 0; j < propertys.Length; j++) { if (!Ignore.IgnoreField(propertys[j].Name)) continue; var obj = propertys[j].GetValue(data[i], null); row.CreateCell(j).SetCellValue(obj.ToString().Trim()); } } if (!isweb) { if (!filename.Contains("\\")) filename = Config.Config.GenerateFilePath("Office") + filename; if (!File.Exists(filename)) { using (var fs = new FileStream(filename, FileMode.CreateNew)) { wookbook.Write(fs); } } } else { using (MemoryStream ms = new MemoryStream()) { wookbook.Write(ms); //Web導出 HttpContext curContext = HttpContext.Current; curContext.Response.ContentType = "application/vnd.ms-excel"; curContext.Response.ContentEncoding = Encoding.UTF8; curContext.Response.Charset = ""; curContext.Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(filename, Encoding.UTF8)); curContext.Response.BinaryWrite(ms.GetBuffer()); curContext.Response.End(); } } }
調用方法:
public void Test() { Excel.ListToExcel(path,"123",list,newList<string>(){"編號","名字","時間"}); }
OK,各位看官,這一期的文章Excel導出寫到這里喏,感謝大家的支持,您的支持是我的動力!
下一期給大家帶來的是常用的Excel導入,敬請期待!!!
