-
Notifications
You must be signed in to change notification settings - Fork 59
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
【读取excel】样式获取 #312
Comments
读的话目前只解析了Numfmt,其它样式未解析,后续会补上请持续关注本项目了解最新进度
|
嗯,我可以先用哪个api呢,后续可以关注项目了解进度,现在样式只有numfmt也没关系。 |
有兴趣的话可以尝试实现xlsx格式的样式解析 |
3q, 对第 3 点 还有点疑问。我搜索代码发现 ExcelReader#init 570 获取到的 styles 在599设置到了 sheet 中,是不是我如果需要获取 cell 的 style,可以通过 sheet.getStyles().getStyleByIndex(row.getCell(0).xf). |
请教一下这种用法有问题吗? |
写法是正确的,但是基建好像不对,并没有拿到样式,晚点我尝试下 |
不好意思可能误导你了,因为Styles.load(s);并没有装载到styleIndex,所以styles.getStyleByIndex(cell.xf)返回的是-1,无法拿到样式,需要实现Styles#load方法才可以的 |
Styles#load 要实现才可以,是不是意味着现在没有任何方法可以拿到任何样式? |
我稍后推一个分支获取numfmts
|
int style = styles.of(cell.xf);
NumFmt numFmt= styles.getNumFmt(style);
这样写就可以了
|
多谢支持,已经取到了。 |
你理解的很正确,这个样式就是全部的样式,只是现在只有numfmt才会放进map。
但是这样样式并不能用于复制,样式需要先addNumFmt进目标styles才会生效,而这个值大概率和原值不同,换句话说你不能直接在目标styles上使用of方法添加新样式
|
继续请教,从 a excel 的单元格获取到多个 style(styles.of(cell.xf)),然后现在需要写 b excel,希望能用从 a 里的 style 直接设置 b。不知道最佳实践如何处理比较好。 |
需要完全解析才可以的,当前虽然可以拿到完全的样式值但是各个主体(字体,边框,填充,和格式化)并没有解析,通过当前的style只能得到水平/垂直对其,是否折行。
当然如果目标和原有着相同样式是可以通过of方法复制的,我说的是整个styles.xml完全一样,比如模版
|
今天网络访问不了github,我的建议是如果是模版的话优先使用easyexcel,它有完整的功能,eec有计划支持模版但短时间还无法发布,部分对内存和性能要求的功能可以继续使用eec
|
fix#312分支增增加对样式的解析但并未经过完全测试,你可以fork本项目并切到fix#312分支进行BUG修改,欢迎提交PR。 |
目标是我要生成的一个新文件,在新文件内写入内容,这种目标的styles.xml和模板不相同呀,能请教下你说的模块复制怎么处理吗,我是需要在生成的新文件内完全复用模板的样式。 |
你可以clone本项目并切到fix#312分支,该分支已实现获取单元格样式(row#getStyle ),可以install到本地使用
可以使用如下代码获取单元格样式
```
reader.sheet(0).reset().dataRows().forEach(row -> {
Cell cell = row.getCell(3);
int style = row.getCellStyle(cell);
NumFmt numFmt = row.getStyles().getNumFmt(style);
println(numFmt);
Font font = row.getStyles().getFont(style);
println(font);
Fill fill = row.getStyles().getFill(style);
println(fill);
});
```
|
如果只是简单字段替换的话可以参照TemplateTest测试类,只是目前还不支持表格,可自行扩展实现
```
@test public void testTemplate() throws IOException {
try (InputStream fis = Files.newInputStream(testResourceRoot().resolve("template.xlsx"))) {
// Map data
Map<String, Object> map = new HashMap<>();
map.put("name", "guanquan.wang");
map.put("score", 90);
map.put("date", "2019-05-05");
map.put("desc", "暑假");
// java bean
// BindEntity entity = new BindEntity();
// entity.score = 67;
// entity.name = "张三";
// entity.date = new Date(System.currentTimeMillis());
new Workbook("模板导出")
.withTemplate(fis, map)
.writeTo(defaultTestPath);
}
}
```
|
我其实就是想用模板这种,但我的模板只有样式,和你预设的这种场景有点不匹配。 比如模板原来有 a,b 两个 sheet,我可以基于当前这个模板再去创建 c, d, e 三个 sheet,希望在写入 c,d,e三个 sheet 的的cell可以直接用 a,b 两个 sheet 中的样式,写完 c, d, e sheet 后再去删除 a, b 两个sheet。 |
可以加我微信聊吧,听你描述好像并不太难的样子,如果没有敏感信息的话可以将样本和预期的效果发邮箱我详细看下,邮箱地址点我头像查看
|
已发示例邮件 |
微信号已在邮箱中回复,如何收件箱没有的话就去垃圾邮件中找找
|
我写了一个示例,读取模板某一行做为范本追写数据
如果想要使用其它单元格的样式,可以通过ExcelReader读取拿到Cell#xf,写数据的时候使用该xf即可。 |
导出的对象字段上需要添加@ExcelColumn(colIndex = x) 顺序与模板一样 |
刚刚看到这个问题,刚好我写过应该能解决你的问题,希望对你有帮助,以下代码是完整复刻sheet,即完整复制样式 //样式类 } //样式类
} //核心代码
|
@zhangmuto 获取哪些单元格被合并了可以通过MergeSheet#getMergeCells直接获取,像这样 像上面的代码你读取时候已经指定了COPY_ON_MERGED属性,所以调用asMergedSheet并不会增加额外开销,这里使用类型强转也可以,如果未指定COPY_ON_MERGED属性调用asMergedSheet方法会跳到尾部读取合并信息,所以asMergeSheet方法是安全的。 |
请教读取excel的时候,通过现有 api 或者某种方式怎么获取到单元格样式?
方便后续使用。
The text was updated successfully, but these errors were encountered: