XSSFWorkbook和HSSFWorkbook导出(亲测)

简介: XSSFWorkbook和HSSFWorkbook导出(亲测)

项目上这种功能很多,写了一个工具类,代码有点垃圾,大神勿喷

导入导出poi组件Excel

<dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.9</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.9</version>
        </dependency>
package com.tc.util;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.Footer;
import org.apache.poi.ss.usermodel.Header;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * 导出工具类  <p>07导出不限制行数,03有66535局限性</p>
 *
 * @author Fyg_gm
 * @since 2021-05-12 21:01:20
 */
@Component
public class ExcelUtil {
    Logger logger = LoggerFactory.getLogger(ExcelUtil.class);
    /**
     * 07 无限制导出
     *
     * @param response
     * @param list     导出的数据
     * @param filename 导出文件名
     * @param title    导出表头
     */
    public void exportMultiToDownFile(HttpServletResponse response, List<?> list, String filename, String[] title) {
        Logger logger = LoggerFactory.getLogger(ExcelUtil.class);
        filename += new SimpleDateFormat("yyyy-MM-dd").format(System.currentTimeMillis());
        //创建工作薄
        XSSFWorkbook workbook = new XSSFWorkbook();
        //创建表单
        XSSFSheet sheet = genSheet(workbook, filename);
        //创建表单样式
        Map<String, XSSFCellStyle> tableStyle = createStyle(workbook);//创建表头样式
        Map<String, XSSFCellStyle> titleStyle = createStyle(workbook);//创建标题样式
        Map<String, XSSFCellStyle> contextStyle = createStyle(workbook);//创建正文样式
        //创建Excel
        genExcel(filename, list, title, sheet, tableStyle.get("cellStyle2"), titleStyle.get("cellStyle"), contextStyle.get("cellStyle3"));
        String suffix = ".xls";
        filename += suffix;
//            最终已流的形式返回
        OutputStream out = null;
        try {
            out = response.getOutputStream();
            response.setHeader("content-type", "application/octet-stream");
            response.setContentType("application/octet-stream");
            response.addHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(filename, "UTF-8"));
            workbook.write(out);
            out.flush();
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
            logger.info(e.getMessage());
        } finally {
            try {
                if (out != null) {
                    out.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
                logger.info(e.getMessage());
            }
        }
    }
    /**
     * 03 限制导出行数66535 有局限性
     *
     * @param response
     * @param list     导出的数据
     * @param filename 导出的文件名
     * @param title    导出的表头
     */
    public void exportToDownFile(HttpServletResponse response, List<?> list, String filename, String[] title) {
        filename += new SimpleDateFormat("yyyy-MM-dd").format(System.currentTimeMillis());
        String suffix = ".xls";
        filename += suffix;
        //创建excel表
        HSSFWorkbook workbook = new HSSFWorkbook();
        //建立sheet对象
        HSSFSheet sheet = workbook.createSheet(filename);
        //设置默认行宽
        sheet.setDefaultColumnWidth(20);
        //创建样式
        Map<String, HSSFCellStyle> style = createStyle(workbook);
        //创建表头
        HSSFRow row = sheet.createRow(0);
        row.setHeightInPoints(20);//行高
        HSSFCell cell = row.createCell(0);
        cell.setCellValue(filename);
        cell.setCellStyle(style.get("cellStyle"));
        sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, (title.length - 1)));
        //创建标题
        HSSFRow rowTitle = sheet.createRow(1);
        rowTitle.setHeightInPoints(20);
        HSSFCell hc;
        for (int i = 0; i < title.length; i++) {
            hc = rowTitle.createCell(i);
            hc.setCellValue(title[i]);
            //设置标题样式
            hc.setCellStyle(style.get("cellStyle2"));
        }
        //创建表格数据
        Field[] fields;
        int i = 2;
        int index = 0;//记录额外创建的sheet数量
        //数据源
        for (Object obj : list) {
            //反射获取到实体
            fields = obj.getClass().getDeclaredFields();
            HSSFRow rowBody = sheet.createRow(i);
            rowBody.setHeightInPoints(20);
            int j = 0;
            //遍历渲染表格
            for (Field f : fields) {
                f.setAccessible(true);
                Object va = null;
                try {
                    va = f.get(obj);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
                if (null == va) {
                    va = "---";
                }
                //创建行数
                hc = rowBody.createCell(j);
                //赋值数据
                hc.setCellValue(va.toString());
                //设置表格样式
                hc.setCellStyle(style.get("cellStyle3"));
                j++;
            }
            i++;
        }
        //最终已流的形式返回
        OutputStream out = null;
        try {
            out = response.getOutputStream();
            response.setHeader("content-type", "application/octet-stream");
            response.setContentType("application/octet-stream");
            response.addHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(filename, "UTF-8"));
            workbook.write(out);
            out.flush();
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
            logger.info(e.getMessage());
        } finally {
            try {
                if (out != null) {
                    out.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
                logger.info(e.getMessage());
            }
        }
    }
    //封装动态渲染excel
    public static void genExcel(String filename, List<?> list, String[] title, XSSFSheet sheet, XSSFCellStyle tableStyle, XSSFCellStyle titleStyle, XSSFCellStyle contextStyle) {
        //设置默认行宽
        sheet.setDefaultColumnWidth(20);
        //创建第一行,为标题,index从0开始
        XSSFRow row = sheet.createRow(0);
        row.setHeightInPoints(20);
        //创建一列
        XSSFCell cell = row.createCell(0);
        //标题
        cell.setCellValue(filename);
        //设置标题样式
        cell.setCellStyle(titleStyle);
        //设置标题位置
        sheet.addMergedRegion(new CellRangeAddress(
                0, //first row
                0, //last row
                0, //first column
                (title.length - 1) //last column
        ));
        //创建第二行  表头
        XSSFRow rowTitle = sheet.createRow(1);
        rowTitle.setHeightInPoints(20);
        XSSFCell xc;
        for (int i = 0; i < title.length; i++) {
            xc = rowTitle.createCell(i);
            xc.setCellValue(title[i]);
            //设置表头样式
            xc.setCellStyle(tableStyle);
        }
        //从数据库取数据填充到Excel,
        Field[] fields;
        //i从2开始计数,因为上面已经创建了 0 1行
        int i = 2;
        for (Object obj : list) {
            //反射获取到实体
            fields = obj.getClass().getDeclaredFields();
            //从第三行动态去创建
            XSSFRow rowBody = sheet.createRow(i);
            rowBody.setHeightInPoints(20);
            int j = 0;
            //遍历渲染表格
            for (Field f : fields) {
                f.setAccessible(true);
                Object va = null;
                try {
                    va = f.get(obj);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
                if (null == va) {
                    va = "---";
                }
                //创建行数
                xc = rowBody.createCell(j);
                //赋值数据
                xc.setCellValue(va.toString());
                //设置表格样式
                xc.setCellStyle(contextStyle);
                j++;
            }
            i++;
        }
    }
    //设置表单,并生成表单
    public static XSSFSheet genSheet(XSSFWorkbook workbook, String sheetName) {
        //生成表单
        XSSFSheet sheet = workbook.createSheet(sheetName);
        //设置表单文本居中
        sheet.setHorizontallyCenter(true);
        sheet.setFitToPage(false);
        //打印时在底部右边显示文本页信息
        Footer footer = sheet.getFooter();
        footer.setRight("Page " + HeaderFooter.numPages() + " Of " + HeaderFooter.page());
        //打印时在头部右边显示Excel创建日期信息
        Header header = sheet.getHeader();
        header.setRight("Create Date " + HeaderFooter.date() + " " + HeaderFooter.time());
        //设置打印方式
        XSSFPrintSetup ps = sheet.getPrintSetup();
        ps.setLandscape(true); // true:横向打印,false:竖向打印 ,因为列数较多,推荐在打印时横向打印
        ps.setPaperSize(HSSFPrintSetup.A4_PAPERSIZE); //打印尺寸大小设置为A4纸大小
        return sheet;
    }
    //设置exportToDownFile样式
    public Map<String, HSSFCellStyle> createStyle(HSSFWorkbook workbook) {
        Map<String, HSSFCellStyle> map = new HashMap<>();
        //表头样式(加粗,水平居中,垂直居中)
        HSSFCellStyle cellStyle = workbook.createCellStyle();
        cellStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);//水平居中
//        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中
        //设置边框样式
        cellStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN); //下边框
        cellStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);//左边框
        cellStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);//上边框
        cellStyle.setBorderRight(XSSFCellStyle.BORDER_THIN);//右边框
        HSSFFont fontStyle = workbook.createFont();
        fontStyle.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        cellStyle.setFont(fontStyle);
        //标题样式(加粗,垂直居中)
        HSSFCellStyle cellStyle2 = workbook.createCellStyle();
//        cellStyle2.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中
        cellStyle2.setFont(fontStyle);
        //设置边框样式
        cellStyle2.setBorderBottom(XSSFCellStyle.BORDER_THIN); //下边框
        cellStyle2.setBorderLeft(XSSFCellStyle.BORDER_THIN);//左边框
        cellStyle2.setBorderTop(XSSFCellStyle.BORDER_THIN);//上边框
        cellStyle2.setBorderRight(XSSFCellStyle.BORDER_THIN);//右边框
        //字段样式(垂直居中)
        HSSFCellStyle cellStyle3 = workbook.createCellStyle();
        //设置边框样式
        cellStyle3.setBorderBottom(XSSFCellStyle.BORDER_THIN); //下边框
        cellStyle3.setBorderLeft(XSSFCellStyle.BORDER_THIN);//左边框
        cellStyle3.setBorderTop(XSSFCellStyle.BORDER_THIN);//上边框
        cellStyle3.setBorderRight(XSSFCellStyle.BORDER_THIN);//右边框
        map.put("cellStyle", cellStyle);
        map.put("cellStyle2", cellStyle2);
        map.put("cellStyle3", cellStyle3);
        return map;
    }
    //设置exportMultiToDownFile样式
    public Map<String, XSSFCellStyle> createStyle(XSSFWorkbook workbook) {
        Map<String, XSSFCellStyle> map = new HashMap<>();
        //表头样式(加粗,水平居中,垂直居中)
        XSSFCellStyle cellStyle = workbook.createCellStyle();
        cellStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);//水平居中
//        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中
        //设置边框样式
        cellStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN); //下边框
        cellStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);//左边框
        cellStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);//上边框
        cellStyle.setBorderRight(XSSFCellStyle.BORDER_THIN);//右边框
        XSSFFont fontStyle = workbook.createFont();
        fontStyle.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        cellStyle.setFont(fontStyle);
        //标题样式(加粗,垂直居中)
        XSSFCellStyle cellStyle2 = workbook.createCellStyle();
//        cellStyle2.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中
        cellStyle2.setFont(fontStyle);
        //设置边框样式
        cellStyle2.setBorderBottom(XSSFCellStyle.BORDER_THIN); //下边框
        cellStyle2.setBorderLeft(XSSFCellStyle.BORDER_THIN);//左边框
        cellStyle2.setBorderTop(XSSFCellStyle.BORDER_THIN);//上边框
        cellStyle2.setBorderRight(XSSFCellStyle.BORDER_THIN);//右边框
        //字段样式(垂直居中)
        XSSFCellStyle cellStyle3 = workbook.createCellStyle();
//        cellStyle3.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中
        //设置边框样式
        cellStyle3.setBorderBottom(XSSFCellStyle.BORDER_THIN); //下边框
        cellStyle3.setBorderLeft(XSSFCellStyle.BORDER_THIN);//左边框
        cellStyle3.setBorderTop(XSSFCellStyle.BORDER_THIN);//上边框
        cellStyle3.setBorderRight(XSSFCellStyle.BORDER_THIN);//右边框
        map.put("cellStyle", cellStyle);
        map.put("cellStyle2", cellStyle2);
        map.put("cellStyle3", cellStyle3);
        return map;
    }
}
目录
相关文章
|
前端开发 easyexcel Java
Java+EasyExcel实现文件导入导出,导入导出如此简单
项目中需要Excel文件的导入与导出Excel并下载,例如,导入员工信息,导出员工信息,手动输入比较繁琐,所以本篇博文教大家如何在Java中导入Excel文件与导出Excel文件
15697 3
Java+EasyExcel实现文件导入导出,导入导出如此简单
|
运维 监控 专有云
TAC报警中心: 专有云告警生命周期一站式管理运维平台
TAC报警中心是阿里云SRE混合云团队为专有云精心打造的一站式告警运维平台,覆盖专有云所涉及的云产品、大数据、云实例以及用户所涉及的站点应用等告警,提供告警生命周期管理以及报警外发等解决方案。帮助专有云快速发现、定位异常问题,协助产品团队进行产品优化。
TAC报警中心: 专有云告警生命周期一站式管理运维平台
|
3月前
|
存储 消息中间件 NoSQL
【Redis】常用数据结构之List篇:从常用命令到典型使用场景
本文将系统探讨 Redis List 的核心特性、完整命令体系、底层存储实现以及典型实践场景,为读者构建从理论到应用的完整认知框架,助力开发者在实际业务中高效运用这一数据结构解决问题。
|
存储 SQL 关系型数据库
【赵渝强老师】PostgreSQL的物理存储结构
PostgreSQL在初始化时通过环境变量$PGDATA指定的目录下生成各类文件,构成其物理存储结构,包括数据文件、日志文件(如运行日志、WAL预写日志、事务日志和服务器日志)、控制文件及参数文件等,确保数据库的高效运行与数据安全。
303 1
|
消息中间件 数据安全/隐私保护 RocketMQ
消息队列 MQ使用问题之如何设置nameserver监听的IP
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
计算机视觉
【图像处理】基于Zernike矩的亚像素边缘检测理论及MATLAB实现
基于Zernike矩的亚像素边缘检测理论,并提供了相应的MATLAB代码实现,包括定义7x7的Zernike模板、图像处理、边缘检测和连通域分析等步骤。
375 1
python+Pycharm+selenium操作浏览器(Chorme或Edge)
python+Pycharm+selenium操作浏览器(Chorme或Edge)
624 1
|
缓存 easyexcel Java
狂神说POI,EasyExcel笔记及源码资料(一)
狂神说POI,EasyExcel笔记及源码资料(一)
1191 0
狂神说POI,EasyExcel笔记及源码资料(一)
|
机器学习/深度学习
【DR_CAN-MPC学习笔记】2.最优化数学建模推导
【DR_CAN-MPC学习笔记】2.最优化数学建模推导
|
前端开发 Java 应用服务中间件
Tomcat 与 JVM 中classpath的理解和设置总结
Tomcat 与 JVM 中classpath的理解和设置总结
513 0