本文共 3928 字,大约阅读时间需要 13 分钟。
## 需求
页面查询用户表信息, 并实现数据导出(以.xlsx格式保存至本地)
报表导出展示效果:
一, 环境搭建
1, 新建一SSM测试项目(ssm_test), 用于测试报表导出功能, 具体搭建过程不再赘述;
2, 报表导出需要用到apache提供的两个jar包, 添加对应依赖
<!-- 用于进行数据报表导出操作 --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.14</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.14</version> </dependency>
二, 后台接口实现
1, DataExportController .java
## 这里查询数据库环节以固定结果集替代, 用于简单测试
package cn.tedu.test.controller;import java.util.ArrayList;import java.util.Arrays;import java.util.List;import javax.servlet.http.HttpServletResponse;import org.apache.poi.ss.usermodel.Sheet;import org.apache.poi.ss.usermodel.Workbook;import org.apache.poi.xssf.usermodel.XSSFWorkbook;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;/* * 查询数据以报表的形式导出 */@Controllerpublic class DataExportController { public static final String[] HEADERS = {"姓名", "性别", "年龄", "工作", "住址"}; @RequestMapping("/export.do") @ResponseBody public void doExport(HttpServletResponse response) throws Exception { List<List<String>> data = new ArrayList<List<String>>(); for (int i = 0; i < 6; i++) { List<String> userInfo = new ArrayList<String>(); userInfo.add("小明" + i); userInfo.add("男" + i); userInfo.add("27" + i); userInfo.add("软件开发" + i); userInfo.add("上海浦东" + i); data.add(userInfo); } ExcelUtil excelUtil = new ExcelUtil("userInfo"); Workbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet(); excelUtil.formData(Arrays.asList(HEADERS), data, sheet); excelUtil.buildExcelDocument(workbook, response); }}
## 备注: for循环中进行字符串加号拼接的性能不高, 建议使用 StringBuilder 或 StringBuffer的append()方法;
参考文章:
2, ExcelUtil.java
package cn.tedu.test.controller;import java.io.OutputStream;import java.net.URLEncoder;import java.util.List;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.poi.ss.usermodel.Cell;import org.apache.poi.ss.usermodel.Row;import org.apache.poi.ss.usermodel.Sheet;import org.apache.poi.ss.usermodel.Workbook;/** * excel报表工具类 */public class ExcelUtil { private String filename = ""; public ExcelUtil(String filename) { this.filename = filename; } public void buildExcelDocument(Workbook workbook, HttpServletResponse response) throws Exception { response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8"); response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(filename + ".xlsx", "UTF-8")); OutputStream ouputStream = response.getOutputStream(); workbook.write(ouputStream); ouputStream.flush(); ouputStream.close(); } // 填充表头和数据 public void formData(List<String> headers, List<List<String>> data, Sheet sheet){ int rowIndex = 0; int colIndex = 0; Row head= sheet.createRow(rowIndex++); for (String title : headers) { Cell tCell = head.createCell(colIndex++); tCell.setCellValue(title); } for (List<String> record : data) { Row row = sheet.createRow(rowIndex++); colIndex = 0; for (String value : record) { Cell tCell = row.createCell(colIndex++); tCell.setCellValue(value); } } } public String getFilename() { return filename; } public void setFilename(String filename) { this.filename = filename; } }
三, 前台代码实现
1, index,html
<!DOCTYPE html><html><head><meta charset="UTF-8"><title>guess</title><script type="text/javascript" src="jquery.min.js"></script><script type="text/javascript"> //body加载完调用; $(function(){ //导出数据报表 $("#export").click(function(){ alert('导出报表') window.open("/ssm_test/export.do"); } ); }); </script></head><body> <input type="button" value="导出数据报表" id="export"></body></html>
四, 功能测试
1, 访问路径
2, 如果访问被拦截, 需要设置下, 选中始终允许即ok!
3, 弹出自定义存储位置弹框, 点击保存, 保存成功即ok!
转载地址:http://hwip.baihongyu.com/