1. 前言

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

​其中,

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

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

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

2. xlsxwriter

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

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

首先安装 xlsxwriter 的依赖包

# 安装依赖包
pip3 install xlsxwriter

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

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

def create_workbook_and_worksheet(filename, worksheet_names):"""创建工作簿和Sheet:param filename: 文件名称:param worksheet_names: sheet名称列表:return:"""wb = xlsxwriter.Workbook(filename)sheets = []# 新增sheetfor worksheet_name in worksheet_names:sheets.append(wb.add_worksheet(worksheet_name))return wb, sheets

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

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

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

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

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

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

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

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

使用的方法是:insert_image()

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

以插入一张网络图片为例

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

def create_image_options(x_offset=0, y_offset=0, x_scale=1, y_scale=1, url=None, tip=None, image_data=None,positioning=None):"""插入图片的参数配置包含:偏移量、缩放比、网络图片链接、超链接、悬停提示灯:param x_offset::param y_offset::param x_scale::param y_scale::param url::param tip::param image_data::param positioning::return:"""image_options = {'x_offset': x_offset,'y_offset': y_offset,'x_scale': x_scale,'y_scale': y_scale,'url': url,'tip': tip,'image_data': image_data,'positioning': positioning,}return image_optionsimage_options = create_image_options(x_scale=0.5, y_scale=0.5, url='https://www.jianshu.com/u/f3b476549169')

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

from io import BytesIO
import ssldef get_image_data_from_network(url):"""获取网络图片字节流:param url: 图片地址:return:"""ssl._create_default_https_context = ssl._create_unverified_context# 获取网络图片的字节流image_data = BytesIO(urlopen(url).read())return image_data

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

def insert_network_image(sheet, row_index, column_index, url, filepath, image_options=None):"""插入网络图片:param sheet::param row_index::param column_index::param url::param filepath::param image_options::return:"""if row_index < 1 or column_index < 1:return "参数输入有误,插入失败!"# 获取图片字节流image_data = get_image_data_from_network(url)if image_options:image_options['image_data'] = image_dataprint(image_options)sheet.insert_image(row_index - 1, column_index - 1, filepath, image_options)insert_network_image(self.current_sheet, 1, 1, url, '1.png', image_options4)

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

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

def set_column_width(sheet, index_start, index_end, width):"""设置列宽:param sheet::param index_start: 开始位置,从1开始:param index_end: 结束位置:param width: 宽度:return:"""# 方式二选一# self.current_sheet.set_column('A:C', width)# 默认0代表第一列sheet.set_column(index_start - 1, index_end - 1, width)# 设置列宽度
# 设置第1列到第3列的宽度为:100
set_column_width(self.current_sheet, 1, 3, 100)

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

def set_row_height(sheet, row_index, height):"""设置行高:param sheet::param row_index: 行索引,从1开始:param height::return:"""sheet.set_row(row_index - 1, height)# 设置行高
set_row_height(self.current_sheet, 1, 50)
set_row_height(self.current_sheet, 2, 100)

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

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

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

3. 其他方式

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

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

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

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

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

其中,

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

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

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

4. 最后

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

关注有惊喜哦~

python image 转成字节_Python 办公自动化之 Excel(下)相关推荐

  1. python列表转换成数字_python 字母转成数字Python操作列表的常用方法总结

    下面列出列表常用的方法操作列表以及小例子: 1.  Append 在列表末尾添加元素,需在列表末尾添加元素,需要注意几个点: A. append中添加的参数是作为一个整体 >>> n ...

  2. python批量读取dat文件_python编写Windows环境下批量修改文件名

    在日常编程工作中我们经常需要对文件进行操作,而文件一般都是由文件名和扩展名组成的.比如我们经常需要把.dat 格式 转化成 .txt格式,把png改成jgp格式等等.这里我们就教大家如何利用PYTHO ...

  3. python image 转成字节_就是这么牛!三行Python代码,让数据处理速度提高2到6倍

    本文可以教你仅使用 3 行代码,大大加快数据预处理的速度. Python 是机器学习领域内的首选编程语言,它易于使用,也有很多出色的库来帮助你更快处理数据.但当我们面临大量数据时,一些问题就会显现-- ...

  4. python image 转成字节_就是这么流弊!三行Python代码,让数据处理速度提高2到6倍

    选自TowardsDataScience 作者:George Seif 本文转自机器之心(nearhuman2014) 本文可以教你仅使用 3 行代码,大大加快数据预处理的速度. Python 是机器 ...

  5. python的浮点数占字节_Python二进制文件读取并转换为浮点数详解

    本文所用环境: Python 3.6.5 |Anaconda custom (64-bit)| 引言 由于某些原因,需要用python读取二进制文件,这里主要用到struct包,而这个包里面的方法主要 ...

  6. python image 转成字节_(推荐)谈谈Python生态圈图像格式转换问题:含实例解析

    今天为大家带来的内容是:(推荐)谈谈Python生态圈图像格式转换问题:含实例解析 天气冷了,码字手都不利索了!先哈一哈气,各位也要多穿衣服注意保暖哈.话不多说,就直接进入主题了. 在Python生态 ...

  7. python浮点数占多少字节_Python的浮点数损失精度问题

    原博文 2018-04-20 22:35 − 本篇讨论的现象可以从下面这段脚本体现出来:>>> x = 0.0 >>> for i in range(10): x ...

  8. python 序列化压缩成字符串_Python 将json序列化后的字符串转换成字典(推荐)

    一般而言下面的就可以完成需求了. def convertToDic(data): jsonDic=json.loads(data) return dict(jsonDic) 但实际应用中可能会出现一些 ...

  9. python 强制转换成字符_Python笔记(三)

    来源网络 「往期回顾」 Python笔记(一) Python笔记(二) 「本期内容」 1.用户输入与while循环 2.函数 3.模块 哈喽,各位小伙伴们,大家上午好!话说,你们知道今天是什么日子么? ...

  10. python输入数字成数组_python 怎么把数字加入数组

    python怎么输入一个数组矩阵 python 原来需要输入值给数组怎么改成直接给数组赋小编蓝色的两行想要弄成固定的值要怎么弄啊没什么好遗憾,本就是你情小编愿,聚散离合都在情理之中. 牛客网 pyth ...

最新文章

  1. GPU对决TPU,英伟达能否守住领先地位?
  2. pandas使用notnull函数将dataframe中所有缺失值映射为False,非缺失值映射为True(map missing vlaues into False others into True
  3. 计算机音乐是哪一个,哪种软件适合音乐编辑的计算机版本?
  4. 【Flutter】Image 组件 ( Image 组件简介 | Image 构造函数 | Image.network 构造函数 | Image.asset 构造函数 )
  5. springmvc二十四:自定义国际化信息
  6. 【NLP】如何清理文本数据?
  7. 十六、爬虫实战,多线程抓取毛豆新车的数据
  8. mysql表空间段区块如何理解_Oracle表空间、段、区和块简述
  9. 中国大学moocpython笔记_用Python玩转数据,中国大学MOOC(慕课)答案公众号搜题
  10. 方法重写(override)注意事项和使用细节
  11. Python-类基础
  12. 为什么选择angular?-学习笔记
  13. C2的完整形式是什么?
  14. Android 4.1新增功能特性
  15. [置顶] SPL讲解(6)--Condition篇
  16. 《Java基础入门》笔记——01 Java初步
  17. C#解压zip和rar文件
  18. Redis详细使用文档记录
  19. Android Studio 中Locat使用包名过滤无法显示的问题
  20. 首次适应算法 动态分区分配方式的模拟 C语言——课程设计实习

热门文章

  1. 12.凤凰架构:构建可靠的大型分布式系统 --- 容器间网络
  2. 2.Linux/Unix 系统编程手册(上) -- 基本概念
  3. 软件测试成熟度与自动化测试
  4. LoadRunner 12 和 UFT\QTP 12在HP官网已经可以开始下载了
  5. struts2中的addActionError addFieldError addActionMessage的方法
  6. 实现本地svn目录同步时,服务器的相应目录保持自动同步
  7. C# WIN7电脑双屏设置不同内容的桌面
  8. linux系统优化的方法
  9. 解决Odoo出现的Unable to send email, please configure the sender's email address or alias.
  10. 那年,寻找工作的历程