2017-07-21 39 views
0

のテキストを見つけて置き換えようとしています。文書のヘッダーのテキストボックスです。しばらくの間検索した後は、ヘッダや "フロート"テキストボックスのコンテンツにpython-docxでアクセスする方法がないようです(私は問題hereを読む)文書のヘッダーの内容を編集するPython-docx

これは、ドキュメントのxml形式で。とにかくそれを知っていますか?

+0

多くの人がXSLTを使用してこれを行います。唯一の難点は、(a)XSLTの基本を学ばなければならず、(b)docxボキャブラリの奇妙さを習得しなければならないことです。 –

答えて

2

私はこの問題を解決する方法を見つけました。たとえば、私はtemplate.docxファイルを持っており、のテキストを上記のようにヘッダのテキストボックスに変更したいとします。以下のフローのステップは、私は私の問題を解決:

  1. 名前の変更ファイルtemplate.docxを解凍しtemplate.zip
  2. template.ziptemplateフォルダ
  3. に私は/template/word/フォルダ内のheader<number>.xmlのいずれかのファイルに変更するテキストを検索と置換します。
  4. は、メモリ内に、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) 
0

を操作するための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ファイルを作成し、変更されていない要素を元のものからコピーする必要があります。

  • 関連する問題