Web项目中数据导出Excel的实现方案
记录是为了更好的成长!
废话不多说,直接进入主题:数据导出到excel表格的方式很多,具体的还需要看项目要求,合理选择,导出excel表格可以在前端对table中的内容通过js进行导出,在后台的话可以通过java代码进行导出。
1、通过js将table中的数据导出到excel
-
手写原生js代码(这种方式可以百度找js代码,网上都可以找到)
-
使用jquery-table2excel插件 (获取最新版本的地址为:https://github.com/rainabba/jquery-table2excel )
需要用到jquery和jquery_table2excel两个js,附上一段我做demo时的源码:
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> <script src="js/jquery-3.3.1.min.js"></script> <script src="js/jquery.table2excel.js"></script> </head> <body> <table class="table2excel" border="1" cellspacing="0" width="100%"> <thead> <tr> <th>编号</th> <th>姓名</th> <th>年龄</th> <th>地址</th> <th>用户名</th> <th>邮箱</th> <th>手机号</th> <th>电话号码</th> <th class="ttt">编辑</th> </tr> </thead> <tbody> <tr> <td>编号</td> <td>姓名</td> <td>年龄</td> <td>地址</td> <td>用户名</td> <td>邮箱</td> <td>手机号</td> <td>电话号码</td> <td>编辑</td> </tr> </tbody> </table> <button class="btn">导出excel表格</button> <script> $(function() { $(".btn").click(function(){ $(".table2excel").table2excel({ // 不被导出的表格行的CSS class类 exclude: ".noExl", exclude:".ttt", // 导出的Excel文档的名称 name: "Excel Document Name", // Excel文件的名称 filename: "test", //文件后缀名 fileext: ".xls", //是否排除导出图片 exclude_img: false, //是否排除导出超链接 exclude_links: false, //是否排除导出输入框中的内容 exclude_inputs: false }); }); }); </script> </body> </html>
注意:使用jquery.table2Excel插件导出文件时,文件导出成功之后js会重新请求到这个页面的路径,请确保参数不为null ;
比如请求RequestMapping("index") 之后来到index页面进行导出,导出成功之后js会再去请求 RequestMapping("index") ,然后继续来index页面,如果控制层的方法中有参数的话,请确保参数不为null,否则导出完之后的请求会出错。
2、通过java代码实现导出excel,(后端实现方式不止一种,我这里用org.apache.poi来实现)
POI有两种实现方式:HSSF和XSSF
HSSF是POI工程对Excel 97(-2007)文件操作的纯Java实现
XSSF是POI工程对Excel 2007 OOXML (.xlsx)文件操作的纯Java实现
从POI 3.8版本开始,提供了一种基于XSSF的低内存占用的API----SXSSF (这种没用过)
引入mavan:
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.17</version> </dependency>
附上我的java代码:
public class ExcelUtil { /** * 导出Excel * @param sheetName sheet名称 * @param title 标题 * @param values 内容 * @param wb HSSFWorkbook对象 * @return */ public static HSSFWorkbook getHSSFWorkbook(String sheetName,String []title,String [][]values, HSSFWorkbook wb){ // 第一步,创建一个HSSFWorkbook,对应一个Excel文件 if(wb == null){ wb = new HSSFWorkbook(); } // 第二步,在workbook中添加一个sheet,对应Excel文件中的sheet HSSFSheet sheet = wb.createSheet(sheetName); // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制 HSSFRow row = sheet.createRow(0); // 第四步,创建单元格,并设置值表头 设置表头居中 HSSFCellStyle style = wb.createCellStyle(); style.setAlignment(HorizontalAlignment.CENTER_SELECTION);; // 创建一个居中格式 //声明列对象 HSSFCell cell = null; //创建标题 for(int i=0;i<title.length;i++){ cell = row.createCell(i); cell.setCellValue(title[i]); cell.setCellStyle(style); } //创建内容 for(int i=0;i<values.length;i++){ row = sheet.createRow(i + 1); for(int j=0;j<values[i].length;j++){ //将内容按顺序赋给对应的列对象 row.createCell(j).setCellValue(values[i][j]); } } return wb; } //发送响应流方法 public static void setResponseHeader(HttpServletResponse response, String fileName) { try { try { //设置表文件名的字符编码,不然中文文件名会乱码 fileName = new String(fileName.getBytes("utf-8"),"ISO-8859-1"); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } response.setContentType("application/octet-stream;charset=utf-8"); response.setHeader("Content-Disposition", "attachment;filename="+ fileName); response.addHeader("Pargam", "no-cache"); response.addHeader("Cache-Control", "no-cache"); } catch (Exception ex) { ex.printStackTrace(); } }
业务层导出方法:
public void export(HttpServletRequest request,HttpServletResponse response) { //获取数据 List<Money> list = moneyMapper.selectByExample(null); //excel标题 String[] title = {"编号","价格","用户id"}; //excel文件名 String fileName = "测试表.xls"; //sheet名 String sheetName = "测试表"; String[][] content=new String[list.size()][title.length]; for (int i = 0; i < list.size(); i++) { content[i][0] = list.get(i).getMid().toString(); content[i][1] = list.get(i).getMoney().toString(); content[i][2] = list.get(i).getUid().toString(); } //创建HSSFWorkbook HSSFWorkbook wb = ExcelUtil.getHSSFWorkbook(sheetName, title, content, null); //响应到客户端 try { ExcelUtil.setResponseHeader(response, fileName); OutputStream os = response.getOutputStream(); wb.write(os); os.flush(); os.close(); }catch (Exception e) { e.printStackTrace(); } }
控制层调用:
/** * 导出报表 * @return */ @RequestMapping("export") @ResponseBody public void export(HttpServletRequest request,HttpServletResponse response) throws Exception { serviceAllImpl.export(request, response); }
页面:
<body> <button onclick = "toExcel()">导出excel</button> <script> function toExcel() { window.location.href="export"; } </script> </body>
这是我的项目中从页面到控制层再到业务层,工具类的一个实现。
可以参考大佬的博客:https://www.cnblogs.com/sunny-sl/p/7794249.html
以上内容代表个人观点,仅供参考,不喜勿喷。。。