Microsoft Word(docx
)ファイルにヘッダーとフッターを追加するための回避策はありますか?
これらは、python-docx
priorから0.8.8
のバージョンでは実装されていません。
より具体的には、私は追加したいと思います:
idealコードは次のようになります。
from docx import Document
document = Document()
# Add header and footer on all pages
document.save("demo.docx")
テンプレートのアプローチは機能し、その主な利点は、それが本当にクロスプラットフォームソリューションであることです。ただし、スタイルがドキュメントで一度適用されている必要があります。
python-docx
ドキュメントページ のおもちゃの例の(簡略化された)バージョンを考えてみましょう。
最初のステップでは、テンプレートドキュメントを作成します。
from docx import Document
document = Document()
document.add_heading('Document Title', 0)
p = document.add_paragraph('A plain paragraph having some ')
p.add_run('bold').bold = True
p.add_run(' and some ')
p.add_run('italic.').italic = True
document.add_heading('Heading, level 1', level=1)
document.add_paragraph('Intense quote', style='IntenseQuote')
document.add_paragraph(
'first item in unordered list', style='ListBullet'
)
document.add_paragraph(
'first item in ordered list', style='ListNumber'
)
document.save('demo.docx')
(Word内からのpython-docx
を使用せずに、この最初のステップでスタイルを手動で適用することもできます。)
次に、このdemo.docx
をMicrosoft Wordで開きます。
上記を行ったら、demo.docx
ドキュメントのメインコンテンツ(ヘッダーとフッターのコンテンツではなく!)を削除し、ファイルを再度保存するだけです。
2番目のステップでは、demo.docx
を使用してpython-docx
を呼び出し、必要な変更を加えます。
from docx import Document
document = Document('demo.docx')
document.add_heading('A New Title for my Document', 0)
p = document.add_paragraph('A new paragraph having some plain ')
p.add_run('bold').bold = True
p.add_run(' and some ')
p.add_run('italic.').italic = True
document.add_heading('New Heading, level 1', level=1)
document.add_paragraph('Intense quote', style='IntenseQuote')
document.add_paragraph(
'first new item in unordered list', style='ListBullet'
)
document.add_paragraph(
'first new item in ordered list', style='ListNumber'
)
document.save('demo.docx')
既存のテーブルスタイルのテーブルなど、コンテンツをさらに追加することもできます。
from docx import Document
document = Document('demo.docx')
document.add_page_break()
recordset = [ [1, "101", "Spam"], [2, "42", "Eggs"], [3, "631", "Spam, spam, eggs, and spam"]]
table = document.add_table(rows=1, cols=3)
hdr_cells = table.rows[0].cells
hdr_cells[0].text = 'Qty'
hdr_cells[1].text = 'Id'
hdr_cells[2].text = 'Desc'
for item in recordset:
row_cells = table.add_row().cells
row_cells[0].text = str(item[0])
row_cells[1].text = str(item[1])
row_cells[2].text = item[2]
table.style = 'ColorfulShading'
document.save('demo.docx')
もちろん、最初のステップを常に繰り返すことを避けることができます カスタマイズされたファイルをコピーする そして、テンプレートに影響を与えることなく、そこに必要な変更を加えます(例:demo_copy.docx
):
import shutil
shutil.copyfile('demo.docx', 'demo_copy.docx')
最後に、customizedスタイルも使用できることに言及する価値があります! python-docx
とテーブルスタイル ここを参照 を使用してこれを行う方法の例については、.
これは最もエレガントではありません(VBAとPythonの間を移動する必要があります)が、win32comライブラリを使用してMS Word機能を利用できます。もちろん、これにはMS OfficeがインストールされたWindowsマシンが必要です。
import win32com.client as win32
msword = win32.gencache.EnsureDispatch('Word.Application')
doc = msword.Documents.Add
doc.Sections(1).Footers(1).Range.Text = r'Text to be included'
doc.Sections(1).Footers(1).PageNumbers.Add()
使用できる回避策の1つは、Word内で作成されたテンプレートドキュメントを利用することです。空のドキュメントを作成し、必要なテキストを含むヘッダーとページ番号を含むフッターを追加して、ドキュメントを保存します。次に使用します:
from docx import Document
document = Document("template.docx")
# Do your editing
document.save("demo.docx")
...ヘッダーとフッターを保持しながら、他のすべてを編集できるはずです。
最終的には、このソリューションはページ番号の問題に最適だと思います。各ドキュメントに一意のヘッダーテキストが必要な場合は、少し注意が必要です。その場合は、docxファイルのXMLを直接編集してみてください。これをターミナルで使用できます:
unzip template.docx
... docx XMLファイルをディレクトリに取得します。 zipfileを使用してpython内で実行することもできます。
import zipfile
document = zipfile.ZipFile("template.docx")
for xml in document.filelist:
if "header" in xml.filename:
read = document.read(xml.filename)
print(read.decode())
PrintステートメントはXMLファイル全体を印刷しますが、この一口を見つけることができるはずです。
<w:r><w:t>ThisIsMyHeader</w:t></w:r>
ヘッダーのテキストになります。 XMLファイルを編集してファイルを結合し、ファイルの種類をdocxに戻すだけです。
これは明らかに非常にハッキーな回避策であり、残念ながら私はそれを完全に機能させることができませんでしたが、絶対に必要な場合は少なくとも正しい方向への良いステップになるでしょう。
幸運を!