springboot poi导出excel表格

第一步导包:
maven仓库:https://mvnrepository.com/artifact/org.apache.poi/poi/3.17

maven方式:
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.17</version>
</dependency>


gradle方式:
// https://mvnrepository.com/artifact/org.apache.poi/poi
compile group: 'org.apache.poi', name: 'poi', version: '3.17'

首先我们要构造一个excel表结构:由于很多其他的博文会给excel表的字体、样式下功夫.导致小白会觉得有点画蛇添足,我们先考虑完成导出excel表这个需求才能考虑继续深造。
构造一个表从两方面考虑,一方面是结构,一方面是数据。
下面这个工具栏提供的方法很简单,就是传入一个excel表名,excel每一列的列名,一个数据集,以及在数据集中每个字段映射的key,其实也可以不用传这个key,但是为了表结构更加清晰,以及更容易获取数据,我们传多一个key数组。

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;

import java.util.List;
import java.util.Map;

/**
 * 生成Excel文件的工具类
 * @author weiyuwang
 */
public class ExcelUtil {

    /**
     * 创建excel文档,
     * @param excelName excel的表名
     * @param list 数据,相当于每一行,而map的key代表了单元格的字段,value则是值
     * @param keys list中map的key数组集合
     * @param columnNames excel的列名
     * */
    public static Workbook createWorkBook(String excelName,List<Map<String, Object>> list, String[] keys, String[] columnNames) {
        // 创建excel工作簿
        HSSFWorkbook wb = new HSSFWorkbook();
        // 创建第一个sheet(页),并命名
        Sheet sheet = wb.createSheet(excelName);
        // 创建第一行
        Row firstRow = sheet.createRow(0);
        //设置列名
        for(int i=0;i<columnNames.length;i++){
            Cell cell = firstRow.createCell(i);
            cell.setCellValue(columnNames[i]);
        }
        //设置每行每列的值
        for (int i = 0; i < list.size(); i++) {
            // Row 行,Cell 方格 , Row从1开始,因为第一行用来存放了列名,cell从0开始
            // 创建一行,在页sheet上
            Row row = sheet.createRow( i+1);
            // 在row行上创建一个方格
            for(int j=0;j<keys.length;j++){
                Cell cell = row.createCell(j);
                cell.setCellValue(list.get(i).get(keys[j]) == null?" ": list.get(i).get(keys[j]).toString());
            }
        }
        return wb;
    }

}

接下来是controller,这里一开始我用的是post方法,但是这种方法本地不知道怎么测试,后来我改成了get方法,将post方法注释了。
其实表结构确定了,接下来主要是数据的封装。也就是要构建一个List<Map<String, Object>> datas ,由于每个人要封装的数据不一样,这里就不对mapper,entity 再做叙述。
其实我个菜鸡一直不知道原来这里也可以用response的,所以看了很多相关博文都不知道怎么下手,然后走投无路尝试了一下发现可以用hhh。这里我点一下,避免一些和我一样在努力学习但是还是比较菜的小伙伴不知道。

    /**
     * export excel
     */
    @RequestMapping(value = "/export")
//    public void export(@RequestBody GoalExportEntity request,HttpServletResponse response) {
        public void export(HttpServletResponse response) {

        String excelName = "公司指标";
        String[] columnName = new String[]{"考核对象","总计","1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"};
        String[] keys = new String[]{"name","total","1","2","3","4","5","6","7","8","9","10","11","12"};

        try{

            //设置excel表的数据:
            List<Map<String, Object>> datas = new ArrayList<>();
//            List<GoalSettingEntity> list = goalMapper.findByIdAndYearCombine(request.getGoalId(), request.getYear());
            List<GoalSettingEntity> list = goalMapper.findByIdAndYearCombine(13, 2018);
            for (GoalSettingEntity entity : list) {
                Map<String, Object> map = JsonUtil.toObjectMap((entity.getGoalInfo()));
                Integer total = 0;
                for (Object s : map.values()) {
                    total += (Integer)s;
                }
                map.put("total", total.toString());
                map.put("name",entity.getName());
                datas.add(map);
            }

            Workbook workBook = ExcelUtil.createWorkBook(excelName, datas, keys, columnName);
            response.setHeader("content-Type", "application/vnd.ms-excel");
            response.setHeader("Content-disposition", "attachment;filename=createList.xls");//默认Excel名称
            response.flushBuffer();
            ServletOutputStream outputStream = response.getOutputStream();
            workBook.write(outputStream);
            workBook.close();
            outputStream.close();

        } catch (Exception e){
            e.printStackTrace();
        }

    }

这里写图片描述

猜你喜欢

转载自blog.csdn.net/saywhat_sayhello/article/details/81024000