2

ここでWindows 7にdocxをインストールしました:

以下に示すように、D:\Program Files (x86)\Python27\Lib\site-packages:

ここに画像の説明を入力

以下に示すように、OS X の /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/docx-0.0.2-py2.7.egg-info に docx をインストールしました。 ここに画像の説明を入力

以下はサンプル スクリプト (名前は docx_example.py) で、Python インタープリターで問題なく動作します。

#!/usr/bin/env python
'''
This file makes an docx (Office 2007) file from scratch, showing off most of python-docx's features.

If you need to make documents from scratch, use this file as a basis for your work.

Part of Python's docx module - http://github.com/mikemaccana/python-docx
See LICENSE for licensing information.
'''
from docx import *

if __name__ == '__main__':        
    # Default set of relationshipships - these are the minimum components of a document
    relationships = relationshiplist()

    # Make a new document tree - this is the main part of a Word document
    document = newdocument()

    # This xpath location is where most interesting content lives 
    docbody = document.xpath('/w:document/w:body', namespaces=nsprefixes)[0]

    # Append two headings and a paragraph
    docbody.append(heading('''Welcome to Python's docx module''',1)  )   
    docbody.append(heading('Make and edit docx in 200 lines of pure Python',2))
    docbody.append(paragraph('The module was created when I was looking for a Python support for MS Word .doc files on PyPI and Stackoverflow. Unfortunately, the only solutions I could find used:'))

    # Add a numbered list
    for point in ['''COM automation''','''.net or Java''','''Automating OpenOffice or MS Office''']:
        docbody.append(paragraph(point,style='ListNumber'))
    docbody.append(paragraph('''For those of us who prefer something simpler, I made docx.''')) 

    docbody.append(heading('Making documents',2))
    docbody.append(paragraph('''The docx module has the following features:'''))

    # Add some bullets
    for point in ['Paragraphs','Bullets','Numbered lists','Multiple levels of headings','Tables','Document Properties']:
        docbody.append(paragraph(point,style='ListBullet'))

    docbody.append(paragraph('Tables are just lists of lists, like this:'))
    # Append a table
    docbody.append(table([['A1','A2','A3'],['B1','B2','B3'],['C1','C2','C3']]))

    docbody.append(heading('Editing documents',2))
    docbody.append(paragraph('Thanks to the awesomeness of the lxml module, we can:'))
    for point in ['Search and replace','Extract plain text of document','Add and delete items anywhere within the document']:
        docbody.append(paragraph(point,style='ListBullet'))

    # Search and replace
    print 'Searching for something in a paragraph ...',
    if search(docbody, 'the awesomeness'): print 'found it!'
    else: print 'nope.'

    print 'Searching for something in a heading ...',
    if search(docbody, '200 lines'): print 'found it!'
    else: print 'nope.'

    print 'Replacing ...',
    docbody = replace(docbody,'the awesomeness','the goshdarned awesomeness') 
    print 'done.'

    # Add a pagebreak
    docbody.append(pagebreak(type='page', orient='portrait'))

    docbody.append(heading('Ideas? Questions? Want to contribute?',2))
    docbody.append(paragraph('''Email <python.docx@librelist.com>'''))

    # Create our properties, contenttypes, and other support files
    coreprops = coreproperties(title='Python docx demo',subject='A practical example of making docx from Python',creator='Mike MacCana',keywords=['python','Office Open XML','Word'])
    appprops = appproperties()
    contenttypes = contenttypes()
    websettings = websettings()
    wordrelationships = wordrelationships(relationships)

    # Save our document
    savedocx(document,coreprops,appprops,contenttypes,websettings,wordrelationships,'docx_example.docx')

以下は、スタンドアロン (Mac OSX では .app、Windows 7 では .exe) を作成するためのセットアップ スクリプト (docx_setup.py という名前) です。

import sys,os

# Globals: START
main_script='docx_example'
dist_dir_main_path=os.path.abspath('./docx-bin')
compression_level=2
optimization_level=2
bundle_parameter=1
skip_archive_parameter=False
emulation_parameter=False
module_cross_reference_parameter=False
ascii_parameter=False
includes_list=['lxml.etree','lxml._elementpath','gzip']
# Globals: STOP

# Global Functions: START
def isDarwin():
    return sys.platform=='darwin'

def isLinux():
    return sys.platform=='linux2'

def isWindows():
    return os.name=='nt'
# Global Functions: STOP

if isDarwin():
    from setuptools import setup

    # Setup distribution directory: START
    dist_dir=os.path.abspath('%s/osx' %(dist_dir_main_path))
    if os.path.exists(dist_dir):
        os.system('rm -rf %s' %(dist_dir))
    os.system('mkdir -p %s' %(dist_dir))
    # Setup distribution directory: STOP

    APP = ['%s.py' %(main_script)]
    OPTIONS={'argv_emulation': False,
             'dist_dir': dist_dir,
             'includes': includes_list
            }
    print 'Creating standalone now...'
    setup(app=APP,options={'py2app': OPTIONS},setup_requires=['py2app'])
    os.system('rm -rf build')
    os.system('tar -C %s -czf %s/%s.tgz %s.app' %(dist_dir,dist_dir,main_script,main_script))
    os.system('rm -rf %s/%s.app' %(dist_dir,main_script))    
    print 'Re-distributable Standalone file(s) created at %s/%s.zip. Unzip and start using!!!' %(dist_dir,main_script)    

elif isWindows():
    from distutils.core import setup
    import py2exe

    # Setup distribution directory: START
    dist_dir=os.path.abspath('%s/win' %(dist_dir_main_path))
    if os.path.exists(dist_dir):
        os.system('rmdir /S /Q %s' %(dist_dir))
    os.system('mkdir %s' %(dist_dir))
    # Setup distribution directory: STOP

    OPTIONS={'compressed': compression_level,
             'optimize': optimization_level,
             'bundle_files': bundle_parameter,
             'dist_dir': dist_dir,
             'xref': module_cross_reference_parameter,
             'skip_archive': skip_archive_parameter,
             'ascii': ascii_parameter,
             'custom_boot_script': '',
             'includes': includes_list
            }
    print 'Creating standalone now...'
    setup(options = {'py2exe': OPTIONS},zipfile = None,windows=[{'script': '%s.py' %(main_script)}])
    print 'Re-distributable Standalone file(s) created in the following location: %s' %(dist_dir)
    os.system('rmdir /S /Q build')

本当の問題はこれからです。

以下は、コマンド python docx_setup.py py2app を使用して作成された docx_example.app を使用しようとした後に、Mac OS X コンソールに投稿されたエラーです。

docx_example: Searching for something in a paragraph ... found it!
docx_example: Searching for something in a heading ... found it!
docx_example: Replacing ... done.
docx_example: Traceback (most recent call last):
docx_example:   File "/Users/admin/docx-bin/osx/docx_example.app/Contents/Resources/__boot__.py", line 64, in <module>
docx_example:     _run('docx_example.py')
docx_example:   File "/Users/admin/docx-bin/osx/docx_example.app/Contents/Resources/__boot__.py", line 36, in _run
docx_example:     execfile(path, globals(), globals())
docx_example:   File "/Users/admin/docx-bin/osx/docx_example.app/Contents/Resources/docx_example.py", line 75, in <module>
docx_example:     savedocx(document,coreprops,appprops,contenttypes,websettings,wordrelationships,'docx_example.docx')
docx_example:   File "docx.pyc", line 849, in savedocx
docx_example: AssertionError
docx_example: docx_example Error
docx_example Exited with code: 255

以下は、コマンド python docx_setup.py py2exe を使用して作成された docx_example.exe を使用しようとした後、Windows 7 の docx_example.exe.log ファイルに投稿されたエラーです。

Traceback (most recent call last):
  File "docx_example.py", line 75, in <module>
  File "docx.pyo", line 854, in savedocx
WindowsError: [Error 3] The system cannot find the path specified: 'D:\\docx_example\\docx_example.exe\\template'

ご覧のとおり、OS X と Windows 7 の両方がここで類似したものを参照しています。助けてください。

4

4 に答える 4

0

に基づくこのAPI を使用して、問題全体を解決できますpython-docx。API の利点は、これにはsavedoc機能がないため、他のAssertionError.

エラーについては、システムの Python フォルダーにある docx Egg フォルダーWindowsError: [Error 3] The system cannot find the path specified: 'D:\\docx_example\\docx_example.exe\\template'のファイルを編集する必要があります (私のコンピューターでは: ) 。api.pyC:\Python27\Lib\site-packages\python_docx-0.3.0a5-py2.7.egg\docx

これを変更する:

_thisdir = os.path.split(__file__)[0]
_default_docx_path = os.path.join(_thisdir, 'templates', 'default.docx')

これに:

thisdir = os.getcwd()
_default_docx_path = os.path.join(thisdir, 'templates', 'default.docx')

最初のものは、実際に実行中のプログラムを取得し、それをパスに追加してtemplatesフォルダーを見つけました。
C:\myfiles\myprogram.exe\templates\default.docx

ソリューションは、実行中のプログラムではなく、パスのみを取ります。
C:\myfiles\templates\default.docx

それが役に立てば幸い!

于 2014-02-17T10:41:14.927 に答える
0

何が起こっているのか (少なくとも py2exe の場合) は、この質問に似たものです。

data_files に関するドキュメントはこちらです。

あなたが基本的にしなければならないことは、変更することです

setup(options = {'py2exe': OPTIONS},zipfile = None,windows=[{'script': '%s.py' %(main_script)}])

data_files = [
    ('template', 'D:/Program Files (x86)/Python27/Lib/site-packages/docx-template/*'), 
]

setup(
    options={'py2exe': OPTIONS},
    zipfile=None,
    windows=[{'script': '%s.py' %(main_script)}],
    data_files=data_files
)

上記のテンプレート ファイルの正確な場所は間違っている可能性があるため、調整が必要になる場合があります。

ただし、含める必要がある data_files のセットが他にもいくつかある場合があります。os.listdiroros.walkタイプのコマンドを使用して、プログラムでそれらを取得することをお勧めします。

他の投稿で述べたように、あなたも変更する必要があります

bundle_parameter=1

bundle_parameter=2

ファイルの上部にあります。

于 2012-04-18T17:20:04.240 に答える
0

一部のライブラリ ファイルを変更する代わりに、python-docx にテンプレートを探す場所を明示的に伝える方が簡単でわかりやすいと思います。つまり、次のようになります。

document = Document('whatever/path/you/choose/to/some.docx')

これにより、py2exe と docx のパスの問題が効果的に解決されます。

于 2014-07-23T00:54:40.983 に答える