我正在尝试使用Django模板渲染存储在google驱动器中的word文档文件(docx)的内容。 word文档文件(docx)是带有django变量的模板。 将文件转换为谷歌文档格式会让docx文件失去其字体和样式格式,因此我试图在谷歌应用引擎中实现以下步骤
我在尝试将下载的文件传递到python-docx时遇到问题,因为已实现here
以下是我在谷歌应用引擎中的代码
downloadUrl = searchResult.get('items')[1]['downloadUrl']
if downloadUrl:
resp, tempContent = drive_service._http.request(downloadUrl)
if resp.status == 200:
f = StringIO.StringIO(tempContent)
document = Document(f)
para = document.paragraphs()
print para
f.close()
上面的代码给出了以下错误:
para = document.paragraphs()
TypeError: 'list' object is not callable
这是我在Django模板中提取文本的代码
myTemplate = Template(tempContent)
c = Context({
"salutation": "William",
"inventionTitle":"Biometric KeyLock"
})
fullContent = myTemplate.render(c)
下载文件的mimetype为:
应用/ vnd.openxmlformatsofficedocument.wordprocessingml.document
我的问题是,我不知道如何处理下载的文件。我想替换存储在谷歌驱动器中的word docx中的占位符/变量,而不会丢失格式,然后将其上传回谷歌驱动器。
如果有更好的方法可以实现这一点,请告诉我。
谢谢。
答案 0 :(得分:0)
像......这样的错误。
TypeError: 'list' object is not callable
...通常意味着你有一个列表([]
),它不是一个可调用的对象,这意味着你不能在其后面添加括号来调用它:
>>> []()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'list' object is not callable
对象可能是您想要的数据有效负载。尝试删除括号,让我们知道你得到了什么!
para = document.paragraphs
每个段落都可能是一个可以操作的对象,即合并/渲染Django / Jinja2模板w / context等。例如,如果你想要文本,你可能需要用{{1}来提取它。 },如Paragraph object docs page:
中所述.text
我没有使用python-docx的经验,但是如果你能做这样的事情会很酷:
for para in document.paragraphs:
print(para.text)
然而,实际上,这可能不会飞,因为您可能只在一个段落中有各种文本格式,这意味着您可能需要开始调查&# 34; runs,&#34;具有一组共同属性的文本区域。另请参阅docs page on Runs。
要保留格式,您可能需要查看整个文档,并对模板变量执行单独的搜索替换。虽然这个问题并不涉及Google Slides API,但其文本在文档中的结构方式类似于Word&amp; Google文档,因此其text concepts guide可能是一个有用的参考。
最后,Drive API v2不再是最新的API版本。它现在位于v3,现在不推荐使用for para in document.paragraphs:
myTemplate = Template(para.text)
c = Context({
"salutation": "William",
"inventionTitle":"Biometric KeyLock"
})
para.text = myTemplate.render(c)
。要查看替代方案,请查看Drive API v2-v3 migration guide。要查看您可能会使用的一些实际v3代码,只需调整source & destination MIMEtypes,请查看我的&#34;将Google表格文件导出为CSV&#34; blog post。