guanquan.wang

Results 227 comments of guanquan.wang

ExcelReader已经实现了合并单元格值的复制问题和读取单元格公式,合并后的单元可任意Cell均可拿到值,可以看一下`copyOnMergeCells`这个方法

合并后的单元格只有首行首列有值,其余cell均为Null,可以通过这个特性来处理。 测试代码如下: ``` @Test public void test248() throws IOException { try (ExcelReader reader = ExcelReader.read(testResourceRoot().resolve("工作簿1.xlsx"))) { List list = new ArrayList(); E current = null; for (Iterator ite = reader.sheet(0).iterator();...

关于第一个和第三个可否提一个PR 第2个问题,EEC默认将读到的第一行做为表头,如果使用rows.map转对象时会存在表头返回Null的情况,因为这一行被转为HeaderRow,一般使用filter处理即可。例如文件前4行为其它数据,从第5行开始为表格,那么可以使用如下代码 `reader.sheet(0).rows().filter(row -> row.getRowNum() >= 5).map(row -> row.to(E.class)).filter(Objects::nonNull)`

如果没有表头的话就无法使用默认的`row#to`方法转实体,你可以使用更基础的方法,可以查看[jdbc方式读取](https://github.com/wangguanquan/eec/wiki/2-%E8%AF%BB%E5%8F%96Excel#jdbc%E6%96%B9%E5%BC%8F%E8%AF%BB%E5%8F%96)

> filter可以解决标题行数大于1的情况。但当没有标题行时(第1行就是实际业务数据),无法处理。可能你觉得加个标题行就可以。但实现上,Excel可能是由另一系统产生的,这中间全自动的,没有人为干预过程。 对于2这种情况现有功能可以实现的,我之前一时也没有想起来,你可以使用`Sheet#bind`方法绑定Java对象(可以通过colIndex映射列),然后调用row#get方法即可 ``` // 无表头将行数据转为对象 List list = reader.sheet(0).bind(Goods.class).rows().map(row -> (Goods) row.get()).collect(Collectors.toList()); // 第8行开始为表格数据时增加filter即可 List list = reader.sheet(0).bind(Goods.class).rows().filter(row -> row.getRowNum() > 7).map(row -> (Goods) row.get()).collect(Collectors.toList()); ``` 详细请参考[WIKI](https://github.com/wangguanquan/eec/wiki/2-%E8%AF%BB%E5%8F%96Excel#%E6%97%A0%E8%A1%A8%E5%A4%B4%E5%A4%9A%E8%A1%A8%E5%A4%B4%E8%BD%AC%E5%AF%B9%E8%B1%A1) 稍后我会补足详细代码

使用场景是什么?

对象里定义两个string存储图片url?需要先下载图片然后导出?

如果是读的话可以使用try-with-resource来释放,如果是写的话不需要特殊处理程序会自清理,但是如果中间抛异常的情况除外

放在临时文件的好处是可以被磁盘清理程序清理,linux也会自动清理tmp目录,除非一次将c盘写满否则不用太过在意,如果你是刚接触eec可以先查看一下[wiki](https://github.com/wangguanquan/eec/wiki)

没有遇到过这种情况,使用`excelReader.sheet(0).iterator()`看看会出现什么情况,或者使用流读取看下效果`reader.sheet(0).dataRows().forEach(System.out::println);`,或者添加`System.out.println(excelReader.getAppInfo());` 打印一下文件属性我看下是什么工具生成的