有时无法使用VariableReplacing

时间:2019-07-17 09:26:22

标签: java docx4j

我将docx文件作为模板,并且在使用Microsoft Word编写变量($ {})时,看不到某些变量

但是当我在LibreOffice上对其进行更改时,它正在工作(java看到了变量),但是我不能每次都使用LibreOffice做到这一点!

File doc = new File("nameOfMyFile.docx");

WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(doc);

MainDocumentPart mainDocumentPart = wordMLPackage.getMainDocumentPart();

HashMap mappings = new HashMap();

VariablePrepare.prepare(wordMLPackage); 

mappings.put("lessonsEachWeek", contract.getHoursInWeek());

wordMLPackage.getMainDocumentPart().variableReplace(mappings);
Docx4J.save(wordMLPackage, new File("someName.docx"));

Docx文件的XML:

<w:r>
                            <w:rPr>
                                <w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman" w:eastAsia="Times New Roman" w:cs="Times New Roman"/>
                                <w:color w:val="000000"/>
                                <w:lang w:eastAsia="ru-RU"/>
                            </w:rPr>
                            <w:t xml:space="preserve">1.2 some text ${</w:t>
                        </w:r>
                        <w:r>
                            <w:rPr>
                                <w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman" w:eastAsia="Times New Roman" w:cs="Times New Roman"/>
                                <w:color w:val="000000"/>
                                <w:lang w:val="en-US" w:eastAsia="ru-RU"/>
                            </w:rPr>
                            <w:t>lessonsEachWeek</w:t>
                        </w:r>
                        <w:r>
                            <w:rPr>
                                <w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman" w:eastAsia="Times New Roman" w:cs="Times New Roman"/>
                                <w:color w:val="000000"/>
                                <w:lang w:eastAsia="ru-RU"/>
                            </w:rPr>
                            <w:t xml:space="preserve">} some text</w:t>
                        </w:r>
                    </w:p>

如您所见,括号在其他地方运行,但是在使用LibreOffice时:

<w:r>
                         <w:rPr>
                                <w:rFonts w:eastAsia="Times New Roman" w:cs="Calibri"/>
                                <w:b/>
                                <w:bCs/>
                                <w:color w:val="000000"/>
                                <w:lang w:eastAsia="ru-RU"/>
                            </w:rPr>
                            <w:t>${lessonsEachWeek}</w:t>
                        </w:r>

错误:

2019-07-17 15:00:57.097  WARN 10717 --- [nio-8080-exec-5] org.docx4j.XmlUtils                      : Invalid key '</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman" w:eastAsia="Times New Roman" w:cs="Times New Roman"/><w:color w:val="000000"/><w:lang w:val="en-US" w:eastAsia="ru-RU"/></w:rPr><w:t>lessonsEachWeek</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman" w:eastAsia="Times New Roman" w:cs="Times New Roman"/><w:color w:val="000000"/><w:lang w:eastAsia="ru-RU"/></w:rPr><w:t xml:space="preserve">' or key not mapped to a value
2019-07-17 15:00:57.097  WARN 10717 --- [nio-8080-exec-5] org.docx4j.XmlUtils                      : Invalid key '</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman" w:eastAsia="Times New Roman" w:cs="Times New Roman"/><w:color w:val="000000"/><w:lang w:val="en-US" w:eastAsia="ru-RU"/></w:rPr><w:t>lessonsEachWeek</w:t></w:r><w:r><w:rPr><w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman" w:eastAsia="Times New Roman" w:cs="Times New Roman"/><w:color w:val="000000"/><w:lang w:eastAsia="ru-RU"/></w:rPr><w:t xml:space="preserve">' or key not mapped to a value
2019-07-17 15:00:57.135  INFO 10717 --- [nio-8080-exec-5] o.d.o.parts.WordprocessingML.BinaryPart  : .. closed.

1 个答案:

答案 0 :(得分:0)

根本原因

Word的文本校对功能将lessonsEachWeek文本包装到一些标签中,将其从${}令牌中分离出来。给定了这样的文档,docx4j会尝试找到键</w:t></w:r><w:r><w:rPr>...lessonsEachWeek...</w:rPr><w:t xml:space="preserve">的替代品,而当然没有这样的键。

解决方案

不幸的是,对于现有文档,我无法找到自动优雅的方法来删除这些包装标签。禁用Word中的拼写检查,重新检查和保存文档由于某些原因无法正常工作。我做了一些“手工手术”:在7z中以zip文件打开docx文件,在其中找到\ word \ document.xml,F4(编辑),并删除了这些包装标签。 7z重新打包了zip文件,Word仍然可以毫无问题地打开它,而我的Java / Kotlin应用程序现在可以替换已修复的密钥了!任何类似的存档器和编辑器也都可以做到这一点。

如何避免在新文档中出现此问题

在创建此类模板时在Word中禁用文本校对。

“文件”->“选项”->“校对”,取消选中“在W​​ord中更正拼写和语法时”部分中的所有复选框。