Java的POI-word模板生成目录自动更新--完美解决

这篇具有很好参考价值的文章主要介绍了Java的POI-word模板生成目录自动更新--完美解决。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录问题:

解决word模板目录在第一次打开不更新就不显示目录问题的原因:之前是通过动态替换域代码toc的形式,生成了一段域代码放置在Word的目录行,打开的时候无法直接触发渲染和更新。

方案:通过插入-文档组件-域组件-目录和索引,将当前的模板的目录直接生成到文档的目录中,在数据替换的时候,由于目录用的也是正文的内容,所以直接就替换掉了。

上述方案解决了需要手动更新才能显示,否则空白的问题。但是也存在缺点:只能更新目录的内容,目录的页码无法正确更新显示,是当时模板的页码。

------------------------------------------分界线-------------------------------------------------------------------------

项目时间允许之际,又做了方案调研,用以下方案,完美解决:

1、spire.doc

有收费版本和免费版本,免费的版本只能读取500行的内容,并生成目录,所以不全,不用;

收费版本的生成word后,会在文档第一行显示试用提示,将该行用poi删除即可;

先用poi-tl的模板生成word,然后用spire.doc打开,并更新域,再保存到原文件路径即可,最后将第一行删掉:


public class Demo4 {
    public static void main (String[] args) throws IOException {
        //加载已设置大纲级别的测试文档
        long start = System.currentTimeMillis();
        Document doc = new Document("D:\\project\\util\\src\\main\\resources\\poi\\report.docx");

        doc.updateTableOfContents();

        doc.saveToFile("目录2222311.docx", FileFormat.Docx_2010);
        restWord("目录2222311.docx");
        System.out.println((System.currentTimeMillis()-start)/1000);
    }
    private static void restWord(String docFilePath) {
        try (FileInputStream in = new FileInputStream(docFilePath)) {
            XWPFDocument doc = new XWPFDocument(OPCPackage.open(in));
            List<XWPFParagraph> paragraphs = doc.getParagraphs();
            if (paragraphs.size() < 1) return;
            XWPFParagraph firstParagraph = paragraphs.get(0);
            if (firstParagraph.getText().contains("Spire.Doc")) {
                doc.removeBodyElement(doc.getPosOfParagraph(firstParagraph));
            }
            OutputStream out = new FileOutputStream(docFilePath);
            doc.write(out);
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

2、aspose.word

aspose.word只有收费版本,如果公司允许,可以买了再用,没有预算的,可以找一个破解jar包引入即可,如果找不到,可以私信我:

先用poi-tl的模板生成word,然后用aspose.word打开,并更新域,再保存到原文件路径即可:

public class Demo5 {
    public static void main (String[] args) throws Exception {
        //加载已设置大纲级别的测试文档
        long start = System.currentTimeMillis();
        Document doc = new Document("D:\\project\\util\\src\\main\\resources\\poi\\report.docx");
        doc.updateFields();
        doc.save("33333.pdf", SaveFormat.PDF);//这里执行操作

//        restWord("目录33331221.docx");

        System.out.println((System.currentTimeMillis()-start)/1000);
    }
    private static void restWord(String docFilePath) {
        try (FileInputStream in = new FileInputStream(docFilePath)) {
            XWPFDocument doc = new XWPFDocument(OPCPackage.open(in));
            List<XWPFParagraph> paragraphs = doc.getParagraphs();
            if (paragraphs.size() < 1) {
                return;
            }
            XWPFParagraph firstParagraph = paragraphs.get(0);
            XWPFParagraph lastParagraph = paragraphs.get(paragraphs.size() - 1);
            if (firstParagraph.getText().contains("Aspose.Words")) {
                doc.removeBodyElement(doc.getPosOfParagraph(firstParagraph));
                doc.removeBodyElement(doc.getPosOfParagraph(lastParagraph));
            }
            OutputStream out = new FileOutputStream(docFilePath);
            doc.write(out);
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

总结,公司允许用破解版的,可以用aspose.word,效率高,生成PDF也给力;spire.doc是国内的产品,操作word耗时长,700+页的文档需要130s+的耗时,不能忍。

-------------------------------------------分界线----------------------------------------------------------------------

以上方案已经解决了目录精确问题,在大文件word生成的时候,还存在2个问题:

1、并发调用会导致线程卡住,卡在new Document()

2、大文件更新目录的时候特别慢,也会出现卡死现象

解决方案:

1、添加synchronized同步锁,每次只有一个生成;

2、判断文件大小超过nMB时,不调用精确方法,小于的时候才调用,避免不可用问题文章来源地址https://www.toymoban.com/news/detail-516621.html

到了这里,关于Java的POI-word模板生成目录自动更新--完美解决的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Java】poi-tl 使用Word模板渲染动态表格

    poi-tl 是一个基于 Apache POI 和 FreeMarker 的 Java 模板引擎,可以用于动态生成 Word、Excel、PowerPoint 等文档。使用 poi-tl 可以方便地将数据填充到模板中,生成符合要求的文档。 poi-tl官方文档地址:http://deepoove.com/poi-tl/#_%E7%89%88%E6%9C%AC 先附上导出效果图: 这步建议手动创建,之前客服

    2024年01月21日
    浏览(49)
  • Java 使用 poi 和 aspose 实现 word 模板数据写入并转换 pdf 增加水印

    本项目所有源码和依赖资源都在文章顶部链接,有需要可以下载使用 1. 需求描述 从指定位置读取一个 word 模板 获取业务数据并写入该 word 模板,生成新的 word 文档 将新生成的 word 文档转换为 pdf 格式 对 pdf 文档添加水印 2. 效果预览 word 模板 带水印的 pdf 文档 3. 实现思路

    2024年02月08日
    浏览(38)
  • java调用poi根据模板生成ppt

    吐槽:像这种需求半年碰不到一个 O.o 可以多去poi官网翻一下官方文档虽然很难理解但有用  所有代码基于个人习惯编写,懒得贴图了相信兄弟们的理解能力,有问题可以留言我尽量解决。 本文所有代码生成都基于pptx文件编写,可根据具体业务修改代码 1.打开模板文件 2.创建

    2024年02月21日
    浏览(40)
  • (Java)word转pdf(aspose),pdf加水印(itextpdf),并支持POI模板(包括checkbox)导出

    目录 1、引入jar包 2、pdf处理工具类 3、poi模板导出工具类 4、测试类 5、模板 6、最终效果  1、引入jar包   2、pdf处理工具类  3、poi模板导出工具类  4、测试类 5、模板 6、最终效果 

    2024年02月06日
    浏览(62)
  • java 使用POI-TL根据word模版,生成word文件,含图片,富文本。

    1.引入mavna坐标` 2 .poi-tl-ext插件主要用于富文本内容格式在word展现 3.word模版创建 3.具体代码实现 4.本文的miniourl路径实质为网络路径的文件。

    2024年02月16日
    浏览(46)
  • JAVA poi-tl 制作word模板 表格数据行循环 带有复选框勾选的表格

            java项目实际开发中经常会遇到制作word表单且表格数据行循环功能,甚至带有复选框勾选功能,本文简单介绍如何制作模板以及使用poi-tl生成word。 提示:以下是本篇文章正文内容,下面案例可供参考 如果只用到word那么需要导入的依赖如下(本案例只需要如下2个依

    2024年04月12日
    浏览(25)
  • JAVA使用POI对Word docx模板文件替换数据工具类并通过浏览器下载到本地

    需求:需要上传一个带有占位符的模板至数据库保存,然后解析模板的占位符,通过类计算结果替换模板中的占位符,并且保存至本地 难点:1.由于我数据库保存是本地保存,并没有path 所以获取模板的path是个难点 2.如何使用计算类,由于我的类是和占位符绑定的,什么样的

    2024年02月16日
    浏览(35)
  • java 根据word模板生成word文件

    Java可以使用Apache POI库来生成Word文件,并且也可以使用freemarker等模板引擎来实现根据Word模板生成Word文件的功能。 下面是一个简单的示例代码,可以帮助您快速入门。 模板制作:offer,wps都行,我使用wps进行操作  第一步制作模板 CTRL+f9生成域------》鼠标右键编辑域------》选

    2024年02月14日
    浏览(38)
  • Java使用poi-tl1.9.1生成Word文档的几个小技巧

    目录 前言 一、poi-tl简介 1、什么是poi-tl 2、常见的word生成对比 3、poi-tl功能点 二、poi-tl文档生成 1、模板准备 2、目标参数填充 3、生成效果  三、可能会遇到的问题 1、混合图表生成报错 2、图表参数设置技巧  总结         也许在您的工作当中会碰到如下的一些场景,比

    2024年02月16日
    浏览(35)
  • Java根据word模板生成word文档并转成PDF文件

    定义完我们的模板之后,我们要将文档保存为xml的格式 生成的xml格式看起来比较乱,没有层次感, 所以需要格式化一下 格式化 基础信息的定义 基础信息的定义只要保证我们转化成的xml文件中的${name}等格式没错误即可 表格的定义 遍历实现,表格的数据填充 在xml文件中我们的

    2024年02月09日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包