/**
* 写Excel文件
*
* @param data 数据
* @param configs 列配置
* @param destFile 目标文件
* @param templateFile 模板文件
* @param onlyAlias 是否仅写出有别名的列
* @param isWriteKeyAsHead 是否写出标题行
* @return excel写对象
*/
private static BigExcelWriter writerExcel(Collection data, List<ExcelColumnConfig> configs, File destFile, File templateFile, boolean onlyAlias, boolean isWriteKeyAsHead, int startRowIndex) {
BigExcelWriter writer = null;
if (templateFile != null) {
//根据模板写数据
try {
SXSSFWorkbook sxssfWorkbook = new SXSSFWorkbook(new XSSFWorkbook(templateFile), -1);
writer = new BigExcelWriter(sxssfWorkbook, "sheet1");
} catch (Exception ex) {
log.error("构造BigExcelWriter异常:", ex);
}
log.info("exportExcel templateFile:" + templateFile);
} else {
//直接根据目标文件写数据
writer = new BigExcelWriter(-1);
log.info("exportExcel destFile:" + destFile);
}
//添加列别名
if (CollUtil.isNotEmpty(configs)) {
for (ExcelColumnConfig config : configs) {
writer.addHeaderAlias(config.getOrigin(), config.getAlias());
}
}
//设置起始行
writer.setCurrentRow(startRowIndex);
// 只写出加了别名的字段
writer.setOnlyAlias(onlyAlias);
// 写入数据
writer.write(data, isWriteKeyAsHead);
// 调整列样式(在写入数据后方可调整样式)
if (CollUtil.isNotEmpty(configs)) {
//从标题行下一行开始覆写整列单元格样式
if (isWriteKeyAsHead) {
startRowIndex++;
}
int columnIndex = 0;
for (ExcelColumnConfig config : configs) {
//创建新样式
CellStyle cellStyle = writer.createCellStyle();
//设置边框
StyleUtil.setBorder(cellStyle, BorderStyle.THIN, IndexedColors.BLACK);
//设置对齐方式
if (config.getHorizontalAlignment() != null) {
cellStyle.setAlignment(config.getHorizontalAlignment());
cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
}
//设置数据格式
if (config.getFmt() != null) {
cellStyle.setDataFormat(config.getFmt());
}
writer.setColumnStyleIfHasData(columnIndex, startRowIndex, cellStyle);
//列号递增
columnIndex++;
}
}
//手动设置目标输出文件
writer.setDestFile(destFile);
log.info("exportExcel destFile:" + destFile);
return writer;
}
@Data
@Accessors(chain = true)
public class ExcelColumnConfig {
/**
* 属性名
*/
private String origin;
/**
* 列名
*/
private String alias;
/**
* 水平对齐方式
*/
private HorizontalAlignment horizontalAlignment;
/**
* 数据格式
*
* @see BuiltinFormats
*/
private Short fmt;
/**
* 快速创建配置对象
*
* @param origin 属性名
* @param alias 别名
* @return 新建对象
*/
public static ExcelColumnConfig makeConfig(String origin, String alias) {
return new ExcelColumnConfig().setOrigin(origin).setAlias(alias);
}
/**
* 快速创建配置对象
*
* @param origin 属性名
* @param alias 别名
* @param horizontalAlignment 水平对齐方式
* @return 新建对象
*/
public static ExcelColumnConfig makeConfig(String origin, String alias, HorizontalAlignment horizontalAlignment) {
return new ExcelColumnConfig().setOrigin(origin).setAlias(alias).setHorizontalAlignment(horizontalAlignment);
}
}