easyPoi导出Excel横向合并、纵向合并
多sheet导出
定义sheet工具类
public Workbook exportExcel(ExcelDto dto){
List<Map<String, Object>> sheetsList = new ArrayList<>();
if(null!=dto && dto.getSheet().size()>0){
dto.getSheet().forEach(sheet->{
ExportParams exportParams = new ExportParams();
exportParams.setSheetName(sheet.getName());
exportParams.setStyle(ExcelStyleUtil.class);
Map<String, Object> dataMap = new HashMap<>(4);
// title的参数为ExportParams类型
dataMap.put("title", exportParams);
// 模版导出对应得实体类型
dataMap.put("entity", sheet.getObject());
// sheet中要填充得数据
dataMap.put("data", sheet.getData());
sheetsList.add(dataMap);
});
}
return ExcelExportUtil.exportExcel(sheetsList, ExcelType.HSSF);
}
ExcelDto
@Data
public class ExcelDto {
@ApiModelProperty("excel名称")
private String excelName;
@ApiModelProperty("sheet信息")
private List<ExcelSheetDto> sheet;
}
ExcelSheetDto
@Data
public class ExcelSheetDto {
@ApiModelProperty("sheetName")
private String name;
@ApiModelProperty("映射Excel dto")
private Object object;
@ApiModelProperty("表格数据")
private List data;
}
多sheet导出
ExcelDto dto = new ExcelDto();
dto.setExcelName("某某报表");
List<ExcelSheetDto> sheets = new ArrayList<>();
ExcelSheetDto sheet = new ExcelSheetDto();
sheet.setName("sheet1");
sheet.setData(biOverviewDto.getPowerTDAS());
sheet.setObject(BIpowerTDASDto.class);
sheets.add(sheet);
ExcelSheetDto sheet1 = new ExcelSheetDto();
sheet1.setName("sheet2");
sheet1.setData(biOverviewDto.getPerformance());
sheet1.setObject(BIPerformanceDto.class);
sheets.add(sheet1);
dto.setSheet(sheets);
Workbook workbook =sheetUtils.exportExcel(dto);
ExcelUtil.downLoadExcel(dto.getExcelName()+".xls",response,workbook);
效果展示
纵向合并
@Excel(name = "市场主体",mergeVertical=true,width = 20)
mergeVertical boolean 默认fasle 纵向合并内容相同的单元格
横向合并
Workbook workbook =sheetUtils.exportExcel(dto);
CellRangeAddress craOne = new CellRangeAddress(0, 1, 0, 1);
//CellRangeAddress(第几行开始,第几行结束,第几列开始,第几列结束)
workbook.getSheetAt(0).addMergedRegion(craOne);
效果展示
附带excel样式工具类
public class ExcelStyleUtil implements IExcelExportStyler {
private static final short STRING_FORMAT = (short) BuiltinFormats.getBuiltinFormat("TEXT");
private static final short FONT_SIZE_TEN = 10;
private static final short FONT_SIZE_ELEVEN = 11;
private static final short FONT_SIZE_TWELVE = 12;
/**
* 大标题样式
*/
private CellStyle headerStyle;
/**
* 每列标题样式
*/
private CellStyle titleStyle;
/**
* 数据行样式
*/
private CellStyle styles;
public ExcelStyleUtil(Workbook workbook) {
this.init(workbook);
}
/**
* 初始化样式
* @param workbook
*/
private void init(Workbook workbook) {
this.headerStyle = initHeaderStyle(workbook);
this.titleStyle = initTitleStyle(workbook);
this.styles = initStyles(workbook);
}
/**
* 大标题样式
* @param color
* @return
*/
@Override
public CellStyle getHeaderStyle(short color) {
return headerStyle;
}
/**
* 每列标题样式
* @param color
* @return
*/
@Override
public CellStyle getTitleStyle(short color) {
return titleStyle;
}
/**
* 数据行样式
* @param parity 可以用来表示奇偶行
* @param entity 数据内容
* @return 样式
*/
@Override
public CellStyle getStyles(boolean parity, ExcelExportEntity entity) {
return styles;
}
/**
* 获取样式方法
* @param dataRow 数据行
* @param obj 对象
* @param data 数据
*/
@Override
public CellStyle getStyles(Cell cell, int dataRow, ExcelExportEntity entity, Object obj, Object data) {
return getStyles(true, entity);
}
/**
* 模板使用的样式设置
*/
@Override
public CellStyle getTemplateStyles(boolean isSingle, ExcelForEachParams excelForEachParams) {
return null;
}
/**
* 初始化--大标题样式
* @param workbook
* @return
*/
private CellStyle initHeaderStyle(Workbook workbook) {
CellStyle style = getBaseCellStyle(workbook);
style.setFont(getFont(workbook, FONT_SIZE_TWELVE, true));
return style;
}
/**
* 初始化--每列标题样式
* @param workbook
* @return
*/
private CellStyle initTitleStyle(Workbook workbook) {
CellStyle style = getBaseCellStyle(workbook);
style.setFont(getFont(workbook, FONT_SIZE_ELEVEN, false));
//背景色
style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
return style;
}
/**
* 初始化--数据行样式
* @param workbook
* @return
*/
private CellStyle initStyles(Workbook workbook) {
CellStyle style = getBaseCellStyle(workbook);
style.setFont(getFont(workbook, FONT_SIZE_TEN, false));
style.setDataFormat(STRING_FORMAT);
return style;
}
/**
* 基础样式
* @return
*/
private CellStyle getBaseCellStyle(Workbook workbook) {
CellStyle style = workbook.createCellStyle();
//下边框
style.setBorderBottom(BorderStyle.THIN);
//左边框
style.setBorderLeft(BorderStyle.THIN);
//上边框
style.setBorderTop(BorderStyle.THIN);
//右边框
style.setBorderRight(BorderStyle.THIN);
//水平居中
style.setAlignment(HorizontalAlignment.CENTER);
//上下居中
style.setVerticalAlignment(VerticalAlignment.CENTER);
//设置自动换行
style.setWrapText(false);
return style;
}
/**
* 字体样式
* @param size 字体大小
* @param isBold 是否加粗
* @return
*/
private Font getFont(Workbook workbook, short size, boolean isBold) {
Font font = workbook.createFont();
//字体样式
font.setFontName("宋体");
//是否加粗
font.setBold(isBold);
//字体大小
font.setFontHeightInPoints(size);
return font;
}
}
求大神指点优化写法