慕尼黑8549860
2023-03-31 10:09:58
我將 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>
1 回答

幕布斯6054654
TA貢獻1876條經驗 獲得超7個贊
根本原因
lessonsEachWeek
Word 的文本校對功能將文本包裝到一些標記中,將其從${
和}
標記中分離出來。</w:t></w:r><w:r><w:rPr>...lessonsEachWeek...</w:rPr><w:t xml:space="preserve">
給定這樣的文檔,docx4j當然會嘗試在沒有這樣的密鑰的情況下找到密鑰的替代品。
解決方案
不幸的是,對于現有文檔,我無法找到自動且優雅的方式來刪除這些包裝標簽。由于某些原因,禁用 Word 中的拼寫檢查、重新檢查和保存文檔不起作用。我做了一些“手動手術”:在 7z 中打開 docx 文件作為 zip 文件,位于其中的 \word\document.xml,F4(編輯)并刪除這些包裝標簽。7z 重新打包的 zip 文件,Word 仍然可以毫無問題地打開它,而我的 Java / Kotlin 應用程序現在可以替換已修復的密鑰!任何類似的存檔器和編輯器也應該可以做到這一點。
如何在新文檔中避免此問題
創建此類模板時,請在 Word 中禁用文本校對。
“文件”->“選項”->“校對”,取消選中“在 Word 中更正拼寫和語法時”部分中的所有復選框。
添加回答
舉報
0/150
提交
取消