进一步优化spire.doc的导出效率

进一步优化spire.doc的导出效率,第1张

进一步优化spire.doc的导出效率(改用aspose.words) 1.上篇中的spire.doc的文章虽然可以解决,从freemarke导出xml形式的word转换成正常的word的问题,但是时间实在是长的发指,经过半天的面向百度方式,终于找到了另外一种去替换spire.doc这个依赖。 2.因为freemarker 导出的word,看文件是doc或者docx形式,但是其实是xml(OOXML)形式的文件。 3.第一步
		如果您现在使用的是spire.doc, 请先将pom文件中的sprire.doc的依赖删除
4.第二步 将下面的aspose.words 的依赖放入pom.xml 文件中
		<dependency>
            <groupId>com.aspose</groupId>
            <artifactId>aspose.words</artifactId>
            <version>14.2.0</version>
        </dependency>
第三步 在将下面的代码放入pom.xml的文件中,*如果没有将这段仓库地址放入,那么你会下载不下来这个包,这个其实就是指定这个aspose.words 的仓库地址,这样就不会下载失败了
	<repositories>
        <repository>
            <id>aspose-maven-repository</id>
            <url>https://packages.atlassian.com/mvn/maven-atlassian-external/</url>
        </repository>
    </repositories>
第四步 核心代码 在这里已经默认你已经通过freemarker生成了文件,现在是将这个文件转成真正的word文件,因为只有这样手机端才能够打开这个word,如果没有这个需求其实你可以直接放在浏览器中下载而不用使用这个东西。
			String tempUrl = tmpFile.getPath(); //这个是你文件的地址,tepFile是要转换的文件(xml形式的word文件)
            try {
                String transDocxName = tempUrl.replace(".doc", ".docx");//将后缀名字替换也是为了在原有的路径上生成新的文件,到后面一定要删除掉这个文件!不然会积很多文件占用内存
                Document doc = new Document(tempUrl);// 原始word路径
                File wordFile = new File(transDocxName);// 你要的是这个文件********你拿到这个文件就可以了。
                FileOutputStream fileOS = new FileOutputStream(wordFile );
                doc.save(fileOS, SaveFormat.DOCX);//这里执行 *** 作
                //其实aspose.words 是付费的,会产生前后两个水印,这个时候需要调用这个方法将水印清除
                removeAsposeMark(transDocxName);//
                fileOS.close();
                wordFile.delete();
            } catch (Exception e) {
                e.printStackTrace();
            }
第五步 清除水印的方法
 /**
     * 使用Aspose.Words会出现前后水印可以通过这个方法去除水印
     * @param docFilePath
     */
    public static void removeAsposeMark(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();
        }
    }
总结:

1.这样就完成了,重要的是一定要指定仓库的地址(第三步)这样就能够下载这个依赖,wordFile 就是你转换后的目标文件
2.aspose.words 是收费的,这里只是治标将水印通过word的 *** 作去除第一行和最后一行。
3.aspose.words 的作用不止于此,它还可以不同形式的文件相互进行转换,如有需要请面向百度吧!
4.写到这里其实就完成了下面这些需求和问题:

1).我需要现有的业务数据通过java去生成并且下载一个word(.doc,.docx)文件
答:使用 freemarker

2).使用freemarker 之后发现正常的word 可以打开,但是发送到手机上却显示乱码
答:因为freemarker 生成的是OOXML文件,所以需要对下载的这个文件,进行一次转换

3).如何转换
答: 使用 aspose.words

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/721964.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-25
下一篇 2022-04-25

发表评论

登录后才能评论

评论列表(0条)

保存