poi导出数据到excel(实战)

需求:设置一个导出按钮。将当前页面指定数据(格式为 List<Map<String,Object>>)导出到.excel的文件中。(map的key就是单元格第一行的标题,value就是每行的值)

例子:一个工具类

package xxx.xxx.xxx

import lombok.extern.slf4j.Slf4j;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.*;

/**
 * 导出map数据格式到Excel
 * @Author guoshilun
 * @create 2022/10/25 8:09 下午
 */
@Slf4j
public class MapExcelUtils {
    private static MapExcelUtils instance = new MapExcelUtils();

    public MapExcelUtils(){}

    public static MapExcelUtils getInstance(){
        return instance;
    }

    /**
     * 将 List<Map<String,Object>> 类型的数据导出为 Excel
     * 下载路径默认为桌面
     *
     * @param mapList 源数据
     * @return 字节数据
     */
    public byte[] createExcel(List<Map<String, Object>> mapList) throws IOException {
        //获取表头数据
        Map<String, Object> map = mapList.get(0);
        Set<String> stringSet = map.keySet();
        ArrayList<String> headList = new ArrayList<>(stringSet);

        //定义一个工作薄
        XSSFWorkbook workbook = new XSSFWorkbook();

        //创建一个sheet页
        XSSFSheet sheet = workbook.createSheet();

        //设置第一行
        XSSFRow row = sheet.createRow(0);
        //获取源数据给第一行设置值
        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++){
            //创建一行
            rows = sheet.createRow(i+1);
            //给该行赋值
            for(int j = 0; j<headList.size(); j++){
                Object object = mapList.get(i).get(headList.get(j));
                if(Objects.isNull(object)){
                    cells = rows.createCell(j);
                    cells.setCellValue("");
                }else {
                    cells = rows.createCell(j);
                    cells.setCellValue(object.toString());
                }

            }
        }

        //创建一个输出流
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        try {
        	//将创建好的excel表格 写到输出流中
            workbook.write(bos);
            //返回字节
            return bos.toByteArray();
        } catch (IOException e) {
            e.getMessage();
        }finally {
            bos.close();
        }

    }
}

例子:一个调用

/**
 * @author chenwei
 */
@RestController
@RequestMapping(value = "/aaa/bbb")
public class DemandController {
	 /**
     * 测试导出
     * @param demandBizParam 列表查询过滤条件
     */
    @GetMapping(value = "/test/export")
    public void demandBizExport(DemandBizParam demandBizParam,HttpServletResponse response) throws IOException {
        //自己给导出数据赋值!!!
        List<Map<String,Object>> demandExport = new ArrayList();
        
        if(CollectionUtils.isNotEmpty(demandExport)){
            //调用工具类获取字节
            byte[] bytes = MapExcelUtils.getInstance().createExcel(demandExport, "需求单导出", null);
            //设置内容为二进制;格式为utf-8
            response.setContentType("application/binary;charset=UTF-8");
            //扩展名为.*的文件( 二进制流,不知道下载文件类型)
            response.setHeader("media-type", MediaType.APPLICATION_OCTET_STREAM.getType());
            //将请求获得的内容存到这个文件中
            response.setHeader("Content-disposition", "attachment; filename=" + "需求单导出" + System.currentTimeMillis() + ".xlsx");
            ServletOutputStream out = response.getOutputStream();
            //数据写到文件中
            out.write(bytes);
            out.flush();
            out.close();
        }
    }
}

总价:poi有HSSFWorkbook < XSSFWorkbook < SXSSFWorkbook。本次使用XSSFWorkbook,当然可以控制.excel中字体样式、颜色、表格长宽等excel基本设置。相关资料可自行查询。

下次写导入excel中数据到db~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值