excel如何find默认的文件扩展名

我试图编写和应用程序,使用python和pywin32创buildexcel文件,我想使用默认的格式和扩展名保存文件的用户正在使用的任何版本的Excel。 根据Excel的版本,他们使用的默认格式可以是使用“.xlsx”扩展名的“Open XML Workbook”。 其他时候可能是基本的excel格式和“.xls”扩展名。 另外,用户可以configurationexcel来使用其他的默认格式。

我知道如何find默认格式(Application.DefaultSaveFormat) – 但我不知道如何确定该格式的默认扩展名。 部分问题是我的文件名往往会在扩展之前包含句点:
基本的文件名是“filename.BOM”,所以根据默认的格式,实际的文件名应该是“filename.BOM.xls”或“filename.BOM.xlsx”。

如果我没有在文件名称的双重期限,一切都会好起来的。 因此,如果默认格式为“Open XML Workbook”,Workbook.aveAs(“filename”)将创build一个名为“filename.xlsx”的文件。 但是Workbook.SaveAs(“filename.BOM”)创build一个名为“filename.BOM”的文件。 当它看到已经在文件名中的时间段时,Excel不会添加默认扩展名。

我唯一能想出来的就是保存一个临时文件,从那里得到扩展名,然后删除临时文件 – 但这看起来真的很糟糕。 任何人有更好的解决scheme?

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 

为什么不写一个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 

我只在示例词典中包含了最常见的格式,但是可以从networking上的许多来源充实它,就像这里一样。 我没有把一个KeyErrorexception处理程序,但你可能会需要一个。

祝你好运,迈克

由于包含枚举,值和扩展名的列表很难在一个地方find,这里就是我所做的。 棘手的部分是让枚举工作(见代码)

 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” – 但这不是它实际上保存的。 如果您删除了您创build的任何文件,请将该代码更改为仅使用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" > "" 

它创build的文件将被命名为“xlbook.xlam”; 但excel的标题栏显示“Book1 – Microsoft Excel”。 所以我不确定这是怎么回事。 它似乎不是一个非常有用的格式。