两个高效处理 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)文件的开源/免费库? [复制]