SpringBoot集成Poi导出Excel

一、环境搭建

IDE:idea 2022.2

构建工具:maven 3.6.3

2、准备工作

2.1、创建maven工程

①引入依赖

    	<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi</artifactId>
			<version>4.1.2</version>
		</dependency>

二、创建Excel工具类

1、导出工具类代码分析

exportExcel方法为导出的核心方法,在内容的设置时先创建行,在创建每一列。cell.setCellValue 是为每一个单元格赋值。
/**
     * 用户信息导出类
     *
     * @param datas       内容
     * @param counts     统计需要合并的列
     * @param response   响应
     * @param fileName   文件名
     * @param columnList 第一行的标题名
     * @param Arr         第二行的标题名
     */


    public static void exportExcel (HttpServletResponse response , String fileName, List<String>columnList, List<String>Arr, List<Map> counts, List<Map>  datas){
        OutputStream os = null;
        //设置响应头
        setResponseHeader(response,fileName);
        try {
            os = response.getOutputStream();
            SXSSFWorkbook workbook = new SXSSFWorkbook();

            //获取该工作区的第一个sheet
            Sheet sheet1 = workbook.createSheet("sheet1");


            //调用合并方法
            rowColMerge(sheet1,Arr,columnList,counts,0,1);

            int excelRow = 0;
            //创建标题行1
            Row titleRow = sheet1.createRow(excelRow++);
            for(int i = 0;i<columnList.size();i++){
                //创建该行下的每一列,并写入标题数据
                Cell cell = titleRow.createCell(i);
                cell.setCellValue(columnList.get(i));
                cell.setCellStyle( setStyle(workbook));
            }

            //创建标题行2
            Row titleRow2 = sheet1.createRow(excelRow++);
            for(int i = 0;i<Arr.size();i++){
                //创建该行下的每一列,并写入标题数据
                Cell cell = titleRow2.createCell(i);
                cell.setCellValue(Arr.get(i));
                cell.setCellStyle(setStyle(workbook));
            }

            //设置行高
            titleRow.setHeight((short) (50*20));
            //设置列宽
            setColSize(sheet1,columnList);





            //设置内容行
            if (datas!=null && datas.size()>0){
                for (int i = 0; i < datas.size(); i++) {
                    Row dataRow = sheet1.createRow(excelRow++);
                    for (int j = 0; j <datas.get(i).size() ; j++) {
                        Cell cell = dataRow.createCell(j);
                        if (String.valueOf(datas.get(i).get("data"+j)).equals("null")){
                            cell.setCellValue(" ");
                        }else {
                            cell.setCellValue(String.valueOf(datas.get(i).get("data"+j)));
                        }
                    }
                }
            }


            workbook.write(os);
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                //关闭输出流
                if (os != null){
                    os.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
setStyle为头部样式,可以在次更改头部样式,该方法是为了代码不冗余拆分出来的,也可以写进核心方法里面(不推荐)。 同理,你也可以在命名一个内容样式的方法设置内容的样式。
 //头部样式
    private  static CellStyle setStyle(SXSSFWorkbook workbook){
        //标题
        CellStyle titleStyle = workbook.createCellStyle();
        //居中
        titleStyle.setAlignment(HorizontalAlignment.CENTER);
        titleStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        titleStyle.setWrapText(true);
        return titleStyle;
    }
setColSize设置列宽,这里我简单的设置了一下列宽,根据你的具体需求,可以自行修改一个处理逻辑。
    //根据标题长度设置宽度
    private static void setColSize(Sheet sheet,List<String>oneTitles){
        for (int i = 0; i < oneTitles.size(); i++) {
            sheet.setColumnWidth(i,(int)((50 + 0.72) * (oneTitles.get(i).length()*10+30)));
        }
    }
rowColMerge该方法动态合并行列,根据具体传入的参数,动态合并行和列。第一个for循环,合并行。第二个for循环,合并列。
 /**
     *
     * @param sheet
     * @param list  第二行
     * @param arrList 第一行
     * @param counts  统计合并的列数
     * @param start 开始行
     * @param end   结束行
     */
    private static  void rowColMerge(Sheet sheet, List<String>list, List<String>arrList , List<Map> counts, int start, int end){
        for (int i = 0; i < list.size(); i++) {
            if (list.get(i).equals(" ")){
                sheet.addMergedRegion(new CellRangeAddress(start,end,i,i));
            }
        }

        for (Map count : counts) {
            for (int i = 0; i < arrList.size(); i++) {
                if (count.get("groupName").equals(arrList.get(i))){
                    int endCol = Integer.parseInt(String.valueOf(count.get("count"))) + i -1;
                    sheet.addMergedRegion(new CellRangeAddress(start,start,i,endCol));
                }
            }
        }
    }
setResponseHeader设置下载的响应头,解决下载的乱码的 问题。
/*
       设置浏览器下载响应头
    */
    private static void setResponseHeader(HttpServletResponse response, String fileName) {
        try {
            try {
                fileName = new String(fileName.getBytes(),"ISO8859-1");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            //添加响应头的跨域信息--开始
            response.addHeader("Access-Control-Allow-Origin", "*");
            response.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
            response.addHeader("Access-Control-Allow-Headers", "Content-Type");
            //添加响应头的跨域信息--结束            URLEncoder.encode(fileName + ".xlsx", "UTF-8"))
            response.setHeader("Content-Disposition", "attachment;filename=".concat(String.valueOf(fileName+".xlsx")));
            response.setContentType("application/vnd.ms-excel;charset=UTF-8");
//
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

2、完整工具类

public class ExcelUtil  {

    /**
     * 用户信息导出类
     *
     * @param datas       内容
     * @param counts     统计需要合并的列
     * @param response   响应
     * @param fileName   文件名
     * @param columnList 第一行的标题名
     * @param Arr         第二行的标题名
     */


    public static void exportExcel (HttpServletResponse response , String fileName, List<String>columnList, List<String>Arr, List<Map> counts, List<Map>  datas){
        OutputStream os = null;
        //设置响应头
        setResponseHeader(response,fileName);
        try {
            os = response.getOutputStream();
            SXSSFWorkbook workbook = new SXSSFWorkbook();

            //获取该工作区的第一个sheet
            Sheet sheet1 = workbook.createSheet("sheet1");


            //调用合并方法
            rowColMerge(sheet1,Arr,columnList,counts,0,1);

            int excelRow = 0;
            //创建标题行1
            Row titleRow = sheet1.createRow(excelRow++);
            for(int i = 0;i<columnList.size();i++){
                //创建该行下的每一列,并写入标题数据
                Cell cell = titleRow.createCell(i);
                cell.setCellValue(columnList.get(i));
                cell.setCellStyle( setStyle(workbook));
            }

            //创建标题行2
            Row titleRow2 = sheet1.createRow(excelRow++);
            for(int i = 0;i<Arr.size();i++){
                //创建该行下的每一列,并写入标题数据
                Cell cell = titleRow2.createCell(i);
                cell.setCellValue(Arr.get(i));
                cell.setCellStyle(setStyle(workbook));
            }

            //设置行高
            titleRow.setHeight((short) (50*20));
            //设置列宽
            setColSize(sheet1,columnList);





            //设置内容行
            if (datas!=null && datas.size()>0){
                for (int i = 0; i < datas.size(); i++) {
                    Row dataRow = sheet1.createRow(excelRow++);
                    for (int j = 0; j <datas.get(i).size() ; j++) {
                        Cell cell = dataRow.createCell(j);
                        if (String.valueOf(datas.get(i).get("data"+j)).equals("null")){
                            cell.setCellValue(" ");
                        }else {
                            cell.setCellValue(String.valueOf(datas.get(i).get("data"+j)));
                        }
                    }
                }
            }


            workbook.write(os);
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                //关闭输出流
                if (os != null){
                    os.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }



    //头部样式
    private  static CellStyle setStyle(SXSSFWorkbook workbook){
        //标题
        CellStyle titleStyle = workbook.createCellStyle();
        //居中
        titleStyle.setAlignment(HorizontalAlignment.CENTER);
        titleStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        titleStyle.setWrapText(true);
        return titleStyle;
    }





    //根据标题长度设置宽度
    private static void setColSize(Sheet sheet,List<String>oneTitles){
        for (int i = 0; i < oneTitles.size(); i++) {
            sheet.setColumnWidth(i,(int)((50 + 0.72) * (oneTitles.get(i).length()*10+30)));
        }
    }






    //动态合并行列

    /**
     *
     * @param sheet
     * @param list  第二行
     * @param arrList 第一行
     * @param counts  统计合并的列数
     * @param start 开始行
     * @param end   结束行
     */
    private static  void rowColMerge(Sheet sheet, List<String>list, List<String>arrList , List<Map> counts, int start, int end){
        for (int i = 0; i < list.size(); i++) {
            if (list.get(i).equals(" ")){
                sheet.addMergedRegion(new CellRangeAddress(start,end,i,i));
            }
        }

        for (Map count : counts) {
            for (int i = 0; i < arrList.size(); i++) {
                if (count.get("groupName").equals(arrList.get(i))){
                    int endCol = Integer.parseInt(String.valueOf(count.get("count"))) + i -1;
                    sheet.addMergedRegion(new CellRangeAddress(start,start,i,endCol));
                }
            }
        }
    }









    /*
       设置浏览器下载响应头
    */
    private static void setResponseHeader(HttpServletResponse response, String fileName) {
        try {
            try {
                fileName = new String(fileName.getBytes(),"ISO8859-1");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            //添加响应头的跨域信息--开始
            response.addHeader("Access-Control-Allow-Origin", "*");
            response.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
            response.addHeader("Access-Control-Allow-Headers", "Content-Type");
            //添加响应头的跨域信息--结束            URLEncoder.encode(fileName + ".xlsx", "UTF-8"))
            response.setHeader("Content-Disposition", "attachment;filename=".concat(String.valueOf(fileName+".xlsx")));
            response.setContentType("application/vnd.ms-excel;charset=UTF-8");
//
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

三、实例测试

1、测试代码

这里没用数据库,手工生成的一些数据,list 和list2 为头部标题,data为内容,counts为统计的合并的列数。

 @GetMapping("/excel")
    public void testExport(HttpServletResponse response){
        String [] list = {"日期","来源","投诉订单","投诉号码","关联重复订单","原始申诉时间","投诉内容","投诉类型"," ","投诉类型备注","处理意见","处理班组信息"," "," ",};
        String [] list2 = {" "," "," "," "," "," "," ","类型1","类型2"," "," ","处理人1","处理人2","上级领导"};
        List<Map> data = new ArrayList<>();
        for (int i = 0; i < 2; i++) {
            Map map2 = new HashMap();
            for (int j = 0; j < 14; j++) {
                map2.put("data"+j,"8月1日"+j);
            }
            data.add(map2);
        }
        data.get(1).put("data9",null);

        List<Map> counts  = new ArrayList<>();
        Map map = new HashMap();
        map.put("groupName","投诉类型");
        map.put("count",2);
        counts.add(map);
        Map map1 = new HashMap();
        map1.put("groupName","处理班组信息");
        map1.put("count",3);
        counts.add(map1);
        System.out.println(Arrays.toString(list));
        System.out.println(Arrays.toString(list2));
        System.out.println(counts);
        System.out.println(Arrays.toString(list));
        System.out.println(Arrays.toString(list2));

       List<String> listTest = new ArrayList<>(Arrays.asList(list));
        List<String> list2Test = new ArrayList<>(Arrays.asList(list2));


        ExcelUtil.exportExcel(response,"导出测试",listTest,list2Test,counts,data);
    }

2、实例展示

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: Spring Boot使用POI导出Excel可以分为以下几个步骤: 1. 添加POI依赖 在pom.xml文件中添加以下依赖: ``` <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.2</version> </dependency> ``` 2. 创建Excel文件 使用POI创建Excel文件,可以参考以下代码: ``` Workbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet("Sheet1"); Row row = sheet.createRow(); Cell cell = row.createCell(); cell.setCellValue("Hello World"); ``` 3. 导出Excel文件 使用Java IO流将Excel文件导出,可以参考以下代码: ``` response.setContentType("application/vnd.ms-excel"); response.setHeader("Content-Disposition", "attachment;filename=test.xlsx"); workbook.write(response.getOutputStream()); ``` 其中,response是HttpServletResponse对象,用于设置响应头信息。 完整的代码示例可以参考以下链接: https://www.cnblogs.com/zhengbin/p/11210297.html ### 回答2: Springboot是一个非常流行的框架,它提供了很多便利的功能来帮助开发人员快速开发应用程序。其中一个功能是使用POI库来导出Excel文件。POI是一个Java库,提供了读写Microsoft Office格式文件的功能,包括Excel和Word。在本文中,我们将学习如何使用SpringbootPOI库来导出Excel文件。 首先,我们需要在pom.xml文件中添加POI和其他必要的依赖项。以下是一个简单的pom.xml文件中的依赖项列表: ``` <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>5.0.0</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>5.0.0</version> </dependency> </dependencies> ``` 接下来,我们需要创建一个Controller类来处理Excel文件的导出请求。以下是一个示例Controller类: ``` @RestController public class ExcelController { @GetMapping("/export-excel") public void exportExcel(HttpServletResponse response) throws IOException { response.setContentType("application/vnd.ms-excel"); response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"example.xlsx\""); Workbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet("Example Sheet"); Row header = sheet.createRow(0); header.createCell(0).setCellValue("Column 1"); header.createCell(1).setCellValue("Column 2"); Row data = sheet.createRow(1); data.createCell(0).setCellValue("Data 1"); data.createCell(1).setCellValue("Data 2"); workbook.write(response.getOutputStream()); } } ``` 上面的代码中,我们创建了一个GET请求处理程序来导出Excel文件。首先,我们设置响应内容类型为“application/vnd.ms-excel”,该类型用于Excel文件。然后,我们设置响应头,指定文件的名称和类型,以便浏览器可以显示一个下载对话框。 接下来,我们创建一个Workbook对象和一个Sheet对象。在示例中,我们使用XSSFWorkbook和Sheet.createSheet方法创建一个名为“Example Sheet”的工作表。然后,我们创建一个标题行并设置两个列:“Column 1”和“Column 2”文件。接下来,我们创建一个数据行,并使用setCellValue方法在两个单元格中设置值,“Data 1”和“Data 2”。最后,我们将Workbook对象写入response的输出流,从而将Excel文件发送给用户。 总的来说,使用SpringbootPOI导出Excel文件非常简单。我们只需要创建一个Controller类来处理请求和Workbook对象并将其写入响应输出流即可。此外,我们可以更改工作表的样式和内容,以便输出所需的格式。 ### 回答3: SpringBoot作为一款非常流行的Java Web框架,提供了非常多的便捷工具和模块,其中就包括了POI库,让我们可以非常方便地进行Excel文件的导入和导出。下面我将介绍如何使用SpringBootPOI库进行Excel文件的导出。 首先,在pom.xml文件中,我们需要导入POI库的依赖,如下所示: ``` <!-- poi 依赖 --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency> <!-- poi-ooxml 依赖 --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.2</version> </dependency> ``` 这样我们就可以使用POI库提供的工具类进行Excel文件的读写操作了。 接下来,我们需要编写一个Controller来处理Excel文件的导出请求。在Controller中,我们需要使用POI库创建一个Workbook对象,然后在Workbook中添加数据,最后通过Response将Excel文件输出给客户端。下面是一个示例代码。 ``` @RestController public class ExcelController { @GetMapping("/export") public void exportExcel(HttpServletResponse response) { try { // 创建工作簿 Workbook workbook = new XSSFWorkbook(); // 创建表格 Sheet sheet = workbook.createSheet("测试表"); // 添加表头 Row header = sheet.createRow(0); header.createCell(0).setCellValue("姓名"); header.createCell(1).setCellValue("年龄"); // 添加数据 Row row = sheet.createRow(1); row.createCell(0).setCellValue("张三"); row.createCell(1).setCellValue(20); // 输出Excel文件 response.setContentType("application/vnd.ms-excel"); response.setHeader("Content-Disposition", "attachment;filename=test.xlsx"); workbook.write(response.getOutputStream()); workbook.close(); } catch (IOException e) { e.printStackTrace(); } } } ``` 在上述代码中,我们创建了一个名为"测试表"的表格,在表格中添加了表头和数据。最后,我们将Excel文件输出给客户端,通过设置response的ContentType和Content-Disposition实现自动下载。 总之,SpringBootPOI库提供了非常便捷的Excel文件导出功能,我们可以在Controller中轻松地创建Workbook对象、添加数据并输出给客户端。这样就可以很方便地实现数据报表的导出功能了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木偶Mu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值