alibaba / easyexcel

快速、简洁、解决大文件内存溢出的java处理Excel工具
https://easyexcel.opensource.alibaba.com
Apache License 2.0
32.09k stars 7.5k forks source link

EasyExcel导出的时候国际化问题,@ExcelProperty设置多行标头问题 #3865

Closed YangJingf closed 2 months ago

YangJingf commented 3 months ago

现在的标头的设置

@ExcelProperty(value = "期间")

想实现的效果,中英文话

image

我的做法

@RequiredArgsConstructor
public class I18nCellWriteHandler implements CellWriteHandler {

    @Override
    public void beforeCellCreate(CellWriteHandlerContext context) {
        if (!context.getHead()) {
            return;
        }
        final List<String> originHeadNames = context.getHeadData().getHeadNameList();
        if (CollectionUtils.isEmpty(originHeadNames)) {
            return;
        }
        List<String> newHeadNames = new ArrayList<>();
        newHeadNames.add(PlaceholderResolver.resolve(originHeadNames.get(0)));
        newHeadNames.addAll(context.getHeadData().getHeadNameList());
        // 预想这里设置多行头实现多表头
        context.getHeadData().setHeadNameList(newHeadNames);
    }

}

问题

当@ExcelProperty(value = "期间") 配置的时候,value如果是单个字段,就只会渲染一次标头,哪怕是把HeaderList设置成多个,也只会生成一个。请问要怎么样配置一个value才会生成多表头呢。官网的方案是value={name1,name2},但是这种的话,改动代价很大,相当于每个@ExcelProperty都需要修改

LSL1618 commented 3 months ago
List<List<String>> exportHeader = Lists.newArrayList();
exportHeader.addAll(Lists.newArrayList("期间1", "Accounting Period1"));// 这里表示第1列中,第1、2行表头
exportHeader.addAll(Lists.newArrayList("期间2", "Accounting Period2"));// 这里表示第2列中,第1、2行表头
exportHeader.addAll(Lists.newArrayList("期间3", "Accounting Period3"));// 这里表示第3列中,第1、2行表头
EasyExcel.write(response.getOutputStream()).sheet(sheetName).head(exportHeader).doWrite(exportBody);
YangJingf commented 3 months ago

我的新写法


    @ExcelProperty(value = {"所属账期", "所属账期"})

想实现导出的时候,两行标头分别是 image 通过修改HeaderList的方法还是没有用,请问这个应该怎么改呢

@Override
    public void beforeCellCreate(CellWriteHandlerContext context) {
        if (!context.getHead()) {
            return;
        }
        final List<String> originHeadNames = context.getHeadData().getHeadNameList();
        if (CollectionUtils.isEmpty(originHeadNames)) {
            return;
        }
        List<String> newHeadNames = new ArrayList<>();
        newHeadNames.add(context.getHeadData().getHeadNameList().get(0));
        newHeadNames.add(PlaceholderResolver.resolve(originHeadNames.get(1)));
        context.getHeadData().setHeadNameList(newHeadNames);
    }