1

使用 python 我需要能够对 excel 2007 的工作簿执行以下操作:

  1. 删除行
  2. 对工作表进行排序
  3. 从列中获取不同的值

我正在研究openpyxl;但是,它似乎功能有限。

任何人都可以推荐一个可以完成上述任务的库吗?

4

1 回答 1

7

我想先让您知道这只是一个基于 Windows 的解决方案。但如果您使用的是 Windows,我建议您使用Win32Com,它可以在此处找到。该模块让 Python 以编程方式访问任何 Microsoft Office 应用程序(包括 Excel),并使用 VBA 中使用的许多相同方法。通常你会做的是记录一个宏(或从内存中回忆)如何在 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)

此时,我们有一个名为sheet的变量,它代表我们将使用的 Excel 工作表。当然有多种方法可以访问工作表,这通常是我演示如何在 excel 中使用 win32com 的方式,因为它非常直观。

现在假设我在第一张纸上有以下值,我将逐个讨论如何回答您的问题:

     A    
1   "d"
2   "c"
3   "b"
4   "a"
5   "c"

删除行:假设您要删除活动工作表中的第一行。

sheet.Rows(1).Delete()

这将创建:

    A
1   "c"
2   "b"
3   "a"
4   "c"

接下来让我们按升序对单元格进行排序(尽管我建议将值提取到 python 并在列表中进行排序并将值发送回)

rang = sheet.Range("A1","A4")
sheet.Sort.SetRange(rang)
sheet.Sort.Apply()

这将创建:

    A
1   "a"
2   "b"
3   "c"
4   "c"

现在我们将从列中获得不同的值。这里要带走的主要内容是如何从单元格中提取值。您可以使用sheet.Range("A1","A4")一次选择多个单元格,也可以使用 sheet.Cells(row,col) 逐个单元格地迭代来访问这些值。Range 要快几个数量级,但 Cells 更容易调试。

#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,这是 Microsoft 向与语言无关的程序员提供 API 的方式。COM 本身是一项较旧的技术,调试起来可能很棘手。如果您想了解有关 Python 和 COM 的更多信息,我强烈推荐Mark Hammond在 Win32 上进行 Python 编程。在官方 .msi 安装程序中在 Windows 上安装 Python 后,他会受到热烈欢迎。

WIN32COM 的替代方案

我还需要指出,在大多数情况下,有几种出色的开源替代方案可以比 COM 更快,并且可以在任何操作系统(Mac、Linux、Windows 等)上运行。这些工具都解析包含 .xlsx 的压缩文件。如果您不知道 .xlsx 文件是 .zip,只需将扩展名更改为 .zip,然后您就可以探索内容(在您的职业生涯中至少要做一次这很有趣)。其中我推荐使用 Openpyxl,它用于在性能至关重要的服务器上解析和创建 Excel 文件。切勿将 win32com 用于服务器活动,因为它会为每个可能泄漏的实例打开一个进程外的 excel.exe 实例

推荐

我会向与执行数据发现活动的个人数据集(分析师、金融服务、研究人员、会计师、业务运营等)密切合作的用户推荐 win32com,因为它与开放式工作簿配合得很好。但是,需要执行非常大的任务且占用空间很小并行处理非常大的任务的开发人员或用户必须使用诸如 openpyxl 之类的包。

于 2012-09-07T20:44:23.303 回答