Java 将List<Map<String, Object>>导出为excel

前言:导出excel是开发过程中一个非常常用的技能,使用EasyExcel导出十分简单,但仅能将对象导出为excel,那么这里带来的是使用poi将List<Map<String,Object>>导出为excel,并返回二进制流给前端。

  1. pom.xml 添加依赖
        <!--poi start-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.15</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-schemas</artifactId>
            <version>3.15</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.15</version>
        </dependency>
        <!--poi end-->

2.新建 ExcelUtils 类, 用于导出excel


package com.matemro.dwmai.modular.util;
 
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.*;
 
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
 
/**
 * @author yjc
 * @date 2022/9/28
 */
public class ExcelUtils {
 
    /**
     * 将 List<Map<String,Object>> 类型的数据导出为 Excel
     */
    public static void  createExcel(List<Map<String, Object>> mapList, String filename, String title, HttpServletResponse response) {
        //获取数据源的 key, 用于获取列数及设置标题
        Map<String, Object> map = mapList.get(0);
        Set<String> stringSet = map.keySet();
        ArrayList<String> headList = new ArrayList<>(stringSet);
 
        //定义一个新的工作簿
        XSSFWorkbook wb = new XSSFWorkbook();
        //创建一个Sheet页
        XSSFSheet sheet = wb.createSheet(title);
        //设置行高
        sheet.setDefaultRowHeight((short) (2 * 256));
        //为有数据的每列设置列宽
        for (int i = 0; i < headList.size(); i++) {
            sheet.setColumnWidth(i, 8000);
        }
        //设置单元格字体样式
        XSSFFont font = wb.createFont();
        font.setFontName("等线");
        font.setFontHeightInPoints((short) 16);
 
        //在sheet里创建第一行,并设置单元格内容为 title (标题)
        XSSFRow titleRow = sheet.createRow(0);
        XSSFCell titleCell = titleRow.createCell(0);
        titleCell.setCellValue(title);
        //合并单元格CellRangeAddress构造参数依次表示起始行,截至行,起始列, 截至列
        sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, headList.size() - 1));
        // 创建单元格文字居中样式并设置标题单元格居中
        XSSFCellStyle cellStyle = wb.createCellStyle();
        cellStyle.setAlignment(HorizontalAlignment.CENTER);
        titleCell.setCellStyle(cellStyle);
 
        //获得表格第二行
        XSSFRow row = sheet.createRow(1);
        //根据数据源信息给第二行每一列设置标题
        for (int i = 0; i < headList.size(); i++) {
            XSSFCell cell = row.createCell(i);
            cell.setCellValue(headList.get(i));
        }
 
        XSSFRow rows;
        XSSFCell cells;
        //循环拿到的数据给所有行每一列设置对应的值
        for (int i = 0; i < mapList.size(); i++) {
            //在这个sheet页里创建一行
            rows = sheet.createRow(i + 2);
            //给该行数据赋值
            for (int j = 0; j < headList.size(); j++) {
                String value;
                if (mapList.get(i).get(headList.get(j)) !=null){
                     value = mapList.get(i).get(headList.get(j)).toString();
                }else {
                    value = "";
                }
                cells = rows.createCell(j);
                cells.setCellValue(value);
            }
        }
 
        try {
            response.setContentType("application/vnd.ms-excel");
            response.setHeader("Content-Disposition", "attachment;filename="
                    .concat(filename));
            OutputStream out = response.getOutputStream();
 
            wb.write(out);
            wb.close();
            out.close();;
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
}

3.编写测试Controller

/**
     * 导出excel
     * @param response
     * @return
     */
    @PostMapping(name = "导出", path = "/excel")
    public void resultExport(HttpServletResponse response) {
 
        List<Map<String,Object>> list = new ArrayList<>();
        Map<String,Object> map = new HashMap<>();
        map.put("名称","iphone13");
        map.put("属性1",1);
        map.put("属性2",2);
        map.put("属性3",3);
 
        Map<String,Object> map1 = new HashMap<>();
        map1.put("名称","iphone12");
        map1.put("属性1",1);
        map1.put("属性2",2);
        map1.put("属性3",3);
 
        Map<String,Object> map2 = new HashMap<>();
        map2.put("名称","iphone11");
        map2.put("属性1",1);
        map2.put("属性3",3);
 
        list.add(map);
        list.add(map1);
        list.add(map2);
 
        ExcelUtils.getInstance().createExcel(list, "testExcel.xls", "测试文档", response);
    }

4.用postman调用测试。结果返回的是二进制流,点击save to a file将文件保存下来
在这里插入图片描述

5.最终导出结果
在这里插入图片描述

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
EasyExcel 是一个基于 Apache POI 的 Java Excel 操作库,它能够方便地导入导出 Excel 文件。要导出 List<Map<String, Object>> 到 Excel,可以按以下步骤操作: 1. 首先,确保已经引入 EasyExcel 的依赖。你可以在 Maven 或者 Gradle 中添加以下依赖: ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.3.0</version> </dependency> ``` 2. 创建一个包含数据的 List<Map<String, Object>>,每个 Map 对应一条数据记录,键为列名,值为对应的数据。 3. 使用 EasyExcel 提供的 API 进行导出。下面是一个简单的示例代码: ```java // 创建数据列表 List<Map<String, Object>> dataList = new ArrayList<>(); // 添加数据记录 Map<String, Object> data1 = new LinkedHashMap<>(); data1.put("name", "John"); data1.put("age", 25); dataList.add(data1); Map<String, Object> data2 = new LinkedHashMap<>(); data2.put("name", "Alice"); data2.put("age", 30); dataList.add(data2); // 定义导出的文件路径和文件名 String fileName = "data.xlsx"; // 定义 Excel 表的表头 List<String> header = new ArrayList<>(); header.add("姓名"); header.add("年龄"); // 导出 Excel ExcelWriter excelWriter = EasyExcel.write(fileName).build(); WriteSheet writeSheet = EasyExcel.writerSheet(0, "Sheet1").build(); excelWriter.write(dataList, writeSheet); excelWriter.close(); ``` 在这个示例中,我们创建了一个 dataList,包含两条数据记录。然后定义了 Excel 的表头,在导出时使用 EasyExcel 的 API 将数据写入 Excel 文件中。 最后,通过 ExcelWriter 对象的 close() 方法关闭文件流,完成导出操作。导出Excel 文件将保存在指定的路径和文件名下。 请注意,以上代码仅为示例,实际的导出操作可能需要根据你的业务需求进行适当的修改。希望能对你有所帮助!如果还有其他问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值