EasyExcel 复杂表格

小小码农 2023年05月03日 938次浏览

导出

导出比较简单,如果加入自定义的东西,样式、合并等可参考下边,追加至registerWriteHandler里即可。

 EasyExcel.write(response.getOutputStream())
                    // 这里放入动态头
                    .head(header).sheet("Sheet1").registerWriteHandler(WriteCellStyle()).registerWriteHandler(new ExcelMergeStrategy()).registerWriteHandler(new ExcelWidthStyleStrategy())
                    .doWrite(dataList);

样式

HorizontalCellStyleStrategy类,构造参数是headWriteCellStylecontentWriteCellStyle,分别为表头样式和内容样式

    private HorizontalCellStyleStrategy WriteCellStyle() {
        WriteCellStyle writeCellStyle = new WriteCellStyle();
        writeCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        writeCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
        writeCellStyle.setBorderBottom(BorderStyle.THIN);
        writeCellStyle.setBorderLeft(BorderStyle.THIN);
        writeCellStyle.setBorderRight(BorderStyle.THIN);
        writeCellStyle.setBorderTop(BorderStyle.THIN);
        HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(writeCellStyle, writeCellStyle);
        return horizontalCellStyleStrategy;
    }

自适应列宽

AbstractColumnWidthStyleStrategy类,具体实现可自定义

    class ExcelWidthStyleStrategy extends AbstractColumnWidthStyleStrategy {
        @Override
        protected void setColumnWidth(WriteSheetHolder writeSheetHolder, List<CellData> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {


            boolean needSetWidth = isHead && cell.getColumnIndex() < 2;
            if (needSetWidth) {
                writeSheetHolder.getSheet().setColumnWidth(cell.getColumnIndex(), 5000);
            }
        }
    }

合并单元格

AbstractMergeStrategy类,具体情况具体分析,主要是colIndexrowIndex

    class ExcelMergeStrategy extends AbstractMergeStrategy {

        @Override
        protected void merge(Sheet sheet, Cell cell, Head head, Integer relativeRowIndex) {
            int colIndex = cell.getColumnIndex();
            int rowIndex = dateType.equals("year") ? cell.getRowIndex() - 1 : cell.getRowIndex();
            if (colIndex == 0 && rowIndex % 3 == 0) {
                //System.out.println(cell.getRowIndex());
                CellRangeAddress cellAddresses1 = new CellRangeAddress(cell.getRowIndex() - 2, cell.getRowIndex(), 0, 0);
                CellRangeAddress cellAddresses2 = new CellRangeAddress(cell.getRowIndex() - 2, cell.getRowIndex(), 1, 1);
                CellRangeAddress cellAddresses3 = new CellRangeAddress(cell.getRowIndex() - 2, cell.getRowIndex(), 2, 2);
                sheet.addMergedRegionUnsafe(cellAddresses1);
                sheet.addMergedRegionUnsafe(cellAddresses2);
                sheet.addMergedRegionUnsafe(cellAddresses3);
            }
        }
    }