使用Python操作Excel 2007文件
使用python我需要能够对excel 2007的工作簿执行以下操作:
- 删除行
- sorting工作表
- 从一列中获得不同的值
我正在调查openpyxl ; 然而,它似乎有限的能力。
任何人都可以请推荐一个图书馆,可以做上述任务?
我想先说一下,让你知道这只是一个基于Windows的解决scheme 。 但是,如果你使用Windows,我会build议使用Win32Com ,可以在这里find。 这个模块给Python编程访问任何Microsoft Office应用程序(包括Excel),并使用VBA中使用的许多相同的方法。 通常你要做的是logging一个macros(或从内存中回忆)如何在VBA中做一些事情,然后在Python中使用相同的函数
要开始,我们要连接到Excel,并访问第一个工作表作为一个例子
#First we need to access the module that lets us connect to Excel import win32com.client # Next we want to create a variable that represents Excel app = win32com.client.Dispatch("Excel.Application") # Lastly we will assume that the workbook is active and get the first sheet wbk = app.ActiveWorkbook sheet = wbk.Sheets(1)
在这一点上,我们有一个名为工作表的variables,代表了我们将要使用的工作表。 当然有多种方式来访问表单,这通常是我演示如何使用win32com与excel的方式,因为它非常直观。
现在假设我在第一张纸上有以下值,我将逐一回答你如何回答你所问的问题:
A 1 "d" 2 "c" 3 "b" 4 "a" 5 "c"
删除行:假定您想要删除活动工作表中的第一行。
sheet.Rows(1).Delete()
这创造:
A 1 "c" 2 "b" 3 "a" 4 "c"
接下来让我们按升序对单元格进行sorting(尽pipe我会build议将值提取到python中,然后在列表中进行sorting并将值发回)
rang = sheet.Range("A1","A4") sheet.Sort.SetRange(rang) sheet.Sort.Apply()
这创造:
A 1 "a" 2 "b" 3 "c" 4 "c"
现在我们将从列中获得不同的值。 这里要做的主要事情是如何从单元格中提取值。 您可以一次select大量的单元格,也可以使用sheet.Range(“A1”,“A4”)select大量的单元格,也可以使用sheet.Cells(row,col)迭代单元格来访问这些值。 范围要快几个数量级,但Cells对于debugging来说稍微容易些。
#Get a list of all Values using Range valLstRange = [val[0] for val in sheet.Range("A1","A4").Value] #Get a list of all Values using Cells valLstCells = [sheet.Cells(row,1).Value for row in range(1,4)] #valLstCells and valLstRange both = ["a","b","c","c"]
现在最后你想保存工作簿,你可以这样做:
wbk.SaveAs("C:/savedWorkbook.xlsx")
你完成了!
关于COM的信息
如果您使用过VBA,.NET,VBscript或其他语言来使用Excel,许多Excel方法看起来都是一样的。 那是因为他们都使用了微软提供的相同的库。 这个库使用COM,这是微软向语言不可知的程序员提供API的方式。 COM本身是一个较老的技术,debugging起来可能非常棘手。 如果你想了解Python和COM的更多信息,我强烈推荐Mark Hammond 在Win32上进行Python编程 。 他是在官方的.msi安装程序中在Windows上安装Python之后得到嘘声的人。
WIN32COM的替代scheme
我还需要指出的是,在大多数情况下,有几个梦幻般的开源替代品可以比COM更快,可以在任何操作系统(Mac,Linux,Windows等)上运行。 这些工具全部parsing包含.xlsx的压缩文件。 如果你不知道一个.xlsx文件是一个.zip文件,只需要将扩展名改为.zip,然后你就可以浏览这些内容(在你的职业生涯中至less有一次有趣的事情)。 其中,我推荐使用Openpyxl来parsing和创build性能至关重要的服务器上的Excel文件。 切勿使用win32com进行服务器活动,因为它会为每个可能泄漏的实例打开excel.exe的进程外实例
build议
我会推荐win32com用户,这些用户与正在进行数据发现活动的个人数据集(分析师,金融服务,研究人员,会计师,业务运营等)密切合作,因为这对开放工作簿来说非常有用。 但是,需要以较小的占用空间或并行执行非常大的操作或处理来执行非常大的任务的开发人员或用户必须使用诸如openpyxl之类的包。