DataTable导出excel
程序员文章站
2022-06-02 21:35:08
...
网上有很多关于导出的例子,这里讲一个利用NPOI导出excel的方法,使用此插件后即使客户端或服务器不装office也能成功导出
配套的dll参考附件,此版本比较早,和网上的方法实现有些小差异。但也都是小修小改。
其实两个方法总体一样,一个是在流文件生成后保存到本地,一个是流文件生成后返回给客户端
这里要说明一下如果是以流文件返回到客户端了,需要用
window.location.href = '../../report/ExcelToClient'; //后台生成流文件的url请求地址
如果要使用.ajax异步获取,那么会收到乱码。原因是.ajax只针对文本信息存放,而response后的是二进制流无法处理。所以直接用href就搞定了
参考:https://www.cnblogs.com/lunawzh/p/7966214.html
附件是NPOI最新的2.3.0.0版本
配套的dll参考附件,此版本比较早,和网上的方法实现有些小差异。但也都是小修小改。
#region 导出报表文件到服务器 /// <summary> /// 导出报表文件到服务器 /// </summary> /// <param name="dt">数据源</param> /// <param name="fileName">文件名</param> /// <param name="sheetName">sheet的名字</param> /// <param name="path">要导出的文件路径</param> /// <param name="type">1=xls 2=xlxs</param> /// <returns>成功返回true</returns> public static bool ExportExcel(DataTable dt,string fileName,string sheetName,string path,string type = "1") { try { IWorkbook workbook; string name_suffix = string.Empty; //创建一个工作簿 if (type == "1") //保存为.xls { workbook = new HSSFWorkbook(); name_suffix = ".xls"; } else //保存为.xlsx { workbook = new XSSFWorkbook(); name_suffix = ".xlsx"; } //创建一个 sheet 表 ISheet sheet = workbook.CreateSheet(sheetName); //创建一行 IRow rowH = sheet.CreateRow(0); //创建一个单元格 ICell cell = null; //创建单元格样式 ICellStyle cellStyle = workbook.CreateCellStyle(); //创建格式 IDataFormat dataFormat = workbook.CreateDataFormat(); //设置为文本格式,也可以为 text,即 dataFormat.GetFormat("text"); cellStyle.DataFormat = dataFormat.GetFormat("@"); //设置列名 foreach (DataColumn col in dt.Columns) { //创建单元格并设置单元格内容 rowH.CreateCell(col.Ordinal).SetCellValue(col.Caption); } //写入数据 for (int i = 0; i < dt.Rows.Count; i++) { //跳过第一行,第一行为列名 IRow row = sheet.CreateRow(i + 1); for (int j = 0; j < dt.Columns.Count; j++) { cell = row.CreateCell(j); cell.SetCellValue(dt.Rows[i][j].ToString()); cell.CellStyle = cellStyle; } } //判断文件夹是否存在 if (Directory.Exists(path) == false)//如果不存 //在就创建file文件夹 { Directory.CreateDirectory(path); } //string path = HttpContext.Current.Server.MapPath("Export/"); 获取当前请求路径的地址,存在路径下,已改为参数传入 //设置新建文件路径及名称 string savePath = path + fileName + name_suffix; //创建文件 FileStream file = new FileStream(savePath, FileMode.CreateNew, FileAccess.Write); //创建一个 IO 流 MemoryStream ms = new MemoryStream(); //写入到流 workbook.Write(ms); //转换为字节数组 byte[] bytes = ms.ToArray(); file.Write(bytes, 0, bytes.Length); file.Flush(); //还可以调用下面的方法,把流输出到浏览器下载 //OutputClient(bytes); //释放资源 bytes = null; ms.Close(); ms.Dispose(); file.Close(); file.Dispose(); workbook.Dispose(); sheet = null; workbook = null; return true; } catch (Exception ex) { return false; } } #endregion #region 已文件流形式将表数据返回给浏览器下载 /// <summary> /// 已文件流形式将表数据返回给浏览器下载 /// </summary> /// <param name="dt">数据源</param> /// <param name="fileName">文件名</param> /// <param name="sheetName">sheet的名字</param> /// <param name="path">要导出的文件路径</param> /// <param name="type">1=xls 2=xlxs</param> /// <returns>成功返回true</returns> public static void ExportExcelToClientWeb(DataTable dt, string fileName, string sheetName, string path,string type = "1") { try { //定义工作表变量 IWorkbook workbook; //定义后缀名 string name_suffix = string.Empty; //创建一个工作簿 if (type == "1") //保存为.xls { workbook = new HSSFWorkbook(); name_suffix = ".xls"; } else //保存为.xlsx { workbook = new XSSFWorkbook(); name_suffix = ".xlsx"; } //创建一个 sheet 表 ISheet sheet = workbook.CreateSheet(sheetName); //创建一行 IRow rowH = sheet.CreateRow(0); //创建一个单元格 ICell cell = null; //创建单元格样式 ICellStyle cellStyle = workbook.CreateCellStyle(); //创建格式 IDataFormat dataFormat = workbook.CreateDataFormat(); //设置为文本格式,也可以为 text,即 dataFormat.GetFormat("text"); cellStyle.DataFormat = dataFormat.GetFormat("@"); //设置列名 foreach (DataColumn col in dt.Columns) { //创建单元格并设置单元格内容 rowH.CreateCell(col.Ordinal).SetCellValue(col.Caption); } //写入数据 for (int i = 0; i < dt.Rows.Count; i++) { //跳过第一行,第一行为列名 IRow row = sheet.CreateRow(i + 1); for (int j = 0; j < dt.Columns.Count; j++) { cell = row.CreateCell(j); cell.SetCellValue(dt.Rows[i][j].ToString()); cell.CellStyle = cellStyle; } } //判断文件夹是否存在 if (Directory.Exists(path) == false)//如果不存 //在就创建file文件夹 { Directory.CreateDirectory(path); } //string path = HttpContext.Current.Server.MapPath("Export/"); 获取当前请求路径的地址,存在路径下,已改为参数传入 //设置新建文件路径及名称 string savePath = path + fileName + name_suffix; //创建文件 FileStream file = new FileStream(savePath, FileMode.CreateNew, FileAccess.Write); //创建一个 IO 流 MemoryStream ms = new MemoryStream(); //写入到流 workbook.Write(ms); //转换为字节数组 byte[] bytes = ms.ToArray(); file.Write(bytes, 0, bytes.Length); file.Flush(); //还可以调用下面的方法,把流输出到浏览器下载 OutputClient(bytes,fileName,name_suffix); //释放资源 bytes = null; ms.Close(); ms.Dispose(); file.Close(); file.Dispose(); workbook.Dispose(); sheet = null; workbook = null; } catch (Exception ex) { } } #endregion #region 将生成的文件流返回给浏览器 /// <summary> /// 将生成的文件流返回给浏览器 /// </summary> /// <param name="bytes">文件流</param> /// <param name="fileName">要保存的文件名</param> /// <param name="name_suffix">文件后缀名</param> public static void OutputClient(byte[] bytes,string fileName,string name_suffix) { HttpResponse response = HttpContext.Current.Response; response.Buffer = true; response.Clear(); response.ClearHeaders(); response.ClearContent(); response.ContentType = "application/vnd.ms-excel"; response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}{1}", fileName, name_suffix)); response.Charset = "GB2312"; response.ContentEncoding = Encoding.GetEncoding("GB2312"); response.BinaryWrite(bytes); response.Flush(); response.Close(); } #endregion
其实两个方法总体一样,一个是在流文件生成后保存到本地,一个是流文件生成后返回给客户端
这里要说明一下如果是以流文件返回到客户端了,需要用
window.location.href = '../../report/ExcelToClient'; //后台生成流文件的url请求地址
如果要使用.ajax异步获取,那么会收到乱码。原因是.ajax只针对文本信息存放,而response后的是二进制流无法处理。所以直接用href就搞定了
参考:https://www.cnblogs.com/lunawzh/p/7966214.html
附件是NPOI最新的2.3.0.0版本