1. 前言

前面谈到 Python 处理 Excel 文件最常见的两种方式,即:xlrd/xlwt、openpyxl

​其中,

xlrd/xlwt 这一组合,xlrd 可以负责读取数据,而 xlwt 则负责写入数据,缺点是不支持 xlsx

openpyxl 同时支持对 Excel 文档的读取、写入操作,缺点是不支持 xls

本篇文章将继续聊聊 Python 操作 Excel 文档的其他几种方式

2. xlsxwriter

xlsxwriter 主要用于将数据、图表写入到 Excel 文件中,可以配置使用较小的内存快速写入数据

它的缺点是:无法读取、修改已有的 Excel 文件;如果需要读取修改 Excel 文件,只能搭配其他依赖库使用,比如:xlrd

首先安装 xlsxwriter 的依赖包

  1. # 安装依赖包
  2. pip3 install xlsxwriter

xlsxwriter 提供了 Workbook(filename) 方法,用于创建一个工作簿对象

使用工作簿对象的 add_worksheet(sheet_name) 函数,就可以在工作簿中创建 Sheet 了

  1. def create_workbook_and_worksheet(filename, worksheet_names):
  2. """
  3. 创建工作簿和Sheet
  4. :param filename: 文件名称
  5. :param worksheet_names: sheet名称列表
  6. :return:
  7. """
  8. wb = xlsxwriter.Workbook(filename)
  9. sheets = []
  10. # 新增sheet
  11. for worksheet_name in worksheet_names:
  12. sheets.append(wb.add_worksheet(worksheet_name))
  13. return wb, sheets

接着,就可以往某个 Sheet 单元格中写入数据了

如果需要定制单元格的样式,比如:字体大小、字体、颜色、背景、是否加粗等,可以使用工作簿对象的 add_format() 方法创建一个样式

  1. def create_format_styles(wb, format_stuyles):
  2. """
  3. 创建一个样式,包含:字体大小、字体、颜色、背景、是否加粗等
  4. :param wb:
  5. :param format_stuyles:
  6. :return:
  7. """
  8. return wb.add_format(format_stuyles)
  9. # 单元格字体样式
  10. self.title_style = {'bold': True, 'bg_color': '#B0C4DE', 'font_size': 10,'font_name': 'Microsoft yahei'}
  11. # 创建标题字体样式
  12. title_font_style = create_format_styles(self.wb, self.title_style)

Sheet 对象的 write(...) 函数用于向单元格中写入数据,参数包含:行索引、列索引、值、字体样式等

需要注意的是,默认 xlsxwriter 的行索引、列索引都是从 0 开始,即: 0 代表第一行

写入数据的同时配置单元格样式的写法如下:

  1. def write_to_cell(sheet, row_index, column_index, value, format_styles=None):
  2. """
  3. 往单元格中写入数据
  4. :param row_index: 行索引,1:第一行
  5. :param column_index: 列索引,1:第一列
  6. :param format_styles 字体样式
  7. :return:
  8. """
  9. if row_index < 1 or column_index < 1:
  10. print('参数输入不正确,写入失败!')
  11. else:
  12. # 注意:默认xlsxwriter的行索引、列索引从0开始
  13. sheet.write(row_index - 1, column_index - 1, value, format_styles)
  14. # 往worksheet中写入数据
  15. # 第一行
  16. write_to_cell(self.current_sheet, 1, 1, "姓名", title_font_style)
  17. write_to_cell(self.current_sheet, 1, 2, "年龄", title_font_style)
  18. # 第二行
  19. write_to_cell(self.current_sheet, 2, 1, 'xingag')
  20. write_to_cell(self.current_sheet, 2, 2, 23)

xlsxwriter 同样支持在单元格中插入图片,包含:本地图片和网络图片

使用的方法是:insert_image()

参数包含:单元格行索引(索引从 0 开始)、单元格列索引、图片文件、可选参数(图片位置、缩放、url 超链接、image_data 图片字节流等)

以插入一张网络图片为例

首先,定义一个图片展示可选参数,指定图片的缩放比、url 超链接

  1. def create_image_options(x_offset=0, y_offset=0, x_scale=1, y_scale=1, url=None, tip=None, image_data=None,
  2. positioning=None):
  3. """
  4. 插入图片的参数配置
  5. 包含:偏移量、缩放比、网络图片链接、超链接、悬停提示灯
  6. :param x_offset:
  7. :param y_offset:
  8. :param x_scale:
  9. :param y_scale:
  10. :param url:
  11. :param tip:
  12. :param image_data:
  13. :param positioning:
  14. :return:
  15. """
  16. image_options = {
  17. 'x_offset': x_offset,
  18. 'y_offset': y_offset,
  19. 'x_scale': x_scale,
  20. 'y_scale': y_scale,
  21. 'url': url,
  22. 'tip': tip,
  23. 'image_data': image_data,
  24. 'positioning': positioning,
  25. }
  26. return image_options
  27. image_options = create_image_options(x_scale=0.5, y_scale=0.5, url='https://www.jianshu.com/u/f3b476549169')

接着,将网络图片转为字节流

  1. from io import BytesIO
  2. import ssl
  3. def get_image_data_from_network(url):
  4. """
  5. 获取网络图片字节流
  6. :param url: 图片地址
  7. :return:
  8. """
  9. ssl._create_default_https_context = ssl._create_unverified_context
  10. # 获取网络图片的字节流
  11. image_data = BytesIO(urlopen(url).read())
  12. return image_data

最后,将图片插入到单元格中

  1. def insert_network_image(sheet, row_index, column_index, url, filepath, image_options=None):
  2. """
  3. 插入网络图片
  4. :param sheet:
  5. :param row_index:
  6. :param column_index:
  7. :param url:
  8. :param filepath:
  9. :param image_options:
  10. :return:
  11. """
  12. if row_index < 1 or column_index < 1:
  13. return "参数输入有误,插入失败!"
  14. # 获取图片字节流
  15. image_data = get_image_data_from_network(url)
  16. if image_options:
  17. image_options['image_data'] = image_data
  18. print(image_options)
  19. sheet.insert_image(row_index - 1, column_index - 1, filepath, image_options)
  20. insert_network_image(self.current_sheet, 1, 1, url, '1.png', image_options4)

使用 set_column() 方法可以设置列宽

和 openpyxl 类似,有 2 种使用方式,分别是:字符串索引、列索引数字索引

  1. def set_column_width(sheet, index_start, index_end, width):
  2. """
  3. 设置列宽
  4. :param sheet:
  5. :param index_start: 开始位置,从1开始
  6. :param index_end: 结束位置
  7. :param width: 宽度
  8. :return:
  9. """
  10. # 方式二选一
  11. # self.current_sheet.set_column('A:C', width)
  12. # 默认0代表第一列
  13. sheet.set_column(index_start - 1, index_end - 1, width)
  14. # 设置列宽度
  15. # 设置第1列到第3列的宽度为:100
  16. set_column_width(self.current_sheet, 1, 3, 100)

行高使用 set_row() 方法,传入行索引和高度即可

  1. def set_row_height(sheet, row_index, height):
  2. """
  3. 设置行高
  4. :param sheet:
  5. :param row_index: 行索引,从1开始
  6. :param height:
  7. :return:
  8. """
  9. sheet.set_row(row_index - 1, height)
  10. # 设置行高
  11. set_row_height(self.current_sheet, 1, 50)
  12. set_row_height(self.current_sheet, 2, 100)

写入数据完毕之后,将工作簿关闭,文件会自动保存到本地

  1. def teardown(self):
  2. # 写入文件,并关闭文件
  3. self.wb.close()

xlsxwriter 还支持插入图表,比如:条形图、柱状图、雷达图等,受限于篇幅,这部分内容就不展开说明了

3. 其他方式

还有一种比较常见的方式是:xlwings

xlwings 是一款开源免费的依赖库,同时支持 Excel 文件的读取、写入、修改

它功能非常强大,还可以和 Matplotlib、Numpy 和 Pandas 无缝连接,支持读写 Numpy、Pandas 数据类型;同时,xlwings 可以直接调用 Excel 文件中 VBA 程序

需要注意的是,xlwings 依赖于 Microsoft Excel 软件,所以使用 WPS 的用户建议直接使用 openpyxl

官方文档:

https://docs.xlwings.org/zh_CN/latest/quickstart.html

另外,还有一个操作 Excel 比较强大的方式,即:Pywin32

其中,

Pywin32 相当于调用 Win 下的系统 API 来操作 Excel 文件

优点是:可以处理复杂图表的数据表

缺点也非常明显,包含:速度慢、占用 CPU 高,仅支持 Win 系统

4. 最后

综合发现,xlrd/xlwt、openpyxl、xlsxwriter 基本上可以满足大部分的日常 Excel 文档操作

要获取全部源码,关注公众号「 AirPython 」,后台回复「 excel 」即可获得全部源码

如果你觉得文章还不错,请大家 点赞、分享、留言下,因为这将是我持续输出更多优质文章的最强动力!

推荐阅读

最全总结 | 聊聊 Python 办公自动化之 Excel(上)

最全总结 | 聊聊 Python 办公自动化之 Excel(中)

最全总结 | 聊聊 Python 办公自动化之 Excel(下)的更多相关文章

  1. 最全总结 | 聊聊 Python 办公自动化之 Excel(中)

    1. 前言 上一篇文章中,我们聊到使用 xlrd.xlwt.xlutils 这一组合操作 Excel 的方法 最全总结 | 聊聊 Python 办公自动化之 Excel(上) ​本篇文章将继续聊另外一 ...

  2. 最全总结 | 聊聊 Python 办公自动化之 Excel(上)

    1. 前言 在我们日常工作中,经常会使用 Word.Excel.PPT.PDF 等办公软件 但是,经常会遇到一些重复繁琐的事情,这时候手工操作显得效率极其低下:通过 Python 实现办公自动化变的很 ...

  3. 最全总结 | 聊聊 Python 办公自动化之 Word(上)

    1. 前言 日常自动化办公中,使用 Python 真的能做到事半功倍! 在上一个系列中,我们对 Python 操作 Excel 进行了一次全面总结 最全总结 | 聊聊 Python 办公自动化之 Ex ...

  4. 最全总结 | 聊聊 Python 办公自动化之 Word(中)

    1. 前言 上一篇文章,对 Word 写入数据的一些常见操作进行了总结 最全总结 | 聊聊 Python 办公自动化之 Word(上) 相比写入数据,读取数据同样很实用! 本篇文章,将谈谈如何全面读取 ...

  5. 最全总结 | 聊聊 Python 办公自动化之 Word(下)

    1. 前言 关于 Word 文档的读写,前面两篇文章分别进行了一次全面的总结 最全总结 | 聊聊 Python 办公自动化之 Word(上) 最全总结 | 聊聊 Python 办公自动化之 Word( ...

  6. 最全总结 | 聊聊 Python 办公自动化之 PDF(上)

    1. 前言 自动化办公,非 Python 莫属! 从本篇文章开始,我们继续聊聊自动化办公中另外一个常用系列:PPT 2. 准备一下 Python 操作 PPT 最强大的依赖库是:python-pptx ...

  7. 最全总结 | 聊聊 Python 办公自动化之 PPT(中)

    1. 前言 上一篇文章简单地介绍了 PPT 的文档结构,并使用 python-pptx 这个依赖库完成对 PPT 文档最基本的操作 最全总结 | 聊聊 Python 办公自动化之 PPT(上) 作为 ...

  8. 最全总结 | 聊聊 Python 数据处理全家桶(PgSQL篇)

    1. 前言 大家好,我是安果! Python 数据处理全家桶,截止到现在,一共写过 6 篇文章,有兴趣的小伙伴可以去了解一下! 最全总结 | 聊聊 Python 数据处理全家桶(Mysql 篇) 最全 ...

  9. Python办公自动化之Excel做表自动化:全网最全,看这一篇就够了!

    文章目录 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识.那么针对这三类人,我给大家 ...

随机推荐

  1. idea如何新建一个springmvc 工程

    java 版本 1.8.0_261 idea 版本2020.1 Tomcat 9  maven 3.6 新建工程 File->new->project 默认会下载springframewo ...

  2. Cypress系列(63)- 使用 Custom Commands

    如果想从头学起Cypress,可以看下面的系列文章哦 https://www.cnblogs.com/poloyy/category/1768839.html Custom Commands 自定义命 ...

  3. 【Xshell】xshell6强制升级修改!

    使用sublime text打开nslicense.dll文件,把0f86 8100 0000 33c0 68fe 0100 0050 6689中的0f86 8100修改为0f83 8100然后保存即 ...

  4. ubuntu vi编辑器上下左右为ABCD的解决办法

    这个ubuntu系统自带的vi版本太老导致的,所以解决办法就是安装新版的vi编辑器: 首先卸载旧版本的vi编辑器: $sudo apt-get remove vim-common 然后安装新版的vi: ...

  5. pytest文档49-命令行参数--tb的使用

    前言 pytest 使用命令行执行用例的时候,有些用例执行失败的时候,屏幕上会出现一大堆的报错内容,不方便快速查看是哪些用例失败. --tb=style 参数可以设置报错的时候回溯打印内容,可以设置参 ...

  6. jmeter 相关

    Don't use GUI mode for load testing !, only for Test creation and Test debugging. For load testing, ...

  7. 闭嘴,给你一个数!1分钟,学完C语言指针,不扎手只扎心的针!

    序言 指针是C语言学习者绕不过的一道坎,也是C语言学习者不得绕过的一道坎.辨别一个人C语言学的好赖就看他对指针的理解怎么样.指针内容也是工作面试经常问到的问题.本文将带你重新认识那个绊倒你的指针,以解 ...

  8. 【思维】Luogu P3941 入阵曲

    题目大意 洛谷链接 给出一个矩阵和 \(K\) ,问有多少子矩阵中的元素和能整除 \(K\). 数据范围 \(2\leq n,m\leq 400\),\(0\leq K\leq 10^6\). 思路 ...

  9. Storm入门教程汇总

    http://www.aboutyun.com/thread-8059-1-1.html

  10. 第四章 Bash Shell 的简单应用

    一.Bash Shell 的简单介绍 1.什么是bash shell? 是一个命令解释器 它在操作系统的最外面 负责用户与内核进行交互的一种接口 将用户输入的命令翻译给操作系统,并将处理后的结果输出到 ...