一、【Spring Boot】 Excel文件导出下载

   Spring Boot Excel 文件导出



目标:

实现Excel文件的直接导出下载,后续开发不需要开发很多代码,直接继承已经写好的代码,增加一个Xml配置就可以直接导出。

实现:

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(            Map<String, Object> model, 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 List<T> vo;

public CheckExcelView(List<T> 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

<?xml version="1.0" encoding="UTF-8"?>

<configuration>    <table id="demo" name="测试">        <columns>            <column id="name" name="名称" width="40"></column>        </columns>    </table></configuration>

2、XMl解析配置          
@Rootpublic class Export {

@ElementList(entry = "table", inline = true)    private List<Table> table;

public List<Table> getTable() {        return table;    }

public void setTable(List<Table> table) {        this.table = table;    }

public static class Table {

@Attribute        private String id;

@Attribute        private String name;

@ElementList(entry = "column")        private List<Column> columns;

public String getId() {            return id;        }

public void setId(String id) {            this.id = id;        }

public String getName() {            return name;        }

public void setName(String name) {            this.name = name;        }

public List<Column> getColumns() {            return columns;        }

public void setColumns(List<Column> columns) {            this.columns = columns;        }

}

public static class Column {

@Attribute        private String id;

@Attribute        private String name;

@Attribute        private short width;

@Attribute(required = false)        private String mapping;

public String getId() {            return id;        }

public void setId(String id) {            this.id = id;        }

public String getName() {            return name;        }

public void setName(String name) {            this.name = name;        }

public String getMapping() {            return mapping;        }

public void setMapping(String mapping) {            this.mapping = mapping;        }

public short getWidth() {            return width;        }

public void setWidth(short width) {            this.width = width;        }

}

}

3、解析XMl方法配置

@Servicepublic class IExportService {

private Export tables;

private Map<String, Export.Table> tableMap;

@SuppressWarnings("rawtypes")    @PostConstruct    public void init() throws Exception {        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("export-config.xml");        Serializer serializer = new Persister();        tables = serializer.read(Export.class, inputStream);        tableMap = new HashMap<>();        for (Export.Table table : tables.getTable()) {            tableMap.put(table.getId(), table);        }    }    public Export.Table getTable(String key) {        return tableMap.get(key);    }}

4、导出基础 ExcelExportView 代码实现

public class ExcelExportView extends BaseExcelView {    private String[] titles;    private short[] columnWidths;    List<Map<String, Object>> results;    private Export.Table table;    private IExportService iExportService;    @Override    protected String getFileName() {        return table.getName();    }    @Override    protected String getSheetName() {        return table.getName();    }    @Override    protected String[] getTitles() {        return this.titles;    }    @Override    protected short[] getColumnWidths() {        return this.columnWidths;    }    public ExcelExportView() {        this.iExportService = ApplicationContextProvider.getBean(IExportService.class);    }    @Override    protected void buildContentCells(Sheet sheet) {        int dataIndex = 1;        if(CollectionUtils.isEmpty(results)){            return;        }        for (Map<String, Object> data : results) {            Row row = sheet.createRow(dataIndex++);            for (int i = 0; i < table.getColumns().size(); i++) {                Export.Column column = table.getColumns().get(i);                Cell cell = row.createCell(i);                Object value = data.get(column.getId());                if (value == null) {                    value = "";                }                cell.setCellValue(new XSSFRichTextString(value.toString()));            }        }    }    public void exportExcel(String key, List<Map<String, Object>> results) {        this.table = iExportService.getTable(key);        if (null == table) {            return;        }        this.results = results;        this.titles = new String[table.getColumns().size()];        this.columnWidths = new short[table.getColumns().size()];        for (int i = 0; i < table.getColumns().size(); i++) {            Export.Column column = table.getColumns().get(i);            titles[i] = column.getName();            columnWidths[i] = column.getWidth();        }    }}

 最后:导出Controller代码实现  

@RequestMapping(path = "/export", method = RequestMethod.GET, produces = "application/octet-stream;charset=UTF-8")public @ResponseBodyModelAndView export(){    Long loginComId = loginContext.getCompany().getId();    List<T> list = new ArrayList<>();    ExcelExportView exportView = new ExcelExportView();    exportView.exportExcel("XMl中表的ID", BeanUtils.objectToMapList(list));

    return new ModelAndView(exportView);
}

原文地址:https://www.cnblogs.com/cuigd/p/9968477.html

时间: 2024-08-29 10:48:47

一、【Spring Boot】 Excel文件导出下载的相关文章

Spring Boot入门——文件上传与下载

Spring Boot入门--文件上传与下载https://www.cnblogs.com/studyDetail/p/7003253.html 1.在pom.xml文件中添加依赖 复制代码 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http:/

spring boot 使用POI导出数据到Excel表格

摘自:https://www.cnblogs.com/hopeofthevillage/p/12099807.html spring boot 使用POI导出数据到Excel表格 2019-12-26 00:17  全me村的希望  阅读(42)  评论(0)  编辑收藏 在spring boot 的项目经常碰到将数据导出到Excel表格的需求,而POI技术则对于java操作Excel表格提供了API,POI中对于多种类型的文档都提供了操作的接口,但是其对于Excel表格的操作无疑是最强大的.

php excel文件导出之phpExcel扩展库

php Excel  文件导出 phpExcel 官网 http://phpexcel.codeplex.com/ /** * 导出特定文件 * 根据具体情况而定 */ public function download(){ //1. 从数据库来获取对应的二维数组 $alist = array(...); $list = $alist; $data = array(); //2. 设置xls的 表头名 $headArr = array("排名","姓名","

比较恶心的360老年版浏览器 文件导出下载

function export_txt($data) { Header("Content-type: application/octet-stream"); Header("Accept-Ranges: bytes"); $destination_folder='./Public/file/'; //txt文件 $file_name=iconv('utf-8', 'gbk', '账号卡信息').date('Y-m-d H-i-s',time()).'.txt'; $

spring boot使用AbstractXlsView导出excel

一.maven依赖jar包 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.14</version> </dependency> 1 2 3 4 5 二.导出view public class ExportMemberVo { private String name; pri

spring boot实现文件上传下载

spring boot 引入”约定大于配置“的概念,实现自动配置,节约了开发人员的开发成本,并且凭借其微服务架构的方式和较少的配置,一出来就占据大片开发人员的芳心.大部分的配置从开发人员可见变成了相对透明了,要想进一步熟悉还需要关注源码.1.文件上传(前端页面): <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd&quo

android+spring boot 选择,上传,下载文件

1 概述 前端android,上传与下载文件,使用OkHttp处理请求,后端使用spring boot+MVC,处理android发送来的上传与下载请求.这个其实不难,就是特别多奇奇怪怪的坑,因此,希望看到的,不要像笔者这样踩的那么痛苦了... 2 环境 win10 Spring Boot 2.2.2 RELEASE IDEA 2019.3.1 Android Studio 3.6RC1 Tomcat 9.0.30 3 android 3.1 准备工作 3.1.1 新建工程 这次用一个全新的例子

009 spring boot中文件的上传与下载

一:任务 1.任务 文件的上传 文件的下载 二:文件的上传 1.新建一个对象 FileInfo.java 1 package com.cao.dto; 2 3 public class FileInfo { 4 private String path; 5 public FileInfo(String path) { 6 this.path=path; 7 } 8 public String getPath() { 9 return path; 10 } 11 public void setPa

spring boot教程 网盘下载

教程下载地址:https://u18103887.ctfile.com/fs/18103887-309551343 I. Spring Boot文档1. 关于本文档2. 获取帮助3. 第一步4. 使用Spring Boot5. 了解Spring Boot特性6. 迁移到生产环境7. 高级主题II. 开始8. Spring Boot介绍9. 系统要求9.1. Servlet容器10. Spring Boot安装10.1. 为Java开发者准备的安装指南10.1.1. Maven安装10.1.2.