1. 我想生成动态目录怎么办?
经过我这边的测试与实践,比较好用的就是通过 占位符 生成一段指令,让我们在打开Word文档之后弹窗提示更新目录域。缺点:每次打开都会提示,如果选择否,目录则不生成。优点:每次提示如果选择是,会自动生成目录并打开导航窗口,使用起来还算方便。
题外话:我这边还试了通过先生成目录,然后代码里生成内容后触发更新的方式,依旧会有弹窗。还搜到过一种避免弹窗的方式,然并卵。乖乖用第一种吧,亲。
(有好的方法记得分享一下哦)
那么怎么实现呢?下面给出教程。
1st:在你需要生成目录的地方添加占位符,比如 {{toc}},如下图所示:

2nd:前文说过了,其实是在指定位置插入一段指令触发Word自动生成目录的功能。所以需要你在文档内容中,需要作为标题的地方都要使用Word中的标题1,标题2,标题3......格式进行标识。
3rd:准备好文档模版内容的实体类后,需要再加入一个字段 toc (字段名与模版中的占位符一致)。如:
/**
* 模版数据实体.
*
* @author linmu
*/
public class TmplateData {
/**
* 目录.
*/
private String toc;
// ... 以下为其他字段内容以及Getter,Setter方法,忽略
}
4th:代码编程渲染模版生成目录及Word文件。如下:
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
TmplateData tmplateData = new TmplateData();
// 设置目录占位符字段的值
tmplateData.setToc("toc");
// 创建模版配置,并绑定目录渲染策略给名为 toc 的占位符
Configure config = Configure.builder().bind("toc", new TOCRenderPolicy()).build();
// 以下内容按自己具体情况进行修改
try (
// 模版文件输入流
FileInputStream fis = new FileInputStream(new File(Word模版完整路径));
XWPFTemplate template = XWPFTemplate.compile(fis, config).render(tmplateData)
) {
template.writeToFile(Word文件完整路径)
}
2. 我想合并表格的单元格怎么办?
单元格合并无非就解决一下几个个问题:
单行多列合并问题:
| 单行多列合并 | |||
| 单行多列合并 | |||
多行单列合并问题:
| 多行单列合并 | |||
多行多列合并问题:
| 多行多列合并 | ||
其实在POI-TL工具中,只需一个类就可以搞定。即:com.deepoove.poi.data.MergeCellRule
具体用法大致如下:
// 创建表格
TableRenderData tableRenderData = Tables.create();
// 添加行,行的列数保持一致(本人没试过不保持一致合并的时候不知会不会有问题。有亲实践后告诉我吗?)
tableRenderData.addRow(...);
tableRenderData.addRow(...);
tableRenderData.addRow(...);
tableRenderData.addRow(...);
// 以下我们基于假设进行:假设有一个表格,总共10行,10列,其中第一行为表格头。以下行数都是从表格头这一行开始算起。
// 场景1-单行多列合并:我只需要第2行的第2列到第10列进行合并;第6行的第2列到第10列进行合并。其他不需要合并。
// 温馨提示:put方法有两个参数, 分别表示合并的开始和终止的表格坐标(都是闭区间)。
// MergeCellRule.Grid.of() 方法第一个参数为行下标,0开始;第二个参数为列下标,0开始。
mergeCellRule.getMapping().put(
MergeCellRule.Grid.of(1, 1),
MergeCellRule.Grid.of(1, 9)
);
mergeCellRule.getMapping().put(
MergeCellRule.Grid.of(5, 1),
MergeCellRule.Grid.of(5, 9)
);
// 设置合并单元格规则到对应的表格
tableRenderData.setMergeRule(mergeCellRule);
// 场景2-多行单列合并:我只需要第2行的第1列到第5行的第1列进行合并;其他不需要合并。
// 温馨提示:put方法有两个参数, 分别表示合并的开始和终止的表格坐标(都是闭区间)。
// MergeCellRule.Grid.of() 方法第一个参数为行下标,0开始;第二个参数为列下标,0开始。
mergeCellRule.getMapping().put(
MergeCellRule.Grid.of(1, 0),
MergeCellRule.Grid.of(4, 0)
);
// 设置合并单元格规则到对应的表格
tableRenderData.setMergeRule(mergeCellRule);
// 场景3-多行多列合并:我只需要第2行的第1列到第10行的第10列进行合并;其他不需要合并。
// 温馨提示:put方法有两个参数, 分别表示合并的开始和终止的表格坐标(都是闭区间)。
// MergeCellRule.Grid.of() 方法第一个参数为行下标,0开始;第二个参数为列下标,0开始。
mergeCellRule.getMapping().put(
MergeCellRule.Grid.of(1, 0),
MergeCellRule.Grid.of(9, 9)
);
// 设置合并单元格规则到对应的表格
tableRenderData.setMergeRule(mergeCellRule);
3. 我想在表格中的某个单元格插入图片怎么搞?
首先官方提供的插入图片有多种方式,比如通过InputStream,通过byte[],通过URL等。具体以官方文档为主,用法大同小异。一下用URL的方式往表格单元格插入图片做个例子:
// 往表格中某一行的第一个单元格插入两张图片,并设置图片大小为100*100
// 创建表格
TableRenderData tableRenderData = Tables.create();
// 往表格插入一行, 总共3列,第一列插入2张图片,其他两列为空
RowRenderData rowRenderData = Rows.of(null, null, null).create();
// 段落列表
List<ParagraphRenderData> pList = new ArrayList<>(item.getPicUrlList().size());
String[] picUrlArr = {"图片链接1", "图片链接2"};
for (String url : picUrlArr) {
// 段落列表添加图片
pList.add(Paragraphs.of(Pictures.ofUrl(url).size(100, 100).create()).create());
}
// 将段落设置到第一个单元格中 rowRenderData.getCells().get(0).setParagraphs(pList);
// 将行添加到表格
tableRenderData.addRow(rowRenderData);
4. 表格某个单元格中的内容加粗?(其他格式大同小异,比如颜色等)
首先要提到,表格整一行加粗比较方便,可以通过以下方式进行设置:
// 表格标题行需要加粗,以下是行数据创建。其中 textBold() 方法就是加粗
RowRenderData titleRow = Rows.of(firstLine.getTitle(), null, null, null, null, null).textBold().create();
那如果要指定特定单元格,比如表格中每一行的第二列内容加粗,且为红色字体。可以尝试使用以下方法:
// 加粗样式
CellStyle boldAndRedTextStyle = new CellStyle();
// 其中 buildBold() 为加粗,buildColor() 为颜色 boldAndRedTextStyle.setDefaultParagraphStyle(ParagraphStyle.builder().withDefaultTextStyle(Style.builder().buildColor("FF00000").buildBold().build()).build());
// 表格第二列加粗且字体颜色为红色,其中 tableRenderData 为 TableRenderData 表格数据类实例
for (RowRenderData rowRenderData : tableRenderData.getRows()) {
rowRenderData.getCells().get(1).setCellStyle(boldAndRedTextStyle);
}
5. 表格某个单元格添加超链接,链接到对应附件?(此方法是保证不拿到对应附件整个文件的前提下,只需附件一个可访问的URL即可)
// 附件,一下方法加入后打开Word文档,要访问链接的话按住Ctrl然后点击对应超链接即可浏览器访问
RowRenderData rowRenderData = Rows.of(null).create();
// 段落列表,和加入图片类似
List<ParagraphRenderData> pList = new ArrayList<>(1);
// 加入链接内容
pList.add(Paragraphs.of(Texts.of("超链接展示的文字").link("超链接的URL").create()).create());
rowRenderData.getCells().get(0).setParagraphs(pList);
作者有话说:如果有幸帮助到你,麻烦给个赞,给个收藏,给个关注,感谢!你的赞,收藏和关注是我的动力源泉
参考文档:
1. POI-TL官方文档
Word文档自动化处理
3万+

被折叠的 条评论
为什么被折叠?



