Excel 是 Microsoft(微软)为使用 Windows 和 macOS 操作系统开发的一款电子表格软件。Excel 凭借其直观的界面、出色的计算功能和图表工具,再加上成功的市场营销,一直以来都是最为流行的个人计算机数据处理软件。当然,Excel 也有很多竞品,例如 Google Sheets、LibreOffice Calc、Numbers 等,这些竞品基本上也能够兼容 Excel,至少能够读写较新版本的 Excel 文件,当然这些不是我们讨论的重点。掌握用 Python 程序操作 Excel 文件,可以让日常办公自动化的工作更加轻松愉快,而且在很多商业项目中,导入导出 Excel 文件都是特别常见的功能。
Python 操作 Excel 需要三方库的支持,如果要兼容 Excel 2007 以前的版本,也就是xls
格式的 Excel 文件,可以使用三方库xlrd
和xlwt
,前者用于读 Excel 文件,后者用于写 Excel 文件。如果使用较新版本的 Excel,即xlsx
格式的 Excel 文件,可以使用openpyxl
库,当然这个库不仅仅可以操作Excel,还可以操作其他基于 Office Open XML 的电子表格文件。
本章我们先讲解基于xlwt
和xlrd
操作 Excel 文件,大家可以先使用下面的命令安装这两个三方库以及配合使用的工具模块xlutils
。
Bash
pip install xlwt xlrd xlutils
例如在当前文件夹下有一个名为“阿里巴巴2020年股票数据.xls”的 Excel 文件,如果想读取并显示该文件的内容,可以通过如下所示的代码来完成。
```python import xlrd
wb = xlrd.open_workbook('阿里巴巴2020年股票数据.xls')
sheetnames = wb.sheet_names() print(sheetnames)
sheet = wb.sheet_by_name(sheetnames[0])
print(sheet.nrows, sheet.ncols) for row in range(sheet.nrows): for col in range(sheet.ncols): # 通过Sheet对象的cell方法获取指定Cell对象(单元格) # 通过Cell对象的value属性获取单元格中的值 value = sheet.cell(row, col).value # 对除首行外的其他行进行数据格式化处理 if row > 0: # 第1列的xldate类型先转成元组再格式化为“年月日”的格式 if col == 0: # xldate_as_tuple函数的第二个参数只有0和1两个取值 # 其中0代表以1900-01-01为基准的日期,1代表以1904-01-01为基准的日期 value = xlrd.xldate_as_tuple(value, 0) value = f'{value[0]}年{value[1]:>02d}月{value[2]:>02d}日' # 其他列的number类型处理成小数点后保留两位有效数字的浮点数 else: value = f'{value:.2f}' print(value, end='\t') print()
last_cell_type = sheet.cell_type(sheet.nrows - 1, sheet.ncols - 1) print(last_cell_type)
print(sheet.row_values(0))
print(sheet.row_slice(3, 0, 5)) ```
提示:上面代码中使用的Excel文件“阿里巴巴2020年股票数据.xls”可以通过后面的百度云盘地址进行获取。链接:https://pan.baidu.com/s/1rQujl5RQn9R7PadB2Z5g_g 提取码:e7b4。
相信通过上面的代码,大家已经了解到了如何读取一个 Excel 文件,如果想知道更多关于xlrd
模块的知识,可以阅读它的官方文档。
写入 Excel 文件可以通过xlwt
模块的Workbook
类创建工作簿对象,通过工作簿对象的add_sheet
方法可以添加工作表,通过工作表对象的write
方法可以向指定单元格中写入数据,最后通过工作簿对象的save
方法将工作簿写入到指定的文件或内存中。下面的代码实现了将5 个学生 3 门课程的考试成绩写入 Excel 文件的操作。
```python import random
import xlwt
student_names = ['关羽', '张飞', '赵云', '马超', '黄忠'] scores = [[random.randrange(50, 101) for _ in range(3)] for _ in range(5)]
wb = xlwt.Workbook()
sheet = wb.add_sheet('一年级二班')
titles = ('姓名', '语文', '数学', '英语') for index, title in enumerate(titles): sheet.write(0, index, title)
for row in range(len(scores)): sheet.write(row + 1, 0, student_names[row]) for col in range(len(scores[row])): sheet.write(row + 1, col + 1, scores[row][col])
wb.save('考试成绩表.xls') ```
在写Excel文件时,我们还可以为单元格设置样式,主要包括字体(Font)、对齐方式(Alignment)、边框(Border)和背景(Background)的设置,xlwt
对这几项设置都封装了对应的类来支持。要设置单元格样式需要首先创建一个XFStyle
对象,再通过该对象的属性对字体、对齐方式、边框等进行设定,例如在上面的例子中,如果希望将表头单元格的背景色修改为黄色,可以按照如下的方式进行操作。
```python header_style = xlwt.XFStyle() pattern = xlwt.Pattern() pattern.pattern = xlwt.Pattern.SOLID_PATTERN
pattern.pattern_fore_colour = 5 header_style.pattern = pattern titles = ('姓名', '语文', '数学', '英语') for index, title in enumerate(titles): sheet.write(0, index, title, header_style) ```
如果希望为表头设置指定的字体,可以使用Font
类并添加如下所示的代码。
```python font = xlwt.Font()
font.name = '华文楷体'
font.height = 20 * 18
font.bold = True
font.italic = False
font.colour_index = 1 header_style.font = font ```
注意:上面代码中指定的字体名(
font.name
)应当是本地系统有的字体,例如在我的电脑上有名为“华文楷体”的字体。
如果希望表头垂直居中对齐,可以使用下面的代码进行设置。
```python align = xlwt.Alignment()
align.vert = xlwt.Alignment.VERT_CENTER
align.horz = xlwt.Alignment.HORZ_CENTER header_style.alignment = align ```
如果希望给表头加上黄色的虚线边框,可以使用下面的代码来设置。
```python borders = xlwt.Borders() props = ( ('top', 'top_colour'), ('right', 'right_colour'), ('bottom', 'bottom_colour'), ('left', 'left_colour') )
for position, color in props: # 使用setattr内置函数动态给对象指定的属性赋值 setattr(borders, position, xlwt.Borders.DASHED) setattr(borders, color, 5) header_style.borders = borders ```
如果要调整单元格的宽度(列宽)和表头的高度(行高),可以按照下面的代码进行操作。
```python
sheet.row(0).set_style(xlwt.easyxf(f'font:height {20 * 40}')) titles = ('姓名', '语文', '数学', '英语') for index, title in enumerate(titles): # 设置列宽为200px sheet.col(index).width = 20 * 200 # 设置单元格的数据和样式 sheet.write(0, index, title, header_style) ```
对于前面打开的“阿里巴巴2020年股票数据.xls”文件,如果要统计全年收盘价(Close字段)的平均值以及全年交易量(Volume字段)的总和,可以使用Excel的公式计算即可。我们可以先使用xlrd
读取Excel文件夹,然后通过xlutils
三方库提供的copy
函数将读取到的Excel文件转成Workbook
对象进行写操作,在调用write
方法时,可以将一个Formula
对象写入单元格。
实现公式计算的代码如下所示。
```python import xlrd import xlwt from xlutils.copy import copy
wb_for_read = xlrd.open_workbook('阿里巴巴2020年股票数据.xls') sheet1 = wb_for_read.sheet_by_index(0) nrows, ncols = sheet1.nrows, sheet1.ncols wb_for_write = copy(wb_for_read) sheet2 = wb_for_write.get_sheet(0) sheet2.write(nrows, 4, xlwt.Formula(f'average(E2:E{nrows})')) sheet2.write(nrows, 6, xlwt.Formula(f'sum(G2:G{nrows})')) wb_for_write.save('阿里巴巴2020年股票数据汇总.xls') ```
说明:上面的代码有一些小瑕疵,有兴趣的读者可以自行探索并思考如何解决。
掌握了 Python 程序操作 Excel 的方法,可以解决日常办公中很多繁琐的处理 Excel 电子表格工作,最常见就是将多个数据格式相同的 Excel 文件合并到一个文件以及从多个 Excel 文件或表单中提取指定的数据。当然,如果要对表格数据进行处理,使用 Python 数据分析神器之一的 pandas 库可能更为方便。