eec icon indicating copy to clipboard operation
eec copied to clipboard

希望模板功能能在原excel上进行追加数据

Open yaowanli opened this issue 1 year ago • 11 comments

现在业务提供了一个复杂的excel,里面有公式/格式/批注和下拉,现在只需要我们往里面写入数据; 如果用模板到处功能,就会出现丢失批注的情况,想问下后续会支持直接追加数据的功能吗? 或者现在代码,有能实现的思路吗?不胜感激!

yaowanli avatar Jan 10 '25 03:01 yaowanli

目前还不能读取批注所以模板导出就丢失了批注功能,这个功能已经在开发了不过年前没有太多时间,应该会在年后上线。

自己实现的话有些困难,如果所有模板都已知的话可以迂回处理,暂时可以预先添加已知模板中的批注像下面的示例代码

TemplateSheet sheet = new TemplateSheet(Paths.get("库存导出模板.xlsx"));
// 手动添加批注
attachComments(sheet);
new Workbook().addSheet(sheet).writeTo(Paths.get("库存导出.xlsx"));


// 手动添加批注
public static void attachComments(TemplateSheet sheet) {
    String templateName = null;
    try {
        Field templatePathField = sheet.getClass().getDeclaredField("templatePath");
        templatePathField.setAccessible(true);
        Object o = templatePathField.get(sheet);
        if (o instanceof Path) {
            templateName = ((Path) o).getFileName().toString();
        }
    } catch (NoSuchFieldException | IllegalAccessException e) {
        throw new RuntimeException(e);
    }
    if (templateName == null) return;
    // 获取Comments
    Comments comments = sheet.createComments();
    switch (templateName) {
        case "商品导出模板.xlsx":
            // A1单元格添加批注
            comments.addComment(1, 1, "实际库存");
            // B4单元格添加批注
            comments.addComment(4, 2, new Comment("库存不足", "低于警戒线13%,请尽快添加库存").setValueFont(new Font("微软雅黑", 10, Color.RED)));
            break;
        case "库存导出模板.xlsx":
            // A1单元格添加批注
            comments.addComment(1, 1, "库区:A ~ E");
            // B1单元格添加批注
            comments.addComment(1, 2, "库位: 00 ~ 99");
            break;
    }
}

wangguanquan avatar Jan 10 '25 05:01 wangguanquan

EEC的模板工作表是读取模板Excel然后重新写到新Excel,并不是在原Excel上添加数据,这样的好处是方便修改并可以对多个文件进行合并,坏处就是如果模板包含ExcelReader不支持的数据类型时则会丢失

wangguanquan avatar Jan 10 '25 06:01 wangguanquan

那就尴尬了。用户提供的模板里面有很多函数和批注,也想过预先硬编码添加已知模板中的批注,但是这样一来用户更新模板就得把批注也一起更新,有些麻烦。

yaowanli avatar Jan 14 '25 05:01 yaowanli

我学习下TemplateSheet的创建方法,看下是不是可以基于它再处理下

yaowanli avatar Jan 14 '25 06:01 yaowanli

因为我只需要复制表头的批注和样式,其他的都不太需要

yaowanli avatar Jan 14 '25 06:01 yaowanli

可以的,前提是需要读取批注,我空了推一个读取批注的示例代码,你可以在读取批注后添加到新工作表中,如果不考虑中间行插入或减少则可以直接添加否则需要计算位置

Message ID: @.***>

wangguanquan avatar Jan 14 '25 06:01 wangguanquan

oh,看了下源码,发现正如你所说的,没有读取批注代码。没有这个前提,也不知道怎么获取批注了,得等年后你的新版本出来后再看看了

yaowanli avatar Jan 15 '25 10:01 yaowanli

年底了每天都忙着写总结做汇报,着急用的话可以使用poi读取批注,然后添加到工作表也行

Message ID: @.***>

wangguanquan avatar Jan 15 '25 12:01 wangguanquan

fix#418 分支支持读取批注,模版工作表也支持批注,可以使用这个分支本地测试是否解决问题

wangguanquan avatar Jan 22 '25 13:01 wangguanquan

v0.5.22模板工作表已支持复制批注

wangguanquan avatar Feb 23 '25 15:02 wangguanquan

感谢感谢,我研究下

yaowanli avatar Mar 07 '25 00:03 yaowanli