从 python 3.x 编写 excel 2003 文件

Posted

技术标签:

【中文标题】从 python 3.x 编写 excel 2003 文件【英文标题】:Write excel 2003 files from python 3.x 【发布时间】:2013-07-24 14:09:18 【问题描述】:

我有一个非常大的 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。

有没有人建议我如何完成这个?

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

编辑2: 按照 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) 

【问题讨论】:

小心:您的解决方案在保存工作簿后似乎没有关闭它们。如果你真的有数千个文件,你的函数会不断使 Excel 变胖,最终会崩溃。 @stenci 不错的收获。到目前为止,我只在一个小子集上对其进行了测试。谢谢! 不再是 xlwt 仅适用于 Python 2 的情况。 【参考方案1】:

使用 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()

【讨论】:

是的,这就是我在 python 中实际所做的。谢谢。 如果您认为这个(或任何其他)是正确答案,请将其标记为答案 :) 我将其标记为已回答。我显然还没有足够的声誉将您的答案标记为有用,否则我会。 @trashrobber:现在你可以了 :)【参考方案2】:

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

【讨论】:

以上是关于从 python 3.x 编写 excel 2003 文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 Python 将图表从 Excel 转换为 PowerPoint

python 合并多个excel(基于python 3.X)

竟如此简单,使用 Excel 和 Python 轻松从互联网获取数据

python 学习数据库EXCEL处理

有没有办法从 python 3.x 中的测试脚本隐藏登录凭据

使用 Python Loop 从 Excel 文件创建多个 .txt 文件