两个高效处理 Excel 的 Python 开源库

Posted 呆呆敲代码的阿狸

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了两个高效处理 Excel 的 Python 开源库相关的知识,希望对你有一定的参考价值。

 

Excel在工作中经常会用到,很多公司的招聘要求就是要求熟练掌握办公软件,其中就包含Excel。对于应用开发者而言,我们经常需要将Excel文件转换为应用程序。大多数情况下我们都把Excel作为数据的导出格式,有时也将其作为数据的输入格式。虽然Excel不是编程语言,但是生活中很多工作都离不开它,在工作中能够自动处理Excel中的数据也是一个重要方向。

 

而在Python中,借助openpyxl 和 formulas 是两个成熟的开源库,处理Excel电子表格,可以实现自动访问、处理表格中数据的功能,省时高效,不易出错,是处理Excel表格的一种好办法。

 

更多源码资料,请私信小编。如果大家在学习中遇到困难,想找一个python学习交流环境,可以加入我们的python裙,关注小编,并私信“01”即可进裙,领取python学习资料,会节约很多时间,减少很多遇到的难题。

 

我们主要利用openpyxl 和 formulas 是两个成熟的开源库来完成以下工作

1.处理Excel文件,用不同的方法访问其中数据;

2.使用formulas;

3.输出Excel文件。

 

一、打开一个Excel文件

 

在Openpyxl中,我们把Excel文件称为"workbook",用openpyxl.workbook.Workbook类的实例来表示。

 

wb = load_workbook(path)

 

 

在Openpyxl中,可以同时进行读取和写入工作,而当我们用完一个Excel文件后,必须关闭它:

 

wb.close

 

二、处理一个Excel文件

 

通常,Workbooks中可能有几个表,我们选择Excel文件中的一个表,访问其中的数据。现在,假设我们对active工作表中的数据比较感兴趣——当用户在他们的应用中打开文件就会看到的工作表:

 

sheet = web.active

 

1)对行进行遍历:

for  row  in  sheet.rows():

 

2)使用cols方法对列进行遍历

for col in sheet.cols():

 

遍历列与遍历行的操作基本相同:它们本身都是可迭代的,并且可以通过索引寻址。

 

3)通过地址访问单元格

 

如果我们需要某个单元格中的数据,那么并不需要遍历整个表格去找;可以使用excel样式的坐标来访问这个单元格:

cell = sheet['C5']

 

4)处理单元格

 

在任何情况下,想要处理电子表格中的数据,就必须访问每个单元格。在Openpyxl中,单元格有一个值和许多仅用于编写的其他信息,比如样式信息。更方便的是,我们可以把单元格中的值作为Python对象(数字、日期、字符串等),用Openpyxl将它们转换为Excel类型。因此,单元格内容就不一定要是字符串。例如,我们以数字的形式读取单元格的内容:

tax_percentage = sheet['H16'].value
tax_amount = taxable_amount * tax_percentage

 

同样,我们在读取之前可以先用Python的isinstance函数来检查单元格中值的类型,询问单元格它存储的数据类型是什么,避免发生不必要的错误。

if isinstance(cell.value, numbers.Number):
 if cell.data_type == TYPE_NUMERIC:
        

 

4)单元格高级寻址

 

我们不一定要一个一个的寻址单元格-还可以设定范围来访问单元格:

  • sheet['D']是指一整行(本例中是D这一行)
  • sheet[7]是指一整列(本例中是第7列)
  • sheet['B:F']代表许多行
  • sheet['4:10'] 代表许多列
  • sheet['C3:H5']是最通用的选择,代表任意范围的单元格
  •  

以上任何一种情况,结果都是一个按行迭代所有单元格(除非迭代的范围以列为标准,在这种情况下,单元格按列顺序进行迭代):

for cell in sheet['B2:F10']:
for cell in sheet['4:10']:

 

 

 

5)单元格迭代器

 

如果上述寻址方案解决不了问题,那我们可以考虑一些简单的方法iter_rows和iter_columns,它们分别按行和列返回单元格生成器。需要指出,这些方法都需要5个参数:

  • min_row - 起始行的编号(1就是A,2就是B,以此类推)
  • min_col - 起始列的编号
  • max_row - 最后一行的编号
  • max_col - 最后一列的编号
  • values_only - 生成器将只显示每个单元格的值,而不是整个单元格对象。所以,我们不需要用cell.value,而只要value。另一方面,我们不能访问单元格的其他属性,比如data_type。例如,如果我们想按列在B2:F10的范围上进行迭代,可以这样写:
for cell in sheet.iter_columns(min_row=2, min_col=2, max_row=6, max_col=10):

 

6)编写一个Excel文件

 

要写一个Excel文件,我们只需在workbook上调用save方法:

wb.save('someFile.xlsx')

 

知道如何保存一个workbook后,让我们看看如何修改它,这将会很有趣。我们可以修改文件中的workbook,也可以修改在Python中创建的workbook。

 

7)添加或移除表格

 

到目前为止,我们已经看到了如何处理一些对象,特别是workbooks和worksheets——就像处理字典一样,访问其中的细节:工作表、行、列、单个单元格、单元格范围。现在,我们将学习如何添加新信息,以及如何更改现有信息。我们先从表格开始。

使用 create_sheet方法来创建worksheet:

new_sheet = wb.create_sheet()

 

这样就可以在workbook中的其他表格之后添加一个新表,我们可以给这个新表一个标题:

new_sheet = wb.create_sheet(title = 'My new sheet')

 

要删除一个表格的话有两种方法。可以根据名字进行删除:

del wb['My sheet']

 

或者还能调用remove方法来删除表格:

wb.remove(sheet)

 

8)增加或移除行、列、单元格

wb = Workbook()
self.assertEqual(wb.active.max_row, 1)
wb.active['A1'].value = 11
wb.active.insert_rows(0, 3)
self.assertEqual(wb.active.max_row, 4)
self.assertEqual(wb.active['A4'].value, 11)

 

三:在Openpyxl中使用formulas

 

1)把单独的formulas编译为Python函数:

func = formulas.Parser().ast(value)[1].compile()

 

2)基于单元格范围使用formulas

 

到目前为止,compute_cell_value函数使用基于其他单元格的formulas,成功地计算了单元格的值。然而,对于那些不依赖于单个单元格,而是依赖于许多单元格的formulas,又该如何计算呢?在这种情况下,函数的输入是一个范围表达式,例如=SUM(A1:21)中的A1:Z1。我们给compute_cell_ value传入以下信息:

def compute_cell_value(input: Union[Cell, Tuple]):
   if isinstance(input, Tuple):
       return tuple(map(compute_cell_value, input))
   if not has_formula(input):
       return input.value
   func = formulas.Parser().ast(input.value)[1].compile()
   args = []
   sheet = input.parent
   for key in func.inputs.keys():
       args.append(compute_cell_value(sheet[key]))
   return func(*args)

 

3)添加新的formula函数:

 

formulas支持许多内置的Excel函数,但不包括所有函数。当然,它也不支持VBA中的自定义函数。但是,我们可以添加一些新的Python函数,这样就可以在formulas中调用这些函数:

def is_number(number):
FUNCTIONS = formulas.get_functions()
FUNCTIONS['ISNUMBER'] = is_number

 

函数的输入值就是Python中的值,比如字符串、数字、日期等,而不是cell类中的值。此外,与普通Python函数相比,我们需要防止XIError,它表示计算中的错误,例如#DIV/0!或#REF! (当我们在输入formulas中犯了一些错误时,通常会在Excel中看到这些):

def is_number(number):
    if isinstance(number, XlError):
        return False
    ...

 

通过使用openpyxl和formulas这两个成熟的开源库,我们可以更高效地用Python处理Excel。对于那些经常使用Excel的用户来说,能够处理复杂的Excel文件是一个非常有用的功能。

 

在这里还是要推荐下我自己建的Python学习Q群:249029188,群里都是学Python的,如果你想学或者正在学习Python ,欢迎你加入,大家都是软件开发党,不定期分享干货(只有Python软件开发相关的),包括我自己整理的一份2021最新的Python进阶资料和零基础教学,欢迎进阶中和对Python感兴趣的小伙伴加入!

以上是关于两个高效处理 Excel 的 Python 开源库的主要内容,如果未能解决你的问题,请参考以下文章

任何用于处理 Excel(*.xls 和 *.xlsx)文件的开源/免费库? [复制]

Sidetable:一种高效的 Python 数据框处理工具!

numpy模块

numpy模块

numpy模块

Python用Pandas读写Excel