web-dev-qa-db-ja.com

0.8.8より前のバージョンでのヘッダーとフッターの作成

Microsoft Word(docx)ファイルにヘッダーとフッターを追加するための回避策はありますか?

これらは、python-docxpriorから0.8.8のバージョンでは実装されていません。

より具体的には、私は追加したいと思います:

  1. フッターへのページ番号
  2. ヘッダーへのランダムなテキスト

idealコードは次のようになります。

from docx import Document

document = Document()

# Add header and footer on all pages

document.save("demo.docx")
9
ReKx

テンプレートのアプローチは機能し、その主な利点は、それが本当にクロスプラットフォームソリューションであることです。ただし、スタイルがドキュメントで一度適用されている必要があります。

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で開きます。

  1. 必要なヘッダーを追加する
  2. メニューからページ番号を挿入する
  3. 文書を保存する

上記を行ったら、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とテーブルスタイル ここを参照 を使用してこれを行う方法の例については、.

6
Pearly Spencer

これは最もエレガントではありません(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
Eliot K

使用できる回避策の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に戻すだけです。

これは明らかに非常にハッキーな回避策であり、残念ながら私はそれを完全に機能させることができませんでしたが、絶対に必要な場合は少なくとも正しい方向への良いステップになるでしょう。

幸運を!

0
Kush