记一次神奇Bug:poi-tl模板嵌套失败.pdf
- 文档编号:18631608
- 上传时间:2023-08-23
- 格式:PDF
- 页数:6
- 大小:140.85KB
记一次神奇Bug:poi-tl模板嵌套失败.pdf
《记一次神奇Bug:poi-tl模板嵌套失败.pdf》由会员分享,可在线阅读,更多相关《记一次神奇Bug:poi-tl模板嵌套失败.pdf(6页珍藏版)》请在冰点文库上搜索。
记次神奇Bug:
poi-tl模板嵌套失败这个问题居然困扰了我两天,刚才突然发现了问题,只能说当事表很后悔、常后悔!
问题、问题描述现在我边有两个word模板档,分别是:
base.docxparagraph.docx我想要将paragraph.docx渲染后的内容,合并到base.docx中去,但是参考了后没有成功、问题出现的环境背景及尝试过哪些法1.外部环境Maven依赖如下:
org.apache.poipoi-ooxml4.1.2org.apache.poipoi-scratchpad4.1.2org.apache.poipoi-examples4.1.2junitjunit4.13com.deepoovepoi-tl1.9.1org.slf4jslf4j-nop1.7.2org.springframeworkspring-expression4.3.6.RELEASE2.回到代码层控制台没有报错,也没有任何报错信息,于是初步判断:
1.件IO流问题读取模板件没有报错,两个模板件都正确读取2.写数据空写paragraph.docx档中的wordParagraphData数据空,经过调试后可知3.模板标签没有错误先根据使经验来看,如果是将poi-tl标签从语法层上写错,base.docx应该会把paragraph.docx件中的标签显出来,或者直接在控制台报错;然后我照了Java属性与标签,也参考了例代码,发现都能对应上并问题。
三、相关代码先是提供两个模型类:
WordData.javapublicclassWordDataprivateWordHomeDatawordHomeData;privateDocxRenderDatawordParagraphData;publicWordHomeDatagetWordHomeData()returnwordHomeData;publicvoidsetWordHomeData(WordHomeDatawordHomeData)this.wordHomeData=wordHomeData;publicDocxRenderDatagetWordParagraphData()returnwordParagraphData;publicvoidsetWordParagraphData(DocxRenderDatawordParagraphData)this.wordParagraphData=wordParagraphData;OverridepublicStringtoString()returnWordData+wordHomeData=+wordHomeData+,wordParagraphData=+wordParagraphData+;WordParagraphData.javapublicclassWordParagraphData/*段落级别:
标题级别*/privateinttitleLevel;/*段落信息*/privateStringtext;publicintgetTitleLevel()returntitleLevel;publicvoidsetTitleLevel(inttitleLevel)this.titleLevel=titleLevel;publicStringgetText()returntext;publicvoidsetText(Stringtext)this.text=text;OverridepublicStringtoString()returnWordParagraphData+titleLevel=+titleLevel+,text=+text+;其中WordData对应着base.docx,WordParagraphData对应着paragraph.docx。
现在我想要将paragraph.docx中的渲染结果合并到base.docx中,合并流程致如下:
为了达到这种效果,我参考了官例,使到了嵌套的法,相关代码如下:
publicstaticvoidwriteToWord(WordModlewordModle)TheameDatatheameData=init(wordModle);WordDatawordData=theameData.getWordData();ListwordParagraphData=theameData.getWordParagraphDataList();wordData.setWordParagraphData(Includes.ofLocal(src/模板集合/paragraph.docx).setRenderModel(wordParagraphData).create();XWPFTpile(E:
base.docx).render(wordData).writeToFile(output.docx);四、你期待的结果是什么?
实际看到的错误信息是什么?
如果将paragraph.docx渲染后的内容成功合并到base.docx中去预期设想如下:
但是结果实际上这样的:
问题解决只能说我真是太根筋了,直在纠结是不是代码有误、是不是模板件的问题,结果刚才排查到,居然是:
地!
址!
写!
错!
了!
原本我是这样的项布局:
|-src|-模板件然后我代码使的是这样的地址来读取件的:
wordData.setWordParagraphData(Includes.ofLocal(src/模板集合/paragraph.docx).setRenderModel(wordParagraphData).create();读的到才有啊!
正确的操作应该是,将项结构改成这样:
|-src|-main|-java|-resource|-模板集合然后将java路径进修改:
wordData.setWordParagraphData(Includes.ofLocal(src/main/resource/模板集合/paragraph.docx).setRenderModel(wordParagraphData).create();然后就顺利解决了这个问题!
总结个关键点就是要细!
细!
细啊!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 一次 神奇 Bug poi tl 模板 嵌套 失败