easyexcel icon indicating copy to clipboard operation
easyexcel copied to clipboard

动态表头+对象 导出数据

Open RoeGross opened this issue 2 years ago • 3 comments

动态表头+对象注解 导出后数据没有对应

是否可以将动态表头和对象注解 @ExcelProperty("行政区域代码") 一一对应然后再写入数据

RoeGross avatar Apr 14 '22 08:04 RoeGross

自己按照你的表头的顺序把数据拼好就行了

chency-jn avatar May 11 '22 08:05 chency-jn

我的是这样写的,动态表头(非注解)+相同合并内容。 image image `package com.ess.framework.commons.easyexcel;

import com.alibaba.excel.metadata.CellData; import com.alibaba.excel.metadata.Head; import com.alibaba.excel.write.handler.CellWriteHandler; import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; import com.alibaba.excel.write.metadata.holder.WriteTableHolder; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.util.CellRangeAddress;

import java.util.List;

/**

  • excel导出数据内容单元格合并规则 */ public class ExcelFileCellMergeStrategy implements CellWriteHandler {

    /**

    • 合并列的范围索引 / private int[] mergeColumnIndex; /*
    • 合并起始行索引 */ private int mergeRowIndex;

    public ExcelFileCellMergeStrategy(int[] mergeColumnIndex, int mergeRowIndex) { this.mergeColumnIndex = mergeColumnIndex; this.mergeRowIndex = mergeRowIndex; }

    @Override public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer integer, Integer integer1, Boolean aBoolean) {

    }

    @Override public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer integer, Boolean aBoolean) {

    }

    @Override public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, CellData cellData, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {

    }

    @Override public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<CellData> list, Cell cell, Head head, Integer integer, Boolean aBoolean) { //当前行 int curRowIndex = cell.getRowIndex(); //当前列 int curColIndex = cell.getColumnIndex(); if (curRowIndex > mergeRowIndex) { for (int columnIndex : mergeColumnIndex) { if (curColIndex == columnIndex) { mergeWithPrevRow(writeSheetHolder, cell, curRowIndex, curColIndex); break; } } } }

    /**

    • 当前单元格向上合并

    • @param writeSheetHolder

    • @param cell

    • @param curRowIndex

    • @param curColIndex */ private void mergeWithPrevRow(WriteSheetHolder writeSheetHolder, Cell cell, int curRowIndex, int curColIndex) { //获取当前行的当前列的数据和上一行的当前列数据,通过上一行数据是否相同进行合并 Object curData = cell.getCellTypeEnum() == CellType.STRING ? cell.getStringCellValue() : cell.getNumericCellValue(); Cell preCell = cell.getSheet().getRow(curRowIndex - 1).getCell(curColIndex); Object preData = preCell.getCellTypeEnum() == CellType.STRING ? preCell.getStringCellValue() : preCell.getNumericCellValue();

      //比较当前行的第一列的单元格与上一行是否相同,相同合并当前单元格与上一行 if (curData.equals(preData)) { Sheet sheet = writeSheetHolder.getSheet(); List<CellRangeAddress> mergedRegions = sheet.getMergedRegions(); boolean isMerged = false; for (int i = 0; i < mergedRegions.size() && !isMerged; i++) { CellRangeAddress cellAddresses = mergedRegions.get(i); //若上 一个单元格已经被合并,则先移出原有的合并单元,再重新添加合并单元 if (cellAddresses.isInRange(curRowIndex - 1, curColIndex)) { sheet.removeMergedRegion(i); cellAddresses.setLastRow(curRowIndex); sheet.addMergedRegion(cellAddresses); isMerged = true; } } //若上一个单元格未被合并,则新增合并单元 if (!isMerged) { CellRangeAddress cellAddresses = new CellRangeAddress(curRowIndex - 1, curRowIndex, curColIndex, curColIndex); sheet.addMergedRegion(cellAddresses); } } } }

`

kangyu06 avatar May 17 '22 05:05 kangyu06