EasyExce简单使用案例

EasyExce简单使用案例
Easyexcel针对导出的订单进行合并

案例

1、处理表格重新生成新的表格

需求:产品给的数据,需要将参数给绑定到一个链接上,数据量较多,写个demo处理

文档:传送门

映射表格的实体Model

@Data
public class BookModel {

    @ExcelProperty(index = 0,value = "书籍id")
    String bookId;

    @ExcelProperty(index = 1,value = "书籍名")
    String title;

    @ExcelProperty(index = 2,value = "书源id")
    String bookSourceId;

    @ExcelProperty(index = 3,value = "XXX链接")
    String directHapLink;

    @ExcelProperty(index = 4,value = "XXX链接")
    String directHttpLink;

    @ExcelProperty(index = 5,value = "XXX链接")
    String directMonitorLink;

    @ExcelProperty(index = 6,value = "XXX链接")
    String unionHapLink;

    @ExcelProperty(index = 7,value = "XXX链接")
    String unionHttpLink;

    @ExcelProperty(index = 8,value = "XXX链接")
    String unionMonitorLink;

}

直接写个Demo跑数据,由于涉及到查询数据库,所以还需要用@SpringBootTest

@SpringBootTest
public class SpliceStringTest {
    @Autowired
    private BookDao bookDao;

    @Test
    void test() throws FileNotFoundException {

        File file = new File("/Users/xxx/Downloads/old.xlsx");
        File quickApp = new File("/Users/xxx/Downloads/new.xlsx");
        EasyExcel.read(new FileInputStream(file), BookModel.class, new AnalysisEventListener<BookModel>(){

            private List<BookModel>bookModels=new ArrayList<>();

            @Override
            public void invoke(BookModel data, AnalysisContext context) {

                Long bookId = Long.valueOf(data.getBookId());
                String title="";
                if(bookId!=null){
                    BookEntity bookEntity = bookDao.findById(bookId).get();
                    data.setBookSourceId(bookEntity.getSource().getId().toString());
                }
                // format
                String directHapLink=String.format("hap://xxx?book=%s&source=%s&title=%s"
                ,data.getBookId(),data.getBookSourceId(),data.getTitle());
                data.setDirectHapLink(directHapLink);

                String directHttpLink=String.format("https://xxx?book=%s&source=%s&title=%s",
                       data.getBookId(),data.getBookSourceId(),data.getTitle());
                data.setDirectHttpLink(directHttpLink);

                String directMonitorLink=String.format("https://xxx?book=%s",
                        data.getBookId());
                data.setDirectMonitorLink(directMonitorLink);

                String unionHapLink=String.format("hap://xxx?book=%s&source=%s&title=%s",
                        data.getBookId(),data.getBookSourceId(),data.getTitle());
                data.setUnionHapLink(unionHapLink);

                String unionHttpLink=String.format("https://xxx?book=%s&source=%s&title=%s",
                        data.getBookId(),data.getBookSourceId(),data.getTitle());
                data.setUnionHttpLink(unionHttpLink);

                String unionMonitorLink=String.format("https://xxx?book=%s",
                       data.getBookId() );
                data.setUnionMonitorLink(unionMonitorLink);


                bookModels.add(data);
            }

            @Override
            public void doAfterAllAnalysed(AnalysisContext context) {
                save();
            }

            private void save() {
                EasyExcel.write(quickApp,BookModel.class).sheet().doWrite(bookModels);
            }
        }).sheet().doRead();


    }
}

针对上个案例对表格进行优化样式

上面表格样式太难看了,链接也没有设置单元格为链接。

映射单元格实体
@Data
@ContentRowHeight(value = 90)//设置 row 高度,不包含表头标记在 类上
@HeadRowHeight(100)//设置表头高度(与 @ContentRowHeight 相反)标记在类上
public class BookModel {

    @ExcelProperty(value = "类型")
    @ColumnWidth(value = 10)
    @ContentStyle(horizontalAlignment= HorizontalAlignmentEnum.CENTER,verticalAlignment= VerticalAlignmentEnum.CENTER)
    String type;

    @ExcelProperty(value = "书籍id")
    @ColumnWidth(value = 30)
    @ContentStyle(horizontalAlignment= HorizontalAlignmentEnum.CENTER,verticalAlignment= VerticalAlignmentEnum.CENTER)
    String bookId;

    @ExcelProperty(value = "书籍名")
    @ColumnWidth(value = 30)
    @ContentStyle(horizontalAlignment= HorizontalAlignmentEnum.CENTER,verticalAlignment= VerticalAlignmentEnum.CENTER)
    String title;

    @ExcelProperty(value = "作者")
    @ColumnWidth(value = 20)
    @ContentStyle(horizontalAlignment= HorizontalAlignmentEnum.CENTER,verticalAlignment= VerticalAlignmentEnum.CENTER)
    String author;

    @ExcelProperty(value = "书源id")
    @ColumnWidth(value = 20)
    @ContentStyle(horizontalAlignment= HorizontalAlignmentEnum.CENTER,verticalAlignment= VerticalAlignmentEnum.CENTER)
    String bookSourceId;

    @ContentStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND,
            fillForegroundColor=12,horizontalAlignment = HorizontalAlignmentEnum.DISTRIBUTED,
            verticalAlignment = VerticalAlignmentEnum.CENTER)
    @ExcelProperty(value = "直投hap链接")
    @ColumnWidth(50)
    String directHapLink;

    @ExcelProperty(value = "直投http链接")
    @ColumnWidth(50)
    @ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.DISTRIBUTED,
            verticalAlignment = VerticalAlignmentEnum.CENTER)
    String directHttpLink;

    @ExcelProperty(value = "直投监测链接")
    @ColumnWidth(40)
    @ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.DISTRIBUTED,
            verticalAlignment = VerticalAlignmentEnum.CENTER)
    String directMonitorLink;

    @ExcelProperty(value = "联盟hap链接")
    @ColumnWidth(40)
    @ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.DISTRIBUTED,
            verticalAlignment = VerticalAlignmentEnum.CENTER)
    String unionHapLink;

    @ExcelProperty(value = "联盟http链接")
    @ColumnWidth(40)
    @ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.DISTRIBUTED,
            verticalAlignment = VerticalAlignmentEnum.CENTER)
    String unionHttpLink;

    @ExcelProperty(value = "联盟监测链接")
    @ColumnWidth(40)
    @ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.DISTRIBUTED,
            verticalAlignment = VerticalAlignmentEnum.CENTER)
    String unionMonitorLink;

    @ExcelProperty("测试数字")
    @ContentStyle(dataFormat = 2)
    Double testNumber;

}

1、对单元格进行了水品和垂直居中
2、对链接进行了设置单元格为链接,点击内容即可跳转到响应地址
3、由于链接内容过长,比较难看设置对齐方式为自动换行并且设置行高来适应数据
4、对于最后一行数字进行设置保留两位

注册一个写表格添加链接的handler
public class LinkWriteHandler implements CellWriteHandler {

    // 添加超链接的列下标
    List<Integer>linkColumnIndex;

    //从第几行开始添加 0 代表标题行
    int mergeRowIndex;


    public LinkWriteHandler(List<Integer> linkColumnIndex, int mergeRowIndex) {
        this.linkColumnIndex = linkColumnIndex;
        this.mergeRowIndex = mergeRowIndex;
    }

    @Override
    public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead) {
        CellWriteHandler.super.beforeCellCreate(writeSheetHolder, writeTableHolder, row, head, columnIndex, relativeRowIndex, isHead);
    }

    @Override
    public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
        CellWriteHandler.super.afterCellCreate(writeSheetHolder, writeTableHolder, cell, head, relativeRowIndex, isHead);
    }

    @Override
    public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, WriteCellData<?> cellData, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
        CellWriteHandler.super.afterCellDataConverted(writeSheetHolder, writeTableHolder, cellData, cell, head, relativeRowIndex, isHead);
    }

    @Override
    public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<WriteCellData<?>> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
        int curRowIndex = cell.getRowIndex();
        int curColumnIndex = cell.getColumnIndex();

        if(curRowIndex>=mergeRowIndex && linkColumnIndex.contains(curColumnIndex)){
            addLinkCell(writeSheetHolder,cell,curRowIndex,curColumnIndex);
        }


    }


    private void addLinkCell(WriteSheetHolder writeSheetHolder,Cell cell, int curRowIndex, int curColumnIndex) {
        String cellStringValue=cell.getCellType()== CellType.STRING?cell.getStringCellValue():null;
        if(StringUtils.isNotBlank(cellStringValue)){
            try {
                Sheet sheet = writeSheetHolder.getSheet();
                CreationHelper creationHelper = sheet.getWorkbook().getCreationHelper();
                Hyperlink hyperlink = creationHelper.createHyperlink(HyperlinkType.URL);
                hyperlink.setAddress(cellStringValue);
                cell.setHyperlink(hyperlink);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }


}
读取表格保存数据处理写表格
public class EasyExcelTest {

    File oldFile = new File("/Users/xxx/Downloads/xxx1.xlsx");
    File newFile = new File("/Users/xxx/Downloads/xxx2.xlsx");


    @Test
    public void test(){
        EasyExcel.read(oldFile, BookModel.class, new AnalysisEventListener<BookModel>() {

            List<BookModel>saveList=new ArrayList<>();
            @Override
            public void invoke(BookModel data, AnalysisContext context) {
                data.setTestNumber(RandomUtils.nextDouble(1.0,100.0));
                saveList.add(data);
            }

            @Override
            public void doAfterAllAnalysed(AnalysisContext context) {
                changeNewExcel(saveList);
            }

            private void changeNewExcel(List<BookModel> saveList) {
                EasyExcel.write(newFile,BookModel.class)
                        .registerWriteHandler(new LinkWriteHandler(ListUtils.newArrayList(5,6,7,9,10),1))
                        .sheet("xxx")
                        .doWrite(saveList);
            }
        }).sheet().doRead();
    }

}

使用Eaexcel踩坑合集

1、实体定义采用驼峰命名不然可能获取的值为空

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值