平时做excel文件导出功能,都是一般的平常表头加上数据。
学号 | 姓名 | 年龄 | 成绩 |
100001 | 张三 | 12 | 99 |
但是最近一个需求需要将表头的第一个单元画出斜线分割。
看到需求的第一想法,就是找到Cell单元格对象,然后设置单元格的样式。
由于原始代码使用阿里巴巴的EasyExcel组件,于是参考资料写Excel | Easy Excel
本次项目依赖为
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.3.2</version>
</dependency>
public void test() {
File file = new File("test"+System.currentTimeMillis()+".xlsx");
EasyExcel.write(file).autoCloseStream(true)
.registerWriteHandler(new CellWriteHandler() {
@Override
public void afterCellDispose(CellWriteHandlerContext context) {
Cell cell = context.getCell();
if (cell.getRowIndex() == 0 && cell.getColumnIndex() == 0) {
// 获取A1单元格
WriteCellData<?> cellData = context.getFirstCellData();
// 这里需要去cellData 获取样式
// 很重要的一个原因是 WriteCellStyle 和 dataFormatData绑定的 简单的说 比如你加了 DateTimeFormat
// ,已经将writeCellStyle里面的dataFormatData 改了 如果你自己new了一个WriteCellStyle,可能注解的样式就失效了
// 然后 getOrCreateStyle 用于返回一个样式,如果为空,则创建一个后返回
WriteCellStyle writeCellStyle = cellData.getOrCreateStyle();
writeCellStyle.setHorizontalAlignment(HorizontalAlignment.LEFT);
writeCellStyle.setFillBackgroundColor((short) 1);
// 这样样式就设置好了 后面有个FillStyleCellWriteHandler 默认会将 WriteCellStyle 设置到 cell里面去 所以可以不用管了
SXSSFSheet sheet = (SXSSFSheet) cell.getSheet();
sheet.setColumnWidth(0, 15 * 256);
sheet.createDrawingPatriarch();
XSSFDrawing drawingPatriarch = sheet.getDrawingPatriarch();
XSSFClientAnchor anchor = drawingPatriarch.createAnchor(0, 0, 0, 0, 0, 0, 1, 1);
XSSFSimpleShape simpleShape = drawingPatriarch.createSimpleShape(anchor);
simpleShape.setShapeType(ShapeTypes.LINE);
simpleShape.setLineWidth(0.5);
simpleShape.setLineStyle(0);
simpleShape.setLineStyleColor(0, 0, 0);
}
}
}).excelType(ExcelTypeEnum.XLSX)
.sheet("testline")
.head(head())
.doWrite(new ArrayList<>());
}
private List<List<String>> head() {
List<List<String>> head = new ArrayList<>();
head.add(ListUtils.newArrayList(" 成绩\n班级"));
head.add(ListUtils.newArrayList("优秀"));
head.add(ListUtils.newArrayList("良好"));
head.add(ListUtils.newArrayList("合格"));
return head;
}
最终效果: