首页Python【Python计算生态】P...

【Python计算生态】PyExcelerate——快速写入Excel

Python受欢迎的原因之一就是其计算生态丰富,据不完全统计,Python 目前为止有约13万+的第三方库。

本系列将会陆续整理分享一些有趣、有用的第三方库。

文章配套代码获取有以下两种途径:
  • 通过百度网盘获取:
链接:https://pan.baidu.com/s/1FSGLd7aI_UQlCQuovVHc_Q?pwd=mnsj 提取码:mnsj
  • 前往GitHub获取
https://github.com/returu/Python_Ecosystem





01
简介

PyExcelerate 是一个用于快速读写 Excel 文件的 Python 第三方库。它比传统的 openpyxl 和 xlwt 库在处理大规模数据时具有更高的性能。PyExcelerate 主要专注于写入 Excel 文件,支持 .xlsx 格式,并且提供了简单易用的 API
直接使用pip安装:
pip install PyExcelerate
GitHub页面:
https://github.com/kz26/PyExcelerate

02
写入数据:

  • 批量写入数据:

以下是一个简单的示例,通过 pyexcelerate 库将一个二维数组的数据写入到新创建的 Excel 工作表中,并保存为文件。

# 从 pyexcelerate 库中导入 Workbook 类,Workbook 类用于创建和操作 Excel 工作簿
from pyexcelerate import Workbook

# 定义一个二维数组 data,该数组包含了要写入 Excel 文件的数据
data = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

# 创建一个 Workbook 对象,即一个新的 Excel 工作簿
wb = Workbook()

# 调用 Workbook 对象的 new_sheet 方法,在工作簿中创建一个新的工作表
# 第一个参数为新工作表的名称
# 第二个参数为要写入的数据
wb.new_sheet("my sheet", data=data)

# 调用 Workbook 对象的 save 方法,将当前的工作簿保存为 Excel 文件
wb.save("output.xlsx")
需要注意的是,PyExcelerate 不支持直接将 Pandas DataFrame 作为数据参数传递给新工作表。
如果工作表不需要渲染标题行,可以使用 .tolist() 将DataFrame转换为二维列表,因为 PyExcelerate 在处理列表形式的数据时有一些优化。如果工作表需要渲染标题行,需要将 DataFrame 自行转换为包含标题行的列表。
  • 将批量数据写入范围:

PyExcelerate 支持直接将数据写入范围,这比逐个单元格写入更快。

from pyexcelerate import Workbook

# 实例化一个 Workbook 对象
wb = Workbook()

# 调用 Workbook 对象的 new_sheet 方法,在工作簿里创建一个新的工作表
ws = wb.new_sheet("test")

# 利用工作表对象 ws 的 range 方法,指定一个单元格范围
# "B2" 和 "C3" 分别是该范围的左上角和右下角单元格,即这个范围涵盖了 B2、B3、C2、C3 这四个单元格
# 接着,将二维列表 [[1, 2], [3, 4]] 赋值给这个单元格范围
# 其中,1 会被写入 B2 单元格,2 写入 C2 单元格,3 写入 B3 单元格,4 写入 C3 单元格
ws.range("B2""C3").value = [[1, 2], [3, 4]]

# 保存
wb.save("range.xlsx")
  • 写入单元格数据:

PyExcelerate 提供了以下两种不同的方式向工作表的单元格中写入数据:

  • 使用 set_cell_value 方法向指定单元格写入数据。
  • 通过索引的方式访问单元格并赋值。
from datetime import datetime
from pyexcelerate import Workbook

wb = Workbook()
ws = wb.new_sheet("sheet name")

# 方式一:推荐,Faster
# 使用 set_cell_value 方法向指定单元格写入数据
# 第一个参数 1 表示行号(从 1 开始计数),第二个参数 1 表示列号(从 1 开始计数),第三个参数 15 是要写入的值
# 此操作将数字 15 写入到工作表的 A1 单元格
ws.set_cell_value(1, 1, 15)  
# 将数字 20 写入到工作表的 B1 单元格
ws.set_cell_value(1, 2, 20)
# 将公式 "=SUM(A1,B1)" 写入到工作表的 C1 单元格,该公式会计算 A1 和 B1 单元格数值的和
ws.set_cell_value(1, 3, "=SUM(A1,B1)")  
# 将当前的日期和时间写入到工作表的 D1 单元格
ws.set_cell_value(1, 4, datetime.now())  

# 方式二:Fast
# 通过索引的方式访问单元格并赋值
# ws[1][1] 表示第一行第一列的单元格(索引从 0 开始,但这里库的索引从 1 开始),将数字 15 写入该单元格
ws[1][1].value = 15  
# 将数字 20 写入到工作表的 B1 单元格
ws[1][2].value = 20
# 将公式 "=SUM(A1,B1)" 写入到工作表的 C1 单元格
ws[1][3].value = "=SUM(A1,B1)"
# 将当前的日期和时间写入到工作表的 D1 单元格
ws[1][4].value = datetime.now()  

# 保存文件
wb.save("Writing_cell_data.xlsx")
  • 按名称选择单元格:

调用工作表对象 ws 的 cell 方法可以按照名称选择单元格,接着使用 .value 属性写入数据。
from pyexcelerate import Workbook

wb = Workbook()
ws = wb.new_sheet("sheet name")

# 调用工作表对象 ws 的 cell 方法,传入 "A1" 表示要定位到工作表的 A1 单元格
# 接着使用 .value 属性,将整数 12 赋值给该单元格,也就是在 A1 单元格写入 12
ws.cell("A1").value = 12

wb.save("Selecting_cells_by_name.xlsx")

  • 合并单元格:

调用 merge 方法可以对指定范围内的单元格进行合并操作。
from pyexcelerate import Workbook

wb = Workbook()
ws = wb.new_sheet("sheet name")

# 通过索引方式访问工作表中的单元格并赋值
ws[1][1].value = 15

# 调用工作表对象 ws 的 range 方法,指定一个单元格范围
# "A1" 和 "B1" 分别为该范围的左上角和右下角单元格,此范围包含 A1 和 B1 两个单元格
# 接着调用 merge 方法,将 A1 到 B1 这个范围内的单元格进行合并操作
ws.range("A1""B1").merge()

wb.save("Merging_cells.xlsx")
03
设置单元格样式:

设置单元格样式会造成不可忽视的开销。它会增加代码执行时间(如果操作不当,可能会增加 10 倍以上)。因此,只有在绝对必要时才对单元格设置样式。

可用的样式属性包括(每个属性也有通过 set_cell_style() 实现的构造函数):
ws[1][1].style.font.bold = True
ws[1][1].style.font.italic = True
ws[1][1].style.font.underline = True
ws[1][1].style.font.strikethrough = True
ws[1][1].style.font.color = Color(255, 0, 255)
ws[1][1].style.fill.background = Color(0, 255, 0)
ws[1][1].style.alignment.vertical = 'top'
ws[1][1].style.alignment.horizontal = 'right'
ws[1][1].style.alignment.rotation = 90
ws[1][1].style.alignment.wrap_text = True
ws[1][1].style.borders.top.color = Color(255, 0, 0)
ws[1][1].style.borders.right.style = '-.'
ws[1][1].style.data_type = DataTypes.INLINE_STRING
ws[1][1].style.quote_prefix = True
可用的边框(borders)样式有:.-..-..=.medium -.medium -..medium —/-._
  • 设置单元格样式:

PyExcelerate 提供了三种不同的方式对 Excel 单元格样式进行设置:

from datetime import datetime

# 方式一:最快的方式Fastest
# 从 pyexcelerate 库导入所需的类,用于创建工作簿、设置颜色、样式、字体、填充和格式
from pyexcelerate import Workbook, Color, Style, Font, Fill, Format

wb = Workbook()
ws = wb.new_sheet("sheet_1")

# 在 A1 单元格写入数值 1
ws.set_cell_value(1, 1, 1)
# 为第 1 行第 1 列的单元格设置字体样式为加粗
ws.set_cell_style(1, 1, Style(font=Font(bold=True)))
# 设置字体样式为斜体
ws.set_cell_style(1, 1, Style(font=Font(italic=True)))
# 设置字体样式为下划线
ws.set_cell_style(1, 1, Style(font=Font(underline=True)))
# 设置字体样式为删除线
ws.set_cell_style(1, 1, Style(font=Font(strikethrough=True)))
# 设置填充颜色为红色(RGBA: 255, 0, 0, 0)
ws.set_cell_style(1, 1, Style(fill=Fill(background=Color(255, 0, 0, 0))))
# 在第 1 行第 2 列的单元格(即 B1 单元格)写入当前日期和时间
ws.set_cell_value(1, 2, datetime.now())
# 设置日期格式为 'mm/dd/yy'
ws.set_cell_style(1, 2, Style(format=Format('mm/dd/yy')))

# 方式二:较快的方式Faster
# from pyexcelerate import Workbook, Color

# ws.set_cell_value(1, 1, 1)
# ws.get_cell_style(1, 1).font.bold = True
# ws.get_cell_style(1, 1).font.italic = True
# ws.get_cell_style(1, 1).font.underline = True
# ws.get_cell_style(1, 1).font.strikethrough = True
# ws.get_cell_style(1, 1).fill.background = Color(0, 255, 0, 0)
# ws.set_cell_value(1, 2, datetime.now())
# ws.get_cell_style(1, 2).format.format = 'mm/dd/yy'

# 方式三:快速的方式Fast
# from pyexcelerate import Workbook, Color

# ws[1][1].value = 1
# ws[1][1].style.font.bold = True
# ws[1][1].style.font.italic = True
# ws[1][1].style.font.underline = True
# ws[1][1].style.font.strikethrough = True
# ws[1][1].style.fill.background = Color(0, 255, 0, 0)
# ws[1][2].value = datetime.now()
# ws[1][2].style.format.format = 'mm/dd/yy'

wb.save("Styling_cells.xlsx")

需要注意的是,在上述示例代码中,后续对 set_cell_style() 的调用会覆盖之前的样式,它们不会合并。要合并样式,需要创建一个具有多个属性的单个 Style 对象,例如:

ws.set_cell_style(1, 1, Style(font=Font(bold=True), format=Format('mm/dd/yy')))
  • 设置范围样式:

from pyexcelerate import Workbook, Color
from datetime import datetime

wb = Workbook()
ws = wb.new_sheet("test")

# 指定一个单元格范围并赋值
ws.range("A1""C3").value = 1

# 再次使用 range 方法指定一个单元格范围,这次是从 A1 到 C1
# 这代表工作表的第一行(A1、B1、C1 单元格)
# 将这个范围内单元格的字体样式设置为加粗
ws.range("A1""C1").style.font.bold = True
# 指定从 A2 到 C3 的单元格范围,将这个范围内单元格的字体样式设置为斜体
ws.range("A2""C3").style.font.italic = True
# 指定从 A3 到 C3 的单元格范围,将这个范围内单元格的填充背景颜色设置为红色
ws.range("A3""C3").style.fill.background = Color(255, 0, 0, 0)
# 指定从 C1 到 C3 的单元格范围将这个范围内单元格的字体样式设置为带有删除线
ws.range("C1""C3").style.font.strikethrough = True

wb.save("Styling_ranges.xlsx")
  • 设置行样式

有以下三种方式设置行样式。

需要注意的是,经过测试pyexcelerate在没有数据的行上不应用样式。因此需要预先写入一些数据。

# 方式一:最快的方式Fastest
from pyexcelerate import Workbook, Color, Style, Fill

wb = Workbook()
ws = wb.new_sheet("sheet name")

# 在 A1 单元格写入数值 1
ws.set_cell_value(1, 1, 1)

# 使用 set_row_style 方法为工作表的第 1 行设置样式
# 这里创建了一个 Style 对象,其中包含一个 Fill 对象,
# Fill 对象的 background 属性使用 Color 类指定为红色(RGBA: 255, 0, 0)
ws.set_row_style(1, Style(fill=Fill(background=Color(255, 0, 0))))

# 方式二:较快的方式Faster
from pyexcelerate import Workbook, Color
# 使用 get_row_style 方法获取工作表第 1 行的样式对象
# 然后将该行样式对象的填充背景颜色设置为红色(RGB: 255, 0, 0)
ws.get_row_style(1).fill.background = Color(255, 0, 0)

# 方式三:快速的方式Fast
from pyexcelerate import Workbook, Color
# 通过索引方式访问工作表的第 1 行,
# 然后设置该行样式对象的填充背景颜色为红色(RGB: 255, 0, 0)
ws[1].style.fill.background = Color(255, 0, 0)


wb.save("Styling_rows.xlsx")
  • 设置列样式

与设置行样式类似,可以对列进行样式设置。

# 方式一:最快的方式Fastest
from pyexcelerate import Workbook, Color, Style, Fill

wb = Workbook()
ws = wb.new_sheet("sheet name")
ws.set_col_style(1, Style(fill=Fill(background=Color(255, 0, 0)))) # 设置行样式

# 方式二:较快的方式Faster
# from pyexcelerate import Workbook, Color

wb = Workbook()
ws = wb.new_sheet("sheet name")
ws.get_col_style(1).fill.background = Color(255, 0, 0)

wb.save("Styling_columns.xlsx")

  • 设置行高和列宽

的使用 Style 中的 size 属性设置行高和列宽。取值包括:
  • -1 表示自动适应;
  • 0 表示隐藏;
  • 其他任何值表示相应的大小。
例如,隐藏第 B 列:
from pyexcelerate import Workbook, Color, Style, Fill
from datetime import datetime

wb = Workbook()
ws = wb.new_sheet("sheet name")
# 设置列宽
ws.set_col_style(2, Style(size=0))
wb.save("Setting_column_widths.xlsx")
  • 链式样式

PyExcelerate 支持使用样式对象,而不是手动设置每个属性。

from pyexcelerate import Workbook, Font

wb = Workbook()
ws = wb.new_sheet("sheet name")

ws[1][1].value = 1

# 使用 Font 类创建一个字体样式对象,通过传入参数来设置字体的样式
# bold=True 表示字体加粗
# italic=True 表示字体倾斜
# underline=True 表示字体带有下划线
# strikethrough=True 表示字体带有删除线
font = Font(bold=True, italic=True, underline=True, strikethrough=True)

# 将刚才创建好的字体样式对象 font 应用到 A1 单元格的字体样式上
ws[1][1].style.font = font

wb.save("Linked_styles.xlsx")


更多内容可以前往官方文档查看:

https://github.com/kz26/PyExcelerate

本篇文章来源于微信公众号: 码农设计师

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments