我正在尝试编写和使用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
答案 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异常处理程序,但你可能想要一个。
祝你好运, 迈克