导出Excel文件
最近又写了一个有关生成excel文件并导出的需求,下面总结下我所遇到的有关导出excel的方法。
poi方式
写个ExcelUtil工具类
@Slf4j
public class ExcelUtil {
public static final String XLSX = ".xlsx";
public static final String XLS = ".xls";
/**
* GBK编码.
*/
public static final String CHARSET_GBK = "GBK";
/**
* Excel导出使用的字体名称.
*/
private static final String FONT_NAME = "黑体";
@Data
@Builder
public static class ExcelData {
/**
* sheet名称
*/
private String sheetName;
/**
* 标题
*/
private String titleName;
/**
* 列名
*/
private String[] colsName;
/**
* 数据二维数组,第一维代表一行,第二维是每列
*/
private List<List<Object>> dataList;
}
/**
* 导出Excel(支持多sheet页).
*
* @param excelDataList excel数据
* @param fileName 文件名
* @param file 文件
* @param uuid 请求流水
* @throws IOException 异常
*/
public static void export(final List<ExcelData> excelDataList, final String fileName, final File file, final String uuid) throws IOException {
OutputStream out = new FileOutputStream(file);
// 第一步,创建一个webbook
Workbook wb;
if (fileName.endsWith(XLS)) {
wb = new HSSFWorkbook();
} else {
wb = new XSSFWorkbook();
}
// 循环写入sheet
for (ExcelData excelData : excelDataList) {
export(wb, excelData.getSheetName(), excelData.getTitleName(), excelData.getColsName(), excelData.getDataList());
}
// 最终 将文件写出到输出流
try {
wb.write(out);
log.info("[请求流水:{},fileName:{}]导出Excel成功", uuid, fileName);
} finally {
IOUtils.closeQuietly(out);
}
}
/**
* 导出数据到Excel.
*
* @param sheetName sheet页名字
* @param title 标题
* @param colsName 列名数组
* @param dataList 数据二位数组,第一维代表一行,第二维是每列
*/
private static void export(Workbook wb, final String sheetName, final String title, final String[] colsName,
final List<List<Object>> dataList) {
// 第二步,在webbook中添加一个sheet,对应Excel文件中的sheet
Sheet sheet = wb.createSheet(sheetName);
// 第三步创建标题行
final Row titleRow = sheet.createRow(0);
// 设备标题的高度
titleRow.setHeightInPoints(25);
// 设计标题样式
final CellStyle titleStyle = wb.createCellStyle();
titleStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
titleStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
titleStyle.setFillForegroundColor(HSSFColor.LIGHT_TURQUOISE.index);
titleStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
// 设置标题字