扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
如何在Spring Boot 中导出 Excel文件?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
成都创新互联长期为近1000家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为船山企业提供专业的网站建设、做网站,船山网站改版等技术服务。拥有10多年丰富建站经验和众多成功案例,为您定制开发。
实现:
1、抽象类 BaseExcelView 继承 webmvc 的 AbstractXlsxStreamingView 抽象类, AbstractXlsxStreamingView 是webmvc继承了最顶层View接口,是可以直接大量数据导出的不会造成内存泄漏问题,即 SXSSFWorkbook 解决了内存问题, 导出只支持xlsx类型文件。
抽象类代码 BaseExcelView :
public abstract class BaseExcelView extends AbstractXlsxStreamingView { private static final Logger logger = LoggerFactory.getLogger(BaseExcelView.class); /** * 获取导出文件名 * * @return */ abstract protected String getFileName(); /** * 获取表单名称 * * @return */ abstract protected String getSheetName(); /** * 获取标题栏名称 * * @return */ abstract protected String[] getTitles(); /** * 获取列宽 * * @return */ abstract protected short[] getColumnWidths(); /** * 构造内容单元格 * * @param sheet */ abstract protected void buildContentCells(Sheet sheet); @Override protected void buildExcelDocument( Mapmodel, Workbook workbook, HttpServletRequest request, HttpServletResponse response) throws Exception { // 构造标题单元格 SXSSFWorkbook Sheet sheet = buildTitleCells(workbook); // 构造内容单元格 buildContentCells(sheet); // 设置响应头 setResponseHead(request, response); } /** * 设置响应头 * * @param response * @throws IOException */ protected void setResponseHead(HttpServletRequest request, HttpServletResponse response) throws IOException { // 文件名 String fileName = getFileName(); String userAgent = request.getHeader("user-agent").toLowerCase(); logger.info("客户端请求头内容:"); logger.info("user-agent\t值: {}", userAgent); if (userAgent != null) { if (userAgent.contains("firefox")) { // firefox有默认的备用字符集是西欧字符集 fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1"); } else if (userAgent.contains("webkit") && (userAgent.contains("chrome") || userAgent.contains("safari"))) { // webkit核心的浏览器,主流的有chrome,safari,360 fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1"); } else { // 新老版本的IE都可直接用URL编码工具编码后输出正确的名称,无乱码 fileName = URLEncoder.encode(fileName, "UTF-8"); } } //响应头信息 response.setCharacterEncoding("UTF-8"); response.setContentType("application/ms-excel; charset=UTF-8"); response.setHeader("Content-disposition", "attachment; filename=" + fileName + ".xlsx"); } /** * 构造标题单元格 * * @param * @return */ protected Sheet buildTitleCells(Workbook workbook) { // 表单名称 String sheetName = getSheetName(); // 标题名称 String[] titles = getTitles(); // 列宽 short[] colWidths = getColumnWidths(); // 创建表格 Sheet sheet = workbook.createSheet(sheetName); // 标题单元格样式 CellStyle titleStyle = getHeadStyle(workbook); // 默认内容单元格样式 CellStyle contentStyle = getBodyStyle(workbook); // 标题行 Row titleRow = sheet.createRow(0); // 创建标题行单元格 for (int i = 0; i < titles.length; i++) { // 标题单元格 Cell cell = titleRow.createCell((short) i); cell.setCellType(CellType.STRING); cell.setCellValue(new XSSFRichTextString(titles[i])); cell.setCellStyle(titleStyle); // 设置列宽 sheet.setColumnWidth((short) i, (short) (colWidths[i] * 256)); // 设置列默认样式 sheet.setDefaultColumnStyle((short) i, contentStyle); } return sheet; } /** * 设置表头的单元格样式 */ public CellStyle getHeadStyle(Workbook workbook) { // 创建单元格样式 CellStyle cellStyle = workbook.createCellStyle(); // 设置单元格的背景颜色为淡蓝色 cellStyle.setFillForegroundColor(IndexedColors.PALE_BLUE.index); // 设置填充字体的样式 cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); // 设置单元格居中对齐 cellStyle.setAlignment(HorizontalAlignment.CENTER); // 设置单元格垂直居中对齐 cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); // 创建单元格内容显示不下时自动换行 cellStyle.setWrapText(true); // 设置单元格字体样式 Font font = workbook.createFont(); // 字号 font.setFontHeightInPoints((short) 12); // 加粗 font.setBold(true); // 将字体填充到表格中去 cellStyle.setFont(font); // 设置单元格边框为细线条(上下左右) cellStyle.setBorderLeft(BorderStyle.THIN); cellStyle.setBorderBottom(BorderStyle.THIN); cellStyle.setBorderRight(BorderStyle.THIN); cellStyle.setBorderTop(BorderStyle.THIN); return cellStyle; } /** * 设置表体的单元格样式 */ public CellStyle getBodyStyle(Workbook workbook) { // 创建单元格样式 CellStyle cellStyle = workbook.createCellStyle(); // 设置单元格居中对齐 cellStyle.setAlignment(HorizontalAlignment.CENTER); // 设置单元格居中对齐 cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); // 创建单元格内容不显示自动换行 cellStyle.setWrapText(true); //设置单元格字体样式字体 Font font = workbook.createFont(); // 字号 font.setFontHeightInPoints((short) 10); // 将字体添加到表格中去 cellStyle.setFont(font); // 设置单元格边框为细线条 cellStyle.setBorderLeft(BorderStyle.THIN); cellStyle.setBorderBottom(BorderStyle.THIN); cellStyle.setBorderRight(BorderStyle.THIN); cellStyle.setBorderTop(BorderStyle.THIN); return cellStyle; } }
Excel导出实现 1: 可以直接继承 BaseExcelView 实现定义的方法 eg:
public class CheckExcelView extends BaseExcelView { private Listvo; public CheckExcelView(List vo) { this.vo= vo; } @Override protected String getFileName() { String time = DateUtils.getLocalFullDateTime14(); return "导出文件" + time; } @Override protected String getSheetName() { return "报表"; } @Override protected String[] getTitles() { return new String[] { "申请时间"}; } @Override protected short[] getColumnWidths() { return new short[] { 20}; } @Override protected void buildContentCells(Sheet sheet) { DecimalFormat df = new DecimalFormat("0.00"); int rowNum = 1; for (T o : vO) { Row crow = sheet.createRow(rowNum++); crow.createCell(0).setCellValue(o.getApplicationDate())); } } }
导出实现 2: XML配置导出
1、需要定义XML的配置 export-config.xml
2、XMl解析配置
@Root public class Export { @ElementList(entry = "table", inline = true) private List