打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Python实现Excel办公自动化之openpyxl

目录

Excel安装库的对比

安装

基本操作

1.引入库

2.工作簿

创建或者加载工作簿

获取当前工作表

3.工作表

创建工作表和获取工作表 

获取所有工作表

删除工作表

复制工作表

过滤和排序

使用公式

4.单元格

访问单元格

​​ 合并单元格

拆分单元格

单元格数据

单元格遍历

单元格样式

转化为pandas

6.图表生成

柱状图

圆饼图

折线图

 散点图

7.保存工作簿

总结


Excel安装库的对比

在python中我们使用到的库有xlrd、xlwt、xlutils、xlwings、XlsxWriter、openpyxl 、pandas等,下面我给这个做一个详细的对比表,如下:

excel库对比表

安装

安装命令:

pip install openpyxl

安装之后,可以在python中使用 import openpyxl 验证是否安装成功,没有报错就说明安装成功,反之安装失败。

             

基本操作

1.引入库

from openpyxl import Workbook,load_workbook

from openpyxl.styles import *

from openpyxl.chart import *

2.工作簿

在详细介绍工作簿相关的知识之前,我们把经常使用的属性和函数做个总结,如下:

创建或者加载工作簿

  1. #创建和打开工作薄
  2. from openpyxl import Workbook,load_workbook
  3. wb = Workbook() #创建工作薄
  4. wb1 = load_workbook('test.xlsx') #打开已有工作薄

获取当前工作表

  1. from openpyxl import Workbook,load_workbook
  2. wb = Workbook() #创建工作薄
  3. ws = wb.active #获取当前工作表

3.工作表

在详细介绍工作表相关的知识之前,我们把经常使用的属性和函数做个总结,如下:

创建工作表和获取工作表 

  1. #创建工作表和获取工作表 
  2. from openpyxl import Workbook
  3. wb = Workbook()
  4. ws = wb.create_sheet("sheet") #创建一个 sheet 名为 sheet
  5. ws.title = "test" # 设置 sheet 标题
  6. ws1 = wb.create_sheet("sheet1", 0) # 创建一个 sheet,插入到最前面 默认插在后面
  7. ws1.title = "test1" # 设置 sheet 标题
  8. ws1.sheet_properties.tabColor = "1072BA" # 设置 sheet 标签背景色
  9. ws1 = wb['test'] # 获取 sheet
  10. ws2 = wb.active #获取当前工作表
  11. wb.save('test.xlsx')

获取所有工作表

  1. import openpyxl
  2. wb = openpyxl.load_workbook('test.xlsx')
  3. sheets = wb.sheetnames #获取所有工作表
  4. print(sheets)
  5. for i in range(len(sheets)): #遍历所有工作表
  6. sheet = wb[sheets[i]]
  7. print('第' + str(i + 1) + '个sheet: ' + sheet.title + ':')
  8. for r in range(1, sheet.max_row + 1):
  9. if r == 1:
  10. print(''.join([str(sheet.cell(row=r, column=c).value).ljust(17) for c in range(1, sheet.max_column + 1)]))
  11. else:
  12. print(''.join([str(sheet.cell(row=r, column=c).value).ljust(20) for c in range(1, sheet.max_column + 1)]))

运行结果如下:

删除工作表

  1. from openpyxl import Workbook
  2. wb = Workbook()
  3. ws = wb.create_sheet("test_1")
  4. ws.title = "test1"
  5. ws1 = wb.create_sheet("test_2")
  6. ws1.title = "test2"
  7. ws2 = wb.create_sheet("test_3")
  8. ws2.title = "test3"
  9. sheets = wb.sheetnames
  10. print(sheets)
  11. wb.remove(wb[sheets[1]]) #删除工作表
  12. wb.remove(wb["test2"]) #删除工作表
  13. del wb["test3"] #删除工作表

复制工作表

  1. import openpyxl
  2. src="test.xlsx"
  3. dest="dest.xlsx"
  4. wb = openpyxl.load_workbook(src)
  5. wsc1=wb.copy_worksheet(wb.worksheets[0])
  6. wsc2=wb.copy_worksheet(wb.worksheets[0])
  7. wsc1.title="test1"
  8. wb.save(dest)

过滤和排序

  1. from openpyxl import Workbook
  2. wb = Workbook()
  3. ws = wb.active
  4. data = [
  5. ["Fruit", "price"],
  6. ["banana", 15],
  7. ["Apple", 5],
  8. ["cherry", 50],
  9. ["pitaya", 3],
  10. ["Pear", 8],
  11. ]
  12. # 按行写入数据
  13. for d in data:
  14. ws.append(d)
  15. # 设置筛选排序的单元格区域
  16. ws.auto_filter.ref = "A1:B6"
  17. # 筛选第1列里值是Apple/banana
  18. ws.auto_filter.add_filter_column(0, ["banana", "Apple"])
  19. # 按B列的值升序排序
  20. ws.auto_filter.add_sort_condition("B2:B6")
  21. wb.save("test1.xlsx")

openpyxl也有过滤与排序功能,不过它只是完成了设置,并没有真正的实现过滤与排序。运行结果如下:

使用公式

  1. from openpyxl import Workbook
  2. wb = Workbook()
  3. ws = wb.active
  4. data = [
  5. ["Fruit", "price"],
  6. ["banana", 15],
  7. ["Apple", 5],
  8. ["cherry", 50],
  9. ["pitaya", 3],
  10. ["Pear", 8],
  11. ["Sum", 0],
  12. ]
  13. # 按行写入数据
  14. for d in data:
  15. ws.append(d)
  16. ws['B7'] = "=SUM(B2:B6)"
  17. wb.save("test1.xlsx")

我们在操作Excel表格的时候经常使用到一些公式,如求和(SUM),条件判断(IF)等,而openpyxl也可以使用他们,它还有Tokenizer(解析公式),Translator(将公式从一个位置转移到另一个位置)等。上面例子代码运行结果如下:

4.单元格

在详细介绍单元格相关的知识之前,我们把经常使用的属性和函数做个总结,如下:

红色部分是单元格的样式属性相关的字段,通过导入库如下:

  1. from openpyxl.styles import Font, PatternFill, Border, Side, Alignment, Protection
  2. from openpyxl.styles import numbers

访问单元格

  1. from openpyxl import Workbook
  2. wb = Workbook()
  3. ws = wb.create_sheet("test_1")
  4. ws.title = "test1"
  5. print(ws["B"]) #访问某列单元格
  6. print(ws["2"]) #访问某行单元格
  7. print(ws["B2"]) #访问单元格
  8. print(ws.cell(1, 1)) #访问单元格
  9. print(ws["A:C"]) #访问多列单元格

运行结果如下:

​ 合并单元格

  1. from openpyxl import Workbook
  2. wb = Workbook()
  3. ws = wb.create_sheet("test_1")
  4. ws.title = "test1"
  5. print("合并单元格前:")
  6. print(ws.merged_cells)
  7. print(ws.merged_cells.ranges)
  8. ws.merge_cells("A1:B1")
  9. ws.merge_cells(start_column=2,end_column=4,start_row=2,end_row=3)
  10. print("合并单元格后:")
  11. print(ws.merged_cells)
  12. print(ws.merged_cells.ranges)

合并后的单元格,只会保留最上角的值,其他单元格的值全部为空(None),运行结果如下:

 

拆分单元格

  1. from openpyxl import Workbook
  2. wb = Workbook()
  3. ws = wb.create_sheet("test_1")
  4. ws.title = "test1"
  5. ws.merge_cells("A1:B1")
  6. ws.merge_cells(start_column=2,end_column=4,start_row=2,end_row=3)
  7. print("拆分单元格前:")
  8. print(ws.merged_cells)
  9. print(ws.merged_cells.ranges)
  10. ws.unmerge_cells('A1:B1')
  11. ws.unmerge_cells('B2:D3')
  12. print("拆分单元格后:")
  13. print(ws.merged_cells)
  14. print(ws.merged_cells.ranges)

运行结果如下:

单元格数据

  1. from openpyxl import Workbook
  2. wb = Workbook()
  3. ws = wb.create_sheet("test_1")
  4. ws.title = "test1"
  5. a = ws.cell(1, 1)
  6. a.value = 11
  7. print(a.value)

单元格遍历

遍历单元格我们有三种方式:

1. 使用min_row,max_row和min_column,max_column

2.使用 rows或者columns

3.使用values

代码如下: 

  1. from openpyxl import Workbook
  2. wb = Workbook()
  3. ws = wb.create_sheet("test_1")
  4. ws.title = "test1"
  5. a = ws.cell(1, 1)
  6. a.value = 11
  7. ws.cell(2, 1).value = 12
  8. for i in ws.values:
  9. print(i)

单元格样式

  1. from openpyxl import Workbook
  2. from openpyxl.styles import Font, PatternFill, Border, Side, Alignment, Protection
  3. from openpyxl.styles import numbers
  4. wb = Workbook()
  5. ws = wb.create_sheet("test_1")
  6. ws.title = "test1"
  7. cell = ws.cell(1, 1)
  8. cell.value = 11
  9. cell.font = Font(name=u'宋体', size=12, bold=True, color='FF0000')
  10. cell.alignment = Alignment(horizontal='right')
  11. cell.fill = PatternFill(fill_type='solid', start_color='FF0000')
  12. cell.border = Border(left=Side(border_style='thin', color='FF0000'), right= Side(border_style='thin', color='FF0000'))
  13. cell.protection = Protection(locked=True, hidden=True)
  14. cell.number_format =numbers.FORMAT_PERCENTAGE
  15. print("字体:" ,cell.font,)
  16. print("对齐:" ,cell.alignment)
  17. print("边框:" ,cell.border)
  18. print("填充:" ,cell.fill)
  19. print("数字格式:",cell.number_format)
  20. print("超链接:" ,cell.hyperlink)

运行结果如下:

转化为pandas

  1. from openpyxl import Workbook
  2. import pandas as pd
  3. wb = Workbook()
  4. ws = wb.create_sheet("test_1")
  5. ws.title = "test1"
  6. cell = ws.cell(1, 1)
  7. cell.value = 11
  8. d = pd.DataFrame(ws.values)
  9. print(d)
  10. print("\n")
  11. for i in d.values:
  12. ws.append(i.tolist()) #向后追加数据
  13. #pandas转化为工作表数据
  14. for m in range(ws.min_column,ws.max_column+1):
  15. for n in range(ws.min_row,ws.max_row+1):
  16. print(m,n, ws.cell(n,m).value)

运行结果如下:

​ 

6.图表生成

图表操作主要使用到PieChart, Reference, BarChart, BubbleChart, ScatterChart ,Series, DataLabelList, RichText, Paragraph, ParagraphProperties, CharacterProperties等

柱状图

  1. # 绘制饼图
  2. import openpyxl
  3. from openpyxl import Workbook
  4. from openpyxl.chart import PieChart, Reference, BarChart, BubbleChart, ScatterChart
  5. # Reference:图标所用信息
  6. from openpyxl.chart import Series
  7. from openpyxl.chart.label import DataLabelList
  8. from openpyxl.chart.text import RichText
  9. from openpyxl.drawing.text import Paragraph, ParagraphProperties, CharacterProperties
  10. wb = Workbook()
  11. ws = wb.active
  12. data = [
  13. ["Fruit", "price", "num"],
  14. ["banana", 15,1],
  15. ["Apple", 5,2],
  16. ["cherry", 50,4],
  17. ["pitaya", 3,2],
  18. ["Pear", 8,5],
  19. ]
  20. # 按行写入数据
  21. for d in data:
  22. ws.append(d)
  23. ws.title = 'Pie Charts'
  24. # 绘制柱状图
  25. bar_chart = BarChart()
  26. bar_chart.type = 'col' # col垂直、水平柱状图 bar
  27. # 设置标题
  28. bar_chart.title = 'Fruit price Bar'
  29. # 进行分类
  30. category = Reference(ws, min_col=1, min_row=2, max_row=6)
  31. data = Reference(ws, min_col=2, min_row=1, max_row=6, max_col=3) # 数据所在第2列
  32. # 需要先添加数据再设置种类介绍
  33. # 添加数据
  34. bar_chart.add_data(data,titles_from_data=True)
  35. # 设置所分类别
  36. bar_chart.set_categories(category)
  37. # 设置横轴纵轴标题
  38. bar_chart.x_axis.title = 'Fruit'
  39. bar_chart.y_axis.title = 'price'
  40. bar_chart.style = 10 # 图表样式类型
  41. bar_chart.height = 10 # 图表高度
  42. bar_chart.width = 15 # 图表宽度
  43. s1 = bar_chart.series[0]
  44. s1.dLbls = DataLabelList()
  45. s1.dLbls.showCatName = True # 标签显示
  46. s1.dLbls.showVal = True # 数量显示
  47. axis = CharacterProperties(sz=900) # 图表中字体大小 *100
  48. s1.dLbls.txPr = RichText(p=[Paragraph(pPr=ParagraphProperties(defRPr=axis), endParaRPr=axis)])
  49. # 在excel添加饼图
  50. ws.add_chart(bar_chart, 'D5') # 在D5位置绘制柱状图
  51. # 保存
  52. wb.save('fruit_price.xlsx')

如果想生成三维图,可以使用BarChart3D,上面例子运行结果如下:

圆饼图

  1. # 绘制饼图
  2. import openpyxl
  3. from openpyxl import Workbook
  4. from openpyxl.chart import PieChart, Reference, BarChart, BubbleChart, ScatterChart
  5. # Reference:图标所用信息
  6. from openpyxl.chart import Series
  7. from openpyxl.chart.label import DataLabelList
  8. from openpyxl.chart.text import RichText
  9. from openpyxl.drawing.text import Paragraph, ParagraphProperties, CharacterProperties
  10. wb = Workbook()
  11. ws = wb.active
  12. data = [
  13. ["Fruit", "price"],
  14. ["banana", 15],
  15. ["Apple", 5],
  16. ["cherry", 50],
  17. ["pitaya", 3],
  18. ["Pear", 8],
  19. ]
  20. # 按行写入数据
  21. for d in data:
  22. ws.append(d)
  23. ws.title = 'Pie Charts'
  24. # 绘制饼图
  25. pie_chart = PieChart()
  26. # 设置标题
  27. pie_chart.title = 'Fruit price category'
  28. # 进行分类
  29. category = Reference(ws, min_col=1, min_row=2, max_row=6)
  30. data = Reference(ws, min_col=2, min_row=2, max_row=6) # 数据所在第2列
  31. # 需要先添加数据再设置种类介绍
  32. # 添加数据
  33. pie_chart.add_data(data)
  34. # 设置所分类别
  35. pie_chart.set_categories(category)
  36. pie_chart.style = 10 # 图表样式类型
  37. pie_chart.height = 10 # 图表高度
  38. pie_chart.width = 15 # 图表宽度
  39. s1 = pie_chart.series[0]
  40. s1.dLbls = DataLabelList()
  41. s1.dLbls.showCatName = True # 标签显示
  42. #s1.dLbls.showVal = True # 数量显示
  43. s1.dLbls.showPercent = True # 百分比显示
  44. axis = CharacterProperties(sz=900) # 图表中字体大小 *100
  45. s1.dLbls.txPr = RichText(p=[Paragraph(pPr=ParagraphProperties(defRPr=axis), endParaRPr=axis)])
  46. # 在excel添加饼图
  47. ws.add_chart(pie_chart, 'D5') # 在D5位置绘制饼图
  48. # 保存
  49. wb.save('fruit_price.xlsx')

运行结果如下:

折线图

  1. # 绘制饼图
  2. import openpyxl
  3. from openpyxl import Workbook
  4. from openpyxl.chart import LineChart,PieChart, Reference, BarChart, BubbleChart, ScatterChart
  5. # Reference:图标所用信息
  6. from openpyxl.chart import Series
  7. from openpyxl.chart.label import DataLabelList
  8. from openpyxl.chart.text import RichText
  9. from openpyxl.drawing.text import Paragraph, ParagraphProperties, CharacterProperties
  10. wb = Workbook()
  11. ws = wb.active
  12. data = [
  13. ["Fruit", "price", "num"],
  14. ["banana", 15,1],
  15. ["Apple", 5,2],
  16. ["cherry", 50,4],
  17. ["pitaya", 3,2],
  18. ["Pear", 8,5],
  19. ]
  20. # 按行写入数据
  21. for d in data:
  22. ws.append(d)
  23. ws.title = 'Line Charts'
  24. # 绘制散点图
  25. line_chart = LineChart()
  26. # 设置标题
  27. line_chart.title = 'Fruit price Line'
  28. data = Reference(ws, min_col=2, min_row=1, max_col=3, max_row=6)
  29. line_chart.add_data(data, titles_from_data=True)
  30. line_chart.y_axis.title = 'price' # Y轴
  31. line_chart.x_axis.title = 'Fruit' # X轴
  32. line_chart.style = 10 # 图表样式类型
  33. line_chart.height = 10 # 图表高度
  34. line_chart.width = 15 # 图表宽度
  35. s1 = line_chart.series[0]
  36. s1.marker.symbol = "triangle" # triangle为三角形标记, 可选circle、dash、diamond、dot、picture、plus、square、star、triangle、x、auto
  37. s1.marker.graphicalProperties.solidFill = "FF0000" # 填充颜色
  38. s1.marker.graphicalProperties.line.solidFill = "0000FF" # 边框颜色
  39. s1.smooth = True # 线条平滑
  40. s2 = line_chart.series[1]
  41. s2.graphicalProperties.line.solidFill = "00AAAA"
  42. s2.graphicalProperties.line.dashStyle = "sysDot" # 线条点状样式
  43. s2.graphicalProperties.line.width = 80000 # 线条大小,最大20116800EMUs
  44. s2.smooth = True # 线条平滑
  45. # 将折线图添加到ws工作表中
  46. ws.add_chart(line_chart, 'D5')
  47. # 保存
  48. wb.save('fruit_price.xlsx')

运行结果如下:

 散点图

  1. # 绘制饼图
  2. import openpyxl
  3. from openpyxl import Workbook
  4. from openpyxl.chart import PieChart, Reference, BarChart, BubbleChart, ScatterChart
  5. # Reference:图标所用信息
  6. from openpyxl.chart import Series
  7. from openpyxl.chart.label import DataLabelList
  8. from openpyxl.chart.text import RichText
  9. from openpyxl.drawing.text import Paragraph, ParagraphProperties, CharacterProperties
  10. wb = Workbook()
  11. ws = wb.active
  12. data = [
  13. ["Fruit", "price", "num"],
  14. ["banana", 15,1],
  15. ["Apple", 5,2],
  16. ["cherry", 50,4],
  17. ["pitaya", 3,2],
  18. ["Pear", 8,5],
  19. ]
  20. # 按行写入数据
  21. for d in data:
  22. ws.append(d)
  23. ws.title = 'Scatter Charts'
  24. # 绘制散点图
  25. scatter_chart = ScatterChart()
  26. # 设置标题
  27. scatter_chart.title = 'Fruit price Scatter'
  28. # 创建x轴的数据来源
  29. xvalues = Reference(ws, min_col=1, min_row=2, max_row=6)
  30. # 创建yvalues
  31. for i in range(2, 4):
  32. yvalues = Reference(ws, min_col=i, min_row=1, max_row=6)
  33. series = Series(yvalues, xvalues=xvalues, title_from_data=True)
  34. scatter_chart.series.append(series)
  35. # 设置横轴纵轴标题
  36. scatter_chart.x_axis.title = 'Fruit'
  37. scatter_chart.y_axis.title = 'price'
  38. scatter_chart.style = 10 # 图表样式类型
  39. scatter_chart.height = 10 # 图表高度
  40. scatter_chart.width = 15 # 图表宽度
  41. s1 = scatter_chart.series[0]
  42. s1.dLbls = DataLabelList()
  43. s1.dLbls.showCatName = True # 标签显示
  44. s1.dLbls.showVal = True # 数量显示
  45. axis = CharacterProperties(sz=900) # 图表中字体大小 *100
  46. s1.dLbls.txPr = RichText(p=[Paragraph(pPr=ParagraphProperties(defRPr=axis), endParaRPr=axis)])
  47. # 将散点图添加到ws工作表中
  48. ws.add_chart(scatter_chart, 'D5')
  49. # 保存
  50. wb.save('fruit_price.xlsx')

运行结果如下:

7.保存工作簿

wb.save(“test.xlsx”)


总结

本文章主要是介绍openpyxl对excel操作的常用方法和属性,如果你想更深入的理解openpyxl,我推荐你去看看openpyxl官网。希望该文章对你有所帮助,哈哈哈哈哈哈~ 感谢阅读!

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
openpyxl
化繁为简,python操作excel
python用openpyxl操作excel
Python中用OpenPyXL处理Excel表格
Python_Openpyxl 浅谈(最全总结 足够初次使用)
Openpyxl 创建一个工作簿
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服