cvd*_*len 11 python text replace docx zipfile
我一直在寻找一种方法来查找和替换docx文件中的文本而运气不佳.我已经尝试过docx模块而无法使用它.最后,我使用zipfile模块计算了下面描述的方法,并替换了docx存档中的document.xml文件.为此,您需要一个模板文档(docx),其中您要替换的文本作为唯一字符串,无法与文档中的任何其他现有或未来文本匹配(例如,"XXXMEETDATEXXX上与XXXCLIENTNAMEXXX的会议进行得非常顺利. ").
import zipfile
replaceText = {"XXXCLIENTNAMEXXX" : "Joe Bob", "XXXMEETDATEXXX" : "May 31, 2013"}
templateDocx = zipfile.ZipFile("C:/Template.docx")
newDocx = zipfile.ZipFile("C:/NewDocument.docx", "a")
with open(templateDocx.extract("word/document.xml", "C:/")) as tempXmlFile:
tempXmlStr = tempXmlFile.read()
for key in replaceText.keys():
tempXmlStr = tempXmlStr.replace(str(key), str(replaceText.get(key)))
with open("C:/temp.xml", "w+") as tempXmlFile:
tempXmlFile.write(tempXmlStr)
for file in templateDocx.filelist:
if not file.filename == "word/document.xml":
newDocx.writestr(file.filename, templateDocx.read(file))
newDocx.write("C:/temp.xml", "word/document.xml")
templateDocx.close()
newDocx.close()
Run Code Online (Sandbox Code Playgroud)
我的问题是这种方法有什么问题?我对这些东西很陌生,所以我觉得别人应该已经弄明白了.这让我相信这种方法存在一些问题.但它的确有效!我在这里错过了什么?
.
以下是我想要学习这些东西的其他人的思考过程的演练:
步骤1)准备要作为键替换的文本字符串的Python字典和作为项目的新文本(例如{"XXXCLIENTNAMEXXX":"Joe Bob","XXXMEETDATEXXX":"2013年5月31日"}).
步骤2)使用zipfile模块打开模板docx文件.
步骤3)使用追加访问模式打开一个新的docx文件.
步骤4)从模板docx文件中提取document.xml(所有文本都存在),并将xml读取为文本字符串变量.
步骤5)使用for循环将xml文本字符串中字典中定义的所有文本替换为新文本.
步骤6)将xml文本字符串写入新的临时xml文件.
步骤7)使用for循环和zipfile模块将模板docx存档中的所有文件复制到新的docx存档除了word/document.xml文件.
步骤8)将带有替换文本的临时xml文件写入新的docx存档作为新的word/document.xml文件.
步骤9)关闭模板和新的docx存档.
步骤10)打开新的docx文档,享受替换后的文本!
- 编辑 - 第7行和第11行缺少右括号')'
有时,Word 会做一些奇怪的事情。您应该尝试删除文本并一笔重写它,例如不要编辑中间的文本
您的文档保存在 xml 文件中(解压后,对于 docx,通常保存在 word/document.xml 中)。有时,您的文本可能不是一笔画出来的:有可能在文档中的某个地方,它们是 XXXCLIENT,而在其他地方,它们是 NAMEXXX。
像这样的东西:
<w:t>
XXXCLIENT
</w:t>
...
<w:t>
NAMEXXX
</w:t>
由于语言支持,这种情况经常发生:当他认为一个单词属于一种特定语言时,单词会进行单词拆分,并且可能会在单词之间这样做,这会将单词拆分为多个标签。
您的解决方案的唯一问题是您必须一笔写下所有内容,这不是最用户友好的。
我创建了一个使用小胡子之类标签的 JS 库:{clientName} https://github.com/edi9999/docxgenjs
它在全局上的工作方式与您的算法相同,但如果内容不是一笔画的,则不会崩溃(当您在 Word 中编写 {clientName} 时,文本通常会在文档中被拆分:{, clientName, }。
| 归档时间: |
|
| 查看次数: |
8125 次 |
| 最近记录: |