自己接触 Python 也有一段时间,入门开始一直都没有熟练;个中学习了不少教材,甚至付费过某个知名网站。看过那么多内容,觉得 Python 入门并不需要付费的内容,网络上有许多优秀的免费内容。
自己看过觉得不错的有:
- Kaggle 上的 Python 入门
- Learn Python The Hard Way: 大家都把这个翻译成为“笨方法学 Python”,然而自己看下来更加像是“硬核学 Python”,毕竟要求抄代码要求背代码的教程不多了
- Automate The Boring Stuff With Python: 最近在看的这本书,里面学习到的东西马上就能用到,也是看了这个之后才觉得真的要写能够帮到自己的程序的时候,能学到的东西才是最多最快的
所以自己就把一些最后这本书(Python 自动化)对自己有用的内容整理出来。这次是当中介绍的 Excel 自动化。
Excel 自动化用到的库是 openpyxl. 以下的代码都是在导入这个库之后的操作。
import openpyxl # 用到的是 openpyxl 库
打开现有的 Excel 工作簿
wb = openpyxl.load_workbook('example.xlsx') # 打开一个 Excel 文件,创建一个 workbook 对象 print(type(wb))
读取 Excel 工作簿当中的工作表
print(wb.sheetnames) # 读取工作表名称的列表 sheet = wb['Sheet3'] # 把其中一个工作表作为一个变量 print(sheet.title) # 显示这个工作表的名称 anotherSheet = wb.active # 把当前活动的工作表作为另一个变量 print(anotherSheet.title) # 显示当前活动的工作表的名称
读取 Excel 工作表当中的单元格
sheet = wb['Sheet1'] # 把其中一个工作表作为一个变量 print(sheet['A1'].value) # 显示 A1 的值 c = sheet['B1'] # 把 B1 格子作为一个变量 print(c.value) # 显示 c 的值 print('Row %s, Column %s is %s' % (c.row, c.column, c.value)) # 显示 c 的行、列与值(列为数字,不是字母) print('Cell %s is %s' % (c.coordinate, c.value)) # 显示 c 的坐标与值 print(sheet['C1'].value) # 显示 C1 的值 print(sheet.cell(row=1, column=2).value) # 显示第 1 行第 2 列的值 for i in range(1,8,2): # 从 1 开始到 8,步长为 2 print(i, sheet.cell(row=i, column=2).value) # 隔行显示 Column B 的值 print(sheet.max_row) # 显示工作表的最大行数 print(sheet.max_column) # 显示工作表的最大列数
转换列的数字与字母
from openpyxl.utils import get_column_letter, column_index_from_string # 需要用到额外的函数 print(get_column_letter(1)) # 把 1 转换为列的字母 print(get_column_letter(2)) # 把 2 转换为列的字母 print(get_column_letter(27)) # 把 27 转换为列的字母 print(get_column_letter(900)) # 把 900 转换为列的字母 print(get_column_letter(sheet.max_column)) # 把工作表最大的列数转为字母 print(column_index_from_string('A')) # 把字母 A 转为数字 print(column_index_from_string('AA')) # 把字母 AA 转为数字
读取 Excel 工作表当中一个范围的单元格
tuple(sheet['A1':'C3']) # 把 A1:C3 这个范围作为一个元组 for rowOfCellObjects in sheet['A1':'C3']: # 历遍 A1:C3 当中的每一行;一个范围作为一个列表的话,每一行是 for cellObj in rowOfCellObjects: # 历遍每一行当中的每一个单元格 print(cellObj.coordinate, cellObj.value) # 显示坐标与值 print('--- END OF ROW ---') print(list(sheet.columns)[1]) # 获取第二列的单元格,作为一个列表 for cellObj in list(sheet.columns)[1]: # 历遍这个列表当中的每一个单元格 print(cellObj.value) # 显示值
写入 Excel 文件
wb = openpyxl.Workbook() # 创建一个新的工作簿 print(wb.sheetnames) # 显示新建工作簿的工作表名称,只有一个工作表叫做 Sheet sheet = wb.active # 将激活的工作表命名为 sheet print(sheet.title) # 显示工作表的名字 sheet.title = 'Spam Bacon Eggs Sheet' # 改变工作表的名字 print(wb.sheetnames) # 显示工作簿的工作表名称 sheet.title = 'Spam Spam Spam' # 改变工作表的名字 wb.save('example_copy.xlsx') # 保存工作簿
创建或删除工作表
wb = openpyxl.Workbook() # 创建一个新的工作簿 print(wb.sheetnames) # 显示新建工作簿的工作表名称,只有一个工作表叫做 Sheet wb.create_sheet() # 创建一个新的工作表,默认叫做 Sheet1 print(wb.worksheets) # 显示新建工作簿的工作表名称,现在有 Sheet 和 Sheet1 wb.create_sheet(index=0, title='First Sheet') # 在 0 位置创建一个名为 First Sheet 的工作表 print(wb.worksheets) # 显示新建工作簿的工作表名称,现在有 First Sheet, Sheet, Sheet1 wb.create_sheet(index=2, title='Middle Sheet') # 在 2 位置创建一个名为 Middle Sheet 的工作表 print(wb.worksheets) # 显示新建工作簿的工作表名称,现在有 First Sheet, Sheet, Middle Sheet, Sheet1 del wb['Middle Sheet'] # 删除 Middle Sheet 工作表 del wb['Sheet1'] # 删除 Sheet1 工作表 print(wb.worksheets) # 显示新建工作簿的工作表名称,现在有 First Sheet, Sheet
给单元格写入数值
wb = openpyxl.Workbook() # 创建一个新的工作簿 sheet = wb['Sheet'] # 把其中一个工作表作为变量 sheet['A1'] = 'Hello, world!' # 编辑 A1 单元格的值 print(sheet['A1'].value) # 显示 A1 单元格的值
给单元格修改格式
from openpyxl.styles import Font # 导入字体函数 wb = openpyxl.Workbook() # 创建一个新的工作簿 sheet = wb['Sheet'] # 把其中一个工作表作为变量 italic24Font = Font(size=24, italic=True) # 创建一个字体,大小为 24,斜体 sheet['A1'].font = italic24Font # 把字体样式应用到 A1 单元格 sheet['A1'] = 'Hello World!' # 设定 A1 单元格的内容 wb.save('styles.xlsx') # 保存文件
使用 Excel 公式(其实就是在单元格内容里面直接写入公式)
wb = openpyxl.Workbook() # 创建一个新的工作簿 sheet = wb.active # 把当前活动的工作表作为一个变量 sheet['A1'] = 200 sheet['A2'] = 300 sheet['A3'] = '=SUM(A1:A2)' # 直接写入公式 wb.save('writeFormula.xlsx') # 保存文件
设定行高与列宽
wb = openpyxl.Workbook() # 创建一个新的工作簿 sheet = wb.active # 把当前活动的工作表作为一个变量 sheet['A1'] = 'Tall row' sheet['B2'] = 'Wide Column' sheet.row_dimensions[1].height = 70 # 把第一行的行高设置为 70 sheet.column_dimensions['B'].width = 20 # 把 B 列的列宽设置为 20 wb.save('dimensions.xlsx')
合并单元格
wb = openpyxl.Workbook() # 创建一个新的工作簿 sheet = wb.active # 把当前活动的工作表作为一个变量 sheet.merge_cells('A1:D3') # 合并 A1:D3 单元格 sheet['A1'] = 'Twelve cells merged together.' sheet.merge_cells('C5:D5') # 合并 C5:D5 单元格 sheet['C5'] = 'Two merged cells.' wb.save('merged.xlsx')
冻结窗口
wb = openpyxl.load_workbook(path + 'produceSales.xlsx') # 打开 produceSales.xlsx 文件 sheet = wb.active # 把当前活动的工作表作为一个变量 sheet.freeze_panes = 'B2' # 把 B2 以上的行与以左的列冻结;设置为 A1 或者 None 则为取消冻结 wb.save('freezeExample.xlsx')
制图
其实通过这个库来制图画 chart 没有那么直观,操作起来也是比较复杂:
- 首先从选择的单元格们创建一个 Reference 对象
- 其次把这个 Reference 对象传到一个 Series 对象当中
- 创建一个 Chart 对象
- 把 Series 对象放到这个 Chart 对象当中
- 把 Chart 对象放到 Worksheet 对象当中
wb = openpyxl.Workbook() # 创建一个新的工作簿 sheet = wb.active # 把当前活动的工作表作为一个变量 for i in range(1, 11): # 创建一个从 1 到 10 的循环 sheet['A' + str(i)] = i # A 列填充那个数字 sheet['B' + str(i)] = i*2 # B 列填充那个数字乘以 2 refObj = openpyxl.chart.Reference(sheet, min_col=1, min_row=1, max_col=2, max_row=10) # 创建一个 reference 对象,范围为 sheet 的 (1,1) 到 (10,2) seriesObj = openpyxl.chart.Series(refObj, title = 'Sample series') # 把 refObj 放到 seriesObj 当中 chartObj = openpyxl.chart.BarChart() # 创建一个 bar chart 对象 chartObj.title = 'Sample Chart' chartObj.append(seriesObj) # 把 chart 对象加到 worksheet 当中 sheet.add_chart(chartObj, 'C5') wb.save('sampleChart.xlsx')
看完了这个 Excel 自动化,自己也写出来一些能够平时帮助到自己的程序。
其实还是很佩服这些大神们愿意在出书之余,把自己的书这样放在网络上暴晒给别人看。对于自己来说,现在也有些辨别不出来什么才是自己可以分享的知识与能力;毕竟始终离不开项目,也担心会不会无意中分享了不该分享的东西了。