怎么在springboot中实现excel文件在浏览器下载导出

本文介绍了如何在SpringBoot应用中实现Excel文件的浏览器下载导出。首先,需要导入相关的jar包依赖,可以选择使用poi或easyexcel库。接着,引入必要的工具类文件,包括ExportExcelUtil、ColumnTitleMap和ListToMapListUtils。ExportExcelUtil用于创建Excel,ColumnTitleMap用于设置表头和数据映射,而ListToMapListUtils则帮助将数据库查询结果转化为适合导出的Map列表。最后,在Controller层编写接口方法,通过Service层查询数据库并调用工具类完成Excel的生成和下载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章参考链接:https://blog.youkuaiyun.com/u010277446/article/details/85130087

第一步:导入jar包依赖

注意这里使用的是poi方式还可以利用esayexcel的方法。

 <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-schemas</artifactId>
            <version>3.17</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.17</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.17</version>
        </dependency>
第二步:导入工具类文件

1、导入ExportExcelUtil .java

@Service
public class ExportExcelUtil {

    public void expoerDataExcel(HttpServletResponse response, ArrayList<String> titleKeyList, Map<String, String> titleMap, List<Map<String,Object>> src_list) throws IOException {

        String xlsFile_name = DateUtils.currtimeToString14() + ".xlsx";     //输出xls文件名称
        //内存中只创建100个对象
        Workbook wb = new SXSSFWorkbook(100);           //关键语句
        Sheet sheet = null;     //工作表对象
        Row nRow = null;        //行对象
        Cell nCell = null;      //列对象

        int rowNo = 0;      //总行号
        int pageRowNo = 0;  //页行号

        for (int k=0;k<src_list.size();k++) {
            Map<String,Object> srcMap = src_list.get(k);
            //写入300000条后切换到下个工作表
            if(rowNo%300000==0){
                wb.createSheet("工作簿"+(rowNo/300000));//创建新的sheet对象
                sheet = wb.getSheetAt(rowNo/300000);        //动态指定当前的工作表
                pageRowNo = 0;      //新建了工作表,重置工作表的行号为0
                // -----------定义表头-----------
                nRow = sheet.createRow(pageRowNo++);
                // 列数 titleKeyList.size()
                for(int i=0;i<titleKeyList.size();i++){
                    Cell cell_tem = nRow.createCell(i);
                    cell_tem.setCellValue(titleMap.get(titleKeyList.get(i)));
                }
                rowNo++;
                // ---------------------------
            }
            rowNo++;
            nRow = sheet.createRow(pageRowNo++);    //新建行对象

            // 行,获取cell值
            for(int j=0;j<titleKeyList.size();j++){
                nCell = nRow.createCell(j);
                if (srcMap.get(titleKeyList.get(j)) != null) {
                    nCell.setCellValue(srcMap.get(titleKeyList.get(j)).toString());
                } else {
                    nCell.setCellValue("");
                }
            }
        }
        response.setContentType("application/vnd.ms-excel;charset=utf-8");
        response.setHeader("Content-disposition", "attachment;filename=" + xlsFile_name);
        response.flushBuffer();
        OutputStream outputStream = response.getOutputStream();
        wb.write(response.getOutputStream());
        wb.close();
        outputStream.flush();
        outputStream.close();
    }
}

2、导入ColumnTitleMap .java
这个是表头和数据对应文件,输入你直接的表头参数和中文对照。

public class ColumnTitleMap {
    private Map<String, String> columnTitleMap = new HashMap<String, String>();
    private ArrayList<String> titleKeyList = new ArrayList<String>();

    public ColumnTitleMap(String datatype, List<String> str) {
        switch (datatype) {
            case "AuditLogAlarmItemVo":
                getAuditLogInfoTableData(str);
                break;
            default:
                break;
        }

    }
    /**
     * mysql用户表需要导出字段--显示名称对应集合
     */

    private void getAuditLogInfoTableData(List<String> strParam) {

        AuditLogAlarmItemVo vo=new  AuditLogAlarmItemVo();
        Field[] fields = vo.getClass().getDeclaredFields();//通过反射获取到该对象
        Map<String, String> aLAItemMap = getAuditLogAlarmItemVo();
        Map<String, String> auditLAItemMap=new HashMap<>();
        if(strParam.isEmpty()||strParam.size()==0) {}
        strParam.stream().forEach(str->{
            auditLAItemMap.put(str,"");});
        auditLAItemMap.forEach((s, s2) -> {
            aLAItemMap.forEach((s1, s21) -> {
                if(s.equals(s1)){
                    s21=s2;
                }
            });
        });
        for (Field field : fields) {
            field.setAccessible(true);//当要读取的属性为私有时,要设置为true
            String str= field.getName();//获取对象的属性名
            if(auditLAItemMap.containsKey(str)){
                  if(!str.equals("vendorId")&&!str.equals("softVersion")){
                      if(str.equals("alarmTime")) {
                          titleKeyList.add("fomatTime");
                      }
                      else {
                          titleKeyList.add(str);
                      }
                  }
            }
        }
    }
    public Map<String, String> getAuditLogAlarmItemVo() {
        columnTitleMap.put("alarmId","日志编号");
        columnTitleMap.put("deviceNumber","设备编号");
        columnTitleMap.put("vendorName","厂商");
        columnTitleMap.put("eventType","审日志类型");
        columnTitleMap.put("optType","操作类型");
        columnTitleMap.put("user","操作用户");
        columnTitleMap.put("fomatTime","事件时间");
        columnTitleMap.put("message","日志详情");
        return columnTitleMap;
    }


    public Map<String, String> getColumnTitleMap() {
        return columnTitleMap;
    }
    public ArrayList<String> getTitleKeyList() {
        return titleKeyList;
    }
}

3、导入ListToMapListUtils.java
该文件是数据库查询到的对象集合,然后需要把对象集合转换为map<String,object>的形式就调用该类中的方法。

public class ListToMapListUtils {
    public static  <T> List<Map<String, Object>> objectList2ListMap(List<T> objectList) throws Exception {
        ArrayList<Map<String, Object>> resultList = new ArrayList<>();
        Map<String, Object> map = new HashMap<>();
        for (T t : objectList) {
            resultList.add(object2Map(t));
        }
        return resultList;
    }
    public static Map<String,Object> object2Map(Object obj) throws Exception{
        Map<String,Object> map = new HashMap<String, Object>();
        Field[] fields = obj.getClass().getDeclaredFields();
        for(Field field:fields){
            field.setAccessible(true);
            map.put(field.getName(), field.get(obj));
        }
        return map;
    }
}

4、在controller中写接口实现方法
注意接口中利用service服务层查数据库需要写自己的数据库服务层查询方法。

@GetMapping("test/exportByPage")
    public String getAuditLogListByPage(
            HttpServletResponse response,
            @SpringQueryMap @Valid AuditAlarmQueryParam queryParam
    ) throws IOException {
        try {
            CommonPageResult<AuditLogAlarmItemVo> re = alarmService.getAuditInfo(queryParam);
            List<AuditLogAlarmItemVo> items = re.getItems();
            items.stream().forEach(a->{
                Date date = new Date(a.getAlarmTime());
                String format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
                a.setFomatTime(format);
            });
            List<Map<String, Object>> maps = ListToMapListUtils.objectList2ListMap(items);
            String  ss= queryParam.getTableHead();        
            String[] tableHead1 = ss.split(",");
            List<String> tableHead= Arrays.asList(tableHead1);
            ArrayList<String> titleKeyList = new ColumnTitleMap("AuditLogAlarmItemVo",tableHead).getTitleKeyList();
            Map<String, String> titleMap = new ColumnTitleMap("AuditLogAlarmItemVo",tableHead).getColumnTitleMap();
           exportExcelUtil.expoerDataExcel(response, titleKeyList, titleMap, maps);
        } catch (Exception e) {
            System.out.println(e.toString());
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值