使用场景

日常办公的大多数场景都可能和数据打交道,此时我们第一个想到的便可能是 Excel,方便,简洁,拥有各种集合在一起的功能,相对而言其学习成本低一些。但对于一些专业性较强的行业来说,可能打开一个表格文件的时间已经可以喝一杯咖啡了,此时如果我们会使用脚本语言来处理文件,在时效上要快得多,本文将展示利用 openpyxl 来处理 excel 文件的功能,并且会结合一个小例子给出具体分析。

功能展示

基本准备工作

首先是 openpyxl 的安装,查看 python 的官方网站,我们可以用 pip 安装:

pip install openpyxl

当然如果你用的是 Python 3,也可以这样:

pip3 install openpyxl

安装好 openpyxl 库后,我们可以新建一个 .py 文件,并做好一些初始化的准备:from openpyxl import load_workbook

import datetime
kaggleData = "Your_Excel_file_path" # 此处需要替换为你自己电脑上相应 excel 文件的位置
wb = load_workbook(filename=kaggleData,read_only=True) # 请注意,如果只是读取文件,尽量把 read_only 这个参数设置为 True,这对于较大的 excel 文件来说会有很大的性能提升
sheetNames = wb.sheetnames # 这将返回表格的所有表单名称,以列表形式

写入一个 Excel 文件

读取一个 Excel 文件的工作表,工作薄,每行每列及每个单元格

读取一个 Excel 文件的工作簿"""读取每个工作表的名字,最大最小的行和列"""

def sheetRange(sheetName):
minRow = sheetName.min_row
minCol = sheetName.min_column
maxRow = sheetName.max_row
maxCol = sheetName.max_column
rowRange = 0
columnRange = 0
if minRow >= 1:
rowRange = maxRow - minRow + 1
if minCol >= 1:
columnRange = maxCol - minCol + 1
print(sheetName.title + “ rowRange: “ + str(rowRange) + “,columnRange: “ + str(columnRange))

读取某个指定的行

对于数据的提取,有时可能需要用到某个指定的行,可以按照下面的方法操作:def typicalRow(sheetName,RowNumber): # sheetName 是工作簿的名字,RowNumber 是指要读取的指定行

rowList = []
minRow = sheetName.min_row
minCol = sheetName.min_column
maxRow = sheetName.max_row
maxCol = sheetName.max_column

"""以下是一些简单的保护代码,在实际操作时可能要考虑到更具体的意外情况"""

if maxRow < 1:
errorMessage = sheetName.title + “ 没有内容”
print(errorMessage)
elif RowNumber not in range(minRow,maxRow+1):
errorMessage = “您要查找的第 “ + str(RowNumber) + “ 行超出工作表范围”
print(errorMessage)
else:
for column in range(minCol,maxCol+1):
cell = sheetName.cell(RowNumber,column)
rowList.append(cell.value)
if len(rowList):
return rowList

读取某个指定的列

就像刚才提到的,有时需要读取某个指定的列,可参考下面的方法:def typicalColumn(sheetName,ColumnNumber):

columnList = []
minRow = sheetName.min_row
minCol = sheetName.min_column
maxRow = sheetName.max_row
maxCol = sheetName.max_column
if maxCol < 1:
errorMessage = sheetName.title + “ 没有内容”
print(errorMessage)
elif ColumnNumber not in range(minCol,maxCol+1):
errorMessage = “您要查找的第 “ + str(ColumnNumber) + “ 列超出工作表范围”
print(errorMessage)
else:
for row in range(minRow,maxRow+1):
percentProcess = ‘{:.2%}’.format(row/maxRow) # 测试的文件有太多行,加入这一段代码显示进度
message = "正在获取 " + sheetName.title + " 中的第 " + str(row) + " 行第 " + str(ColumnNumber) + " 列数据,共 " + str(maxRow) + "行,进度为 " + str(percentProcess)
print(message,end="\r")
cell = sheetName.cell(row,ColumnNumber)
columnList.append(cell.value)
if len(columnList):
return columnList

案例分析

自己用 Faker 库创建一些数据写入表格

To be Continued…