excel如何查找默认文件扩展名

时间:2012-11-15 22:58:31

标签: python excel pywin32

我正在尝试编写和使用python和pywin32创建excel文件的应用程序,我想使用默认格式和扩展名保存文件,无论用户使用的是什么版本的excel。根据他们使用的excel版本,默认格式可以是“Open XML Workbook”,它使用“.xlsx”扩展名。其他时候它可能是基本的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看到文件名中已有句号时,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

2 个答案:

答案 0 :(得分:4)

由于在一个地方包含枚举,值和扩展名的列表很难找到,这就是我这样做的方式。棘手的部分是使枚举起作用(参见代码)

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格式运行一次

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”。所以我不确定这是怎么回事。无论如何,它似乎不是一种非常有用的格式。

答案 1 :(得分:0)

为什么不制作xlfileformats的字典:扩展并使用它来进行查找:

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中包含了最常见的格式,但您可以从网络上的许多来源中充实它,例如here。我没有放入KeyError异常处理程序,但你可能想要一个。

祝你好运, 迈克