3

Pythonとpywin32を使用してExcelファイルを作成するアプリケーションを作成しようとしていますが、ユーザーが使用しているExcelのバージョンに応じて、デフォルトの形式と拡張子を使用してファイルを保存したいと思います。使用しているExcelのバージョンによっては、デフォルトの形式は「.xlsx」拡張子を使用する「OpenXMLWorkbook」の場合があります。また、基本的なExcel形式と「.xls」拡張子の場合もあります。さらに、ユーザーは他のデフォルト形式を使用するようにExcelを構成できます。

デフォルトの形式(Application.DefaultSaveFormat)を見つける方法は知っていますが、その形式のデフォルトの拡張子を決定する方法がわかりません。問題の一部は、私のファイル名に拡張子
の前でもピリオドが含まれる傾向があることです。基本的なファイル名は「filename.BOM」であるため、実際のファイル名は「filename.BOM.xls」または「filename.BOM.xlsx」である必要があります。デフォルトの形式によって異なります。

ファイル名に二重ピリオドが含まれていなければ、すべて問題ありません。したがって、デフォルトの形式が「Open XML Workbook」の場合、Workbook.SaveAs( "filename")は"filename.xlsx"という名前のファイルを作成します。ただし、Workbook.SaveAs( "filename.BOM")は、正確に"filename.BOM"という名前のファイルを作成します。Excelは、ファイル名にすでにピリオドが含まれている場合、デフォルトの拡張子を追加しません。

私が理解できる唯一のことは、一時ファイルを保存し、そこから拡張子を取得してから、一時ファイルを削除することです-しかし、それは本当に厄介なようです。誰かがより良い解決策を持っていますか?

from tempfile import mktemp
from os import path
from os import remove as delfile
class excel:
    def __init__( self):
        self.app = DispatchEx( "Excel.Application" )
    def saveas_default_ext_format( self, workbook, filename):
        # filename - file name with path but without extension

        tmpname = mktemp()

        alerts = self.app.DisplayAlerts
        self.app.DisplayAlerts = False
        workbook.SaveAs( tmpname)
        self.app.DisplayAlerts = alerts

        tmpname = self.app.ActiveWorkbook.FullName
        x, ext = path.splitext( tmpname)
        fullname = filename + ext
        workbook.SaveAs( fullname)

        delfile( tmpname)

        return fullname
4

2 に答える 2

4

列挙、値、および拡張子をすべて 1 か所にまとめたリストを見つけるのは難しいため、ここでは私が行った方法を示します。注意が必要な部分は、列挙を機能させることです (コードを参照してください)。

import win32com
from os.path import splitext

XlFileFormats = [ 
    'xlAddIn'                      , # Microsoft Excel 97-2003 Add-In
    'xlAddIn8'                     , # Microsoft Excel 97-2003 Add-In
    'xlCSV'                        , # CSV
    'xlCSVMac'                     , # Macintosh CSV
    'xlCSVMSDOS'                   , # MSDOS CSV
    'xlCSVWindows'                 , # Windows CSV
    'xlCurrentPlatformText'        , # Current Platform Text
    'xlDBF2'                       , # DBF2
    'xlDBF3'                       , # DBF3
    'xlDBF4'                       , # DBF4
    'xlDIF'                        , # DIF
    'xlExcel12'                    , # Excel12
    'xlExcel2'                     , # Excel2
    'xlExcel2FarEast'              , # Excel2 FarEast
    'xlExcel3'                     , # Excel3
    'xlExcel4'                     , # Excel4
    'xlExcel4Workbook'             , # Excel4 Workbook
    'xlExcel5'                     , # Excel5
    'xlExcel7'                     , # Excel7
    'xlExcel8'                     , # Excel8
    'xlExcel9795'                  , # Excel9795
    'xlHtml'                       , # HTML format
    'xlIntlAddIn'                  , # International Add-In
    'xlIntlMacro'                  , # International Macro
    'xlOpenDocumentSpreadsheet'    , # OpenDocument Spreadsheet
    'xlOpenXMLAddIn'               , # Open XML Add-In
    'xlOpenXMLTemplate'            , # Open XML Template
    'xlOpenXMLTemplateMacroEnabled', # Open XML Template Macro Enabled
    'xlOpenXMLWorkbook'            , # Open XML Workbook
    'xlOpenXMLWorkbookMacroEnabled', # Open XML Workbook Macro Enabled
    'xlSYLK'                       , # SYLK
    'xlTemplate'                   , # Template
    'xlTemplate8'                  , # Template 8
    'xlTextMac'                    , # Macintosh Text
    'xlTextMSDOS'                  , # MSDOS Text
    'xlTextPrinter'                , # Printer Text
    'xlTextWindows'                , # Windows Text
    'xlUnicodeText'                , # Unicode Text
    'xlWebArchive'                 , # Web Archive
    'xlWJ2WD1'                     , # WJ2WD1
    'xlWJ3'                        , # WJ3
    'xlWJ3FJ3'                     , # WJ3FJ3
    'xlWK1'                        , # WK1
    'xlWK1ALL'                     , # WK1ALL
    'xlWK1FMT'                     , # WK1FMT
    'xlWK3'                        , # WK3
    'xlWK3FM3'                     , # WK3FM3
    'xlWK4'                        , # WK4
    'xlWKS'                        , # Worksheet
    'xlWorkbookDefault'            , # Workbook default
    'xlWorkbookNormal'             , # Workbook normal
    'xlWorks2FarEast'              , # Works2 FarEast
    'xlWQ1'                        , # WQ1
    'xlXMLSpreadsheet'             , # XML Spreadsheet
    ]

xl = win32com.client.gencache.EnsureDispatch( "Excel.Application")
'''if you use Dispatch( 'Excel.Application') without having run makepy first,
    the constants from XlFileFormats will not be available.
    See
    http://docs.activestate.com/activepython/2.4/pywin32/html/com/win32com/HTML/GeneratedSupport.html
    http://docs.activestate.com/activepython/2.4/pywin32/html/com/win32com/HTML/QuickStartClientCom.html
    '''
app = xl.Application
app.Visible = 1
book = app.Workbooks.Add(); book.Activate()
print 'DefaultSaveFormat:', app.DefaultSaveFormat

# you cannot access the constants until AFTER you have dispatched excel
constants = win32com.client.constants

print
app.DisplayAlerts = False
for formatName in XlFileFormats:
    formatNum = getattr( constants, formatName)
    print '%-35s: %5d,' % ( formatName, formatNum),
    try: book.SaveAs( r'C:\excel_file_formats\xlbook', formatNum)
    except Exception: print 'could not save this format'
    else:
        wbname, wbext = splitext( book.Name)
        print '"%s"' % ( wbext)
        del wbname, wbext
    #~ raw_input( '    paused')

app.Quit()

出力は次のとおりです。

DefaultSaveFormat: 51

xlAddIn                            :    18, ".xls"
xlAddIn8                           :    18, ".xls"
xlCSV                              :     6, ".csv"
xlCSVMac                           :    22, ".csv"
xlCSVMSDOS                         :    24, ".csv"
xlCSVWindows                       :    23, ".csv"
xlCurrentPlatformText              : -4158, ".txt"
xlDBF2                             :     7, could not save this format
xlDBF3                             :     8, could not save this format
xlDBF4                             :    11, could not save this format
xlDIF                              :     9, ".dif"
xlExcel12                          :    50, ".xlsb"
xlExcel2                           :    16, could not save this format
xlExcel2FarEast                    :    27, could not save this format
xlExcel3                           :    29, could not save this format
xlExcel4                           :    33, could not save this format
xlExcel4Workbook                   :    35, could not save this format
xlExcel5                           :    39, ".xls"
xlExcel7                           :    39, ".xls"
xlExcel8                           :    56, ".xls"
xlExcel9795                        :    43, could not save this format
xlHtml                             :    44, ".htm"
xlIntlAddIn                        :    26, could not save this format
xlIntlMacro                        :    25, could not save this format
xlOpenDocumentSpreadsheet          :    60, ".ods"
xlOpenXMLAddIn                     :    55, ".ods" !!! this one is not right !!!
xlOpenXMLTemplate                  :    54, ".xltx"
xlOpenXMLTemplateMacroEnabled      :    53, ".xltm"
xlOpenXMLWorkbook                  :    51, ".xlsx"
xlOpenXMLWorkbookMacroEnabled      :    52, ".xlsm"
xlSYLK                             :     2, ".slk"
xlTemplate                         :    17, ".xlt"
xlTemplate8                        :    17, ".xlt"
xlTextMac                          :    19, ".txt"
xlTextMSDOS                        :    21, ".txt"
xlTextPrinter                      :    36, ".prn"
xlTextWindows                      :    20, ".txt"
xlUnicodeText                      :    42, ""
xlWebArchive                       :    45, ".mht"
xlWJ2WD1                           :    14, could not save this format
xlWJ3                              :    40, could not save this format
xlWJ3FJ3                           :    41, could not save this format
xlWK1                              :     5, could not save this format
xlWK1ALL                           :    31, could not save this format
xlWK1FMT                           :    30, could not save this format
xlWK3                              :    15, could not save this format
xlWK3FM3                           :    32, could not save this format
xlWK4                              :    38, could not save this format
xlWKS                              :     4, could not save this format
xlWorkbookDefault                  :    51, ".xlsx"
xlWorkbookNormal                   : -4143, ".xls"
xlWorks2FarEast                    :    28, could not save this format
xlWQ1                              :    34, could not save this format
xlXMLSpreadsheet                   :    46, ".xml"

一部の形式を保存できない理由がわかりません。しかし、それらは非常に一般的または有用なもののようには見えません。

また、xlOpenXMLAddIn 形式は非常に奇妙です。「.ods」の拡張子を報告しますが、それは実際に保存するものではありません。作成したファイルを削除する場合は、xlOpenXMLAddIn 形式でコードを 1 回だけ実行するように変更します。

import win32com
from os.path import splitext
from time import sleep

xl = win32com.client.gencache.EnsureDispatch( "Excel.Application")
app = xl.Application
app.Visible = 1
book = app.Workbooks.Add(); book.Activate()
constants = win32com.client.constants

formatName = 'xlOpenXMLAddIn'
formatNum = getattr( constants, formatName)
print 'test_file_format: %s > %s' % ( formatName, formatNum)

app.DisplayAlerts = False
try: book.SaveAs( r'C:\excel_file_formats\xlbook', formatNum)
except Exception: print 'could not save this format'
else:
    wbname, wbext = splitext( book.Name)
    print '"%s" > "%s"' % ( wbname, wbext)

あなたはこれを得る:

test_file_format: xlOpenXMLAddIn > 55
"Book1" > ""

作成されるファイルの名前は「xlbook.xlam」です。Excelのタイトルバーには「Book1 - Microsoft Excel」と表示されています。だから私はこれで何が起こっているのか分かりません。いずれにせよ、あまり有用な形式のようには見えません。

于 2012-11-16T21:20:56.117 に答える
0

xlfileformats:extensions の dict を作成し、それを使用してルックアップを行ってみませんか。

from tempfile import mktemp
from os import path
from os import remove as delfile
class excel:
    def __init__( self):
        self.app = DispatchEx( "Excel.Application" )
        self.dct =     {51:'xlsx',
                        52:'xlsm',
                        50:'xlsb',
                        56:'xls'
                        }

    def saveas_default_ext_format( self, workbook, filename):
        # filename - file name with path but without extension


        fullname = '.'.join((filename, self.dct[self.app.DefaultSaveFormat]))
        workbook.SaveAs( fullname)

        return fullname

サンプル dict には最も一般的な形式のみを含めましたが、ここのように Web 上の多くのソースから肉付けすることができます。私は KeyError 例外ハンドラを入れていませんが、おそらく必要になるでしょう。

がんばれ、マイク

于 2012-11-15T23:50:12.577 に答える