使用 python 编辑 .odt 文件
Editing a .odt File using python
首先我必须说我对编程非常陌生(总共不到一周的经验)。我着手编写一个程序来生成一系列 .odt 模板的文档。我想使用带有特定关键字的模板,比如 "X1234X" 等等。然后这将被程序生成的值替换。每个文档都略有不同,值是通过提示(日期和其他内容)输入和计算的
到目前为止我已经编写了大部分代码,但是我在 2 天前就一直被这个问题困住了。我使用 ezodf 模块从模板生成一个新文档(具有不同的文件名),但我对如何编辑内容感到困惑。
我用谷歌搜索,但一无所获,希望这里有人能提供帮助。我尝试阅读文档,但我必须说实话……它有点难以理解。我不熟悉 "slang"
谢谢
PS: ezodf 方法会很好,但任何其他方法也可以。程序不需要很漂亮它只需要工作(这样我就可以少工作^_^)
好吧,我想通了。并完成了程序。我使用 ezodf 创建文件,然后使用 zipfile 提取和编辑 content.xml,然后通过来自 here 的 >def thingy< 重新打包整个文件。我试图弄乱 etree...但我想不出来...
from ezodf import newdoc
import os
import zipfile
import tempfile
for s in temp2:
input2 = s
input2 = str(s)
input1 = cname[0]
file1 = '.odt'
namef = input2 + input1 + file1
odt = newdoc(doctype='odt', filename=namef, template='template.odt')
odt.save()
a = zipfile.ZipFile('template.odt')
content = a.read('content.xml')
content = str(content.decode(encoding='utf8'))
content = str.replace(content,"XXDATEXX", input2)
content = str.replace(content, 'XXNAMEXX', input1)
def updateZip(zipname, filename, data):
# generate a temp file
tmpfd, tmpname = tempfile.mkstemp(dir=os.path.dirname(zipname))
os.close(tmpfd)
# create a temp copy of the archive without filename
with zipfile.ZipFile(zipname, 'r') as zin:
with zipfile.ZipFile(tmpname, 'w') as zout:
zout.comment = zin.comment # preserve the comment
for item in zin.infolist():
if item.filename != filename:
zout.writestr(item, zin.read(item.filename))
# replace with the temp archive
os.remove(zipname)
os.rename(tmpname, zipname)
# now add filename with its new data
with zipfile.ZipFile(zipname, mode='a', compression=zipfile.ZIP_DEFLATED) as zf:
zf.writestr(filename, data)
updateZip(namef, 'content.xml', content)
首先我必须说我对编程非常陌生(总共不到一周的经验)。我着手编写一个程序来生成一系列 .odt 模板的文档。我想使用带有特定关键字的模板,比如 "X1234X" 等等。然后这将被程序生成的值替换。每个文档都略有不同,值是通过提示(日期和其他内容)输入和计算的
到目前为止我已经编写了大部分代码,但是我在 2 天前就一直被这个问题困住了。我使用 ezodf 模块从模板生成一个新文档(具有不同的文件名),但我对如何编辑内容感到困惑。 我用谷歌搜索,但一无所获,希望这里有人能提供帮助。我尝试阅读文档,但我必须说实话……它有点难以理解。我不熟悉 "slang"
谢谢
PS: ezodf 方法会很好,但任何其他方法也可以。程序不需要很漂亮它只需要工作(这样我就可以少工作^_^)
好吧,我想通了。并完成了程序。我使用 ezodf 创建文件,然后使用 zipfile 提取和编辑 content.xml,然后通过来自 here 的 >def thingy< 重新打包整个文件。我试图弄乱 etree...但我想不出来...
from ezodf import newdoc
import os
import zipfile
import tempfile
for s in temp2:
input2 = s
input2 = str(s)
input1 = cname[0]
file1 = '.odt'
namef = input2 + input1 + file1
odt = newdoc(doctype='odt', filename=namef, template='template.odt')
odt.save()
a = zipfile.ZipFile('template.odt')
content = a.read('content.xml')
content = str(content.decode(encoding='utf8'))
content = str.replace(content,"XXDATEXX", input2)
content = str.replace(content, 'XXNAMEXX', input1)
def updateZip(zipname, filename, data):
# generate a temp file
tmpfd, tmpname = tempfile.mkstemp(dir=os.path.dirname(zipname))
os.close(tmpfd)
# create a temp copy of the archive without filename
with zipfile.ZipFile(zipname, 'r') as zin:
with zipfile.ZipFile(tmpname, 'w') as zout:
zout.comment = zin.comment # preserve the comment
for item in zin.infolist():
if item.filename != filename:
zout.writestr(item, zin.read(item.filename))
# replace with the temp archive
os.remove(zipname)
os.rename(tmpname, zipname)
# now add filename with its new data
with zipfile.ZipFile(zipname, mode='a', compression=zipfile.ZIP_DEFLATED) as zf:
zf.writestr(filename, data)
updateZip(namef, 'content.xml', content)