从python 3.x写出excel 2003文件

tra*_*ber 5 excel python-3.x

我有一个非常大的CSV数据集(几百万条记录).我已经过滤和按摩并将此列表拆分为客户端规范.这一切都在Python3.3中完成

最后一个要求是这些拆分列表以Excel格式保存.他们有一个实用程序,在执行一些计算并检查数据库中的现有重复项后,将Excel电子表格(以特定格式)导入其数据库.我的问题是他们的实用程序只适用于Excel 2003 .xls文件...我不知道这个提前.

因此,我已经可以使用OpenPyXl以正确的Excel 2007格式编写数据,但这些文件不起作用.我可以写CSV文件,但那些也不起作用,他们的导入器需要xls文件.也许有一种方法可以将所有文件从Excel 2007 xlsx格式批量转换为xls格式,或者从csv格式批量转换为xls格式?有数千个文件,因此无法手动完成.

最好的办法是以正确的格式输出它们,但我似乎找不到兼容python 3的方式,它将与Excel 2003格式一起使用.xlwt只是python 2.x.

有没有人有建议我怎么能完成这个?

编辑:这就是解决方案的样子.

EDIT2:根据stenci的建议添加了工作簿.

import os
import errno
import glob 
import time 
import win32com.client    

def xlsx_to_xls(path):
    xlsx_files = glob.glob(path+'\\*.xlsx') 

    if len(xlsx_files) == 0: 
        raise RuntimeError('No XLSX files to convert.') 

    xlApp = win32com.client.Dispatch('Excel.Application') 

    for file in xlsx_files: 
        xlWb = xlApp.Workbooks.Open(os.path.join(os.getcwd(), file)) 
        xlWb.SaveAs(os.path.join(os.getcwd(), file.split('.xlsx')[0] + '.xls'), FileFormat=1) 
        xlWb.Close()

    xlApp.Quit() 

    time.sleep(2) # give Excel time to quit, otherwise files may be locked 
    for file in xlsx_files: 
        os.unlink(file) 
Run Code Online (Sandbox Code Playgroud)

ste*_*nci 5

使用Excel 2007打开它们并将它们另存为Excel 2003.您可以使用简单的VBA宏或Python,甚至不向用户显示Excel应用程序.唯一的问题是您的计算机需要Excel.

这是VBA代码:

Sub ConvertTo2003(FileName As String)
  Dim WB As Workbook
  Set WB = Workbooks.Open(FileName, ReadOnly:=True)
  WB.SaveAs Replace(FileName, ".xlsx", ".xls"), FileFormat:=xlExcel8
  WB.Close
End Sub
Run Code Online (Sandbox Code Playgroud)

这是Python代码:

xlApp = Excel.ExcelApp(False)
xlApp.convertTo2003('FileName.xlsx')

class ExcelApp(object):
    def __init__(self, visible):
        self.app = win32com.client.Dispatch('Excel.Application')
        if visible:
            self.app.Visible = True

    def __exit__(self):
        self.app.Quit()

    def __del__(self):
        self.app.Quit()

    def convertTo2003(self, fileName):
        if self.app:
            wb = self.app.WorkBooks.Open(fileName, ReadOnly = True)
            wb.SaveAs(fileName[:-1], FileFormat = 56)
            wb.Close()

    def quit(self):
        if self.app:
            self.app.Quit()
Run Code Online (Sandbox Code Playgroud)