のテキストを見つけて置き換えようとしています。文書のヘッダーのテキストボックスです。しばらくの間検索した後は、ヘッダや "フロート"テキストボックスのコンテンツにpython-docxでアクセスする方法がないようです(私は問題hereを読む)文書のヘッダーの内容を編集するPython-docx
これは、ドキュメントのxml形式で。とにかくそれを知っていますか?
のテキストを見つけて置き換えようとしています。文書のヘッダーのテキストボックスです。しばらくの間検索した後は、ヘッダや "フロート"テキストボックスのコンテンツにpython-docxでアクセスする方法がないようです(私は問題hereを読む)文書のヘッダーの内容を編集するPython-docx
これは、ドキュメントのxml形式で。とにかくそれを知っていますか?
私はこの問題を解決する方法を見つけました。たとえば、私はtemplate.docx
ファイルを持っており、のテキストを上記のようにヘッダのテキストボックスに変更したいとします。以下のフローのステップは、私は私の問題を解決:
template.docx
を解凍しtemplate.zip
template.zip
に
template
フォルダ
/template/word/
フォルダ内のheader<number>.xml
のいずれかのファイルに変更するテキストを検索と置換します。template.docx
私はこれを行うための別の方法をこれらの
import os
import shutil
import zipfile
WORKING_DIR = os.getcwd()
TEMP_DOCX = os.path.join(WORKING_DIR, "template.docx")
TEMP_ZIP = os.path.join(WORKING_DIR, "template.zip")
TEMP_FOLDER = os.path.join(WORKING_DIR, "template")
# remove old zip file or folder template
if os.path.exists(TEMP_ZIP):
os.remove(TEMP_ZIP)
if os.path.exists(TEMP_FOLDER):
shutil.rmtree(TEMP_FOLDER)
# reformat template.docx's extension
os.rename(TEMP_DOCX, TEMP_ZIP)
# unzip file zip to specific folder
with zipfile.ZipFile(TEMP_ZIP, 'r') as z:
z.extractall(TEMP_FOLDER)
# change header xml file
header_xml = os.path.join(TEMP_FOLDER, "word", "header1.xml")
xmlstring = open(header_xml, 'r', encoding='utf-8').read()
xmlstring = xmlstring.replace("#TXTB1", "Hello World!")
with open(header_xml, "wb") as f:
f.write(xmlstring.encode("UTF-8"))
# zip temp folder to zip file
os.remove(TEMP_ZIP)
shutil.make_archive(TEMP_ZIP.replace(".zip", ""), 'zip', TEMP_FOLDER)
# rename zip file to docx
os.rename(TEMP_ZIP, TEMP_DOCX)
shutil.rmtree(TEMP_FOLDER)
を操作するためのPythonを使用するバックtemplate.zip
の名前を変更し、バックtemplate.zip
/template
フォルダ内のすべてのZipファイル: def docx_setup_header(doc_sio_1, new_title):
"""
Returns a StringIO having replaced #TITLE# placeholder in document header with new_title
:param doc_sio_1: A StringIO instance of the docx document.
:param new_title: The new title to be inserted into header, replacing #TITLE# placeholder
:return: A new StringIO instance, with modified document.
"""
HEADER_PATH = 'word/header1.xml'
doc_zip_1 = zipfile.ZipFile(doc_sio_1, 'r')
header = doc_zip_1.read(HEADER_PATH)
header = header.replace("#TITLE#", new_title)
doc_sio_2 = StringIO.StringIO()
doc_zip_2 = zipfile.ZipFile(doc_sio_2, 'w')
for item in doc_zip_1.infolist():
content = doc_zip_1.read(item.filename)
if item.filename == HEADER_PATH:
doc_zip_2.writestr(HEADER_PATH, header, zipfile.ZIP_DEFLATED)
else:
doc_zip_2.writestr(item, content)
doc_zip_1.close()
doc_zip_2.close()
return doc_sio_2
Pythonのzipファイルではアイテムを置き換えたり削除したりすることができないため、新しいzipファイルを作成し、変更されていない要素を元のものからコピーする必要があります。
多くの人がXSLTを使用してこれを行います。唯一の難点は、(a)XSLTの基本を学ばなければならず、(b)docxボキャブラリの奇妙さを習得しなければならないことです。 –