6

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

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

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

最好的办法是以正确的格式输出它们,但我似乎找不到适用于 Excel 2003 格式的 python 3 兼容方式。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) 
4

2 回答 2

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

这是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()
于 2013-07-24T14:32:33.760 回答
1

自从首次提出(并回答)问题以来,情况发生了变化。从 1.0.0 版本开始,xlwt 可以与 Python 3 一起使用。因此,它可以说是输出 Excel 2003 工作簿的最直接的选项,如果您手头没有 Excel,它绝对是首选方式。

于 2019-05-07T16:49:56.383 回答