Python 自动化:处理 Excel(笔记)

P

自己接触 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 没有那么直观,操作起来也是比较复杂:

  1. 首先从选择的单元格们创建一个 Reference 对象
  2. 其次把这个 Reference 对象传到一个 Series 对象当中
  3. 创建一个 Chart 对象
  4. 把 Series 对象放到这个 Chart 对象当中
  5. 把 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 自动化,自己也写出来一些能够平时帮助到自己的程序。

其实还是很佩服这些大神们愿意在出书之余,把自己的书这样放在网络上暴晒给别人看。对于自己来说,现在也有些辨别不出来什么才是自己可以分享的知识与能力;毕竟始终离不开项目,也担心会不会无意中分享了不该分享的东西了。

About the author

secangel

双子座 AB 型,资深女校男生

Add comment

About Author

secangel

双子座 AB 型,资深女校男生

Keep In Touch