从 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 轻松从互联网获取数据