前言
在工作经常会遇到excel导出报表的功能,自己也做过一些,然后在项目里看到同事封装的一个excel导出工具类,着实不错,拿来分享一下。然后,又在网上看到一个使用easypoi实现cxcel导出的博客,于是自己也仿着搞了一下,在这也分享一下。
使用POI实现excel导出
首先,引入jar包,这是POI需要的jar包。
org.apache.poi
poi
3.17
下面是主要的实现方法。
定义一个函数式接口,用于自定义格式。
package com.mz.util;
import java.io.IOException;
/**
* @version V1.0
* @Description:
* @date 2018/10/31 17:16
*/
@FunctionalInterface
public interface ExportConsumer {
/**
*自定义导出数据拼装
* @param fileOut 输出流
* @param wb workbook对象
* @param listData 数据集
* @throws IOException
*/
void accept(ByteArrayOutputStream fileOut, Workbook wb, List listData) throws IOException;
}
工具类主要方法
package com.mz.util;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.List;
public class POIExportUtil {
/**
* 导出excel
*
* @param fileOut 输出流
* @param wb excel workbook对象
* @param listData 需要导出的数据
* @param consumer 自定义导出excel的格式
* @param fileName 文件名
* @return ResponseEntity
* @throws IOException
*/
public static ResponseEntity exportExcel(ByteArrayOutputStream fileOut,
Workbook wb,
List listData,
String fileName,
ExportConsumer> consumer) throws IOException {
consumer.accept(fileOut, wb, listData);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
headers.setContentDispositionFormData("attachment", new String((fileName + ".xls").getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1));
return new ResponseEntity<>(fileOut.toByteArray(), headers, HttpStatus.OK);
}
}
使用案例,页面通过标签访即可。
//表头字段名
private static final String[] COLUMN_NAMES = {"序号", "单号/流水号", "PNR", "业务类", "发生时间", "付款科目", "总金额",
"预存款期初金额", "预存款发生金额", "预存款期末金额", "授信期初金额", "授信发生金额", "授信期末金额",
"协议欠款期初金额", "协议欠款发生金额", "协议欠款期末金额", "分销商", "操作员"};
/**
* 导出流水报表
* @param request
* @return
*/
@Override
public ResponseEntity exportExcel(TradDetailRequest request) {
ByteArrayOutputStream fileout = new ByteArrayOutputStream();
try {
//数据库的数据
List tradeDetailForExport = tradedetailMapper.getTradeDetailForExport(request);
//创建workbook对象
Workbook wb = new HSSFWorkbook();
return POIExportUtil.exportExcel(fileout, wb, tradeDetailForExport, "流水记录报表",
(out, workbook, data) -> createCell(wb, data).write