Python3读写EXCEL⽂档XlsxWriter 只写
基本介绍
XlsxWriter 是在 Python 下操作 EXCEL ⽂档的利器
100% ⽀持 Excel XLSX ⽂件,⽀持 Excel 2003、Excel 2007 等版本
⽀持所有 Excel 单元格的数据格式
包括:
合并单元格、批注、⾃动筛选、丰富多格式字符串等
⽀持⼯作表PNG / JPEG / BMP / WMF / EMF图像。
⽤于写⼊⼤⽂件的内存优化模式。
安装
pip install XlsxWriter
基本使⽤⽰例
import xlsxwriter
# 创建⼀个新的 Excel ⽂件,并添加⼀个⼯作表
workbook = xlsxwriter.Workbook('demo.xlsx')
worksheet = workbook.add_worksheet()
# 设置第⼀列(A) 单元格宽度为 20
worksheet.set_column('A:A', 20)
# 定义⼀个加粗的格式对象
bold = workbook.add_format({'bold': True})
# 在 A1 单元格处写⼊字符串 'Hello'
worksheet.write('A1', 'Hello')
# 在 A2 单元格处写⼊中⽂字符串,并加粗字体
worksheet.write('A2', '千锋教育', bold)
# 利⽤⾏和列的索引号⽅式,写⼊数字,索引号是从 0 开始的
worksheet.write(2, 0, 100) # 3 ⾏ 1列
worksheet.write(3, 0, 35.8)
# 计算 A3 到 A4 的结果
worksheet.write(4, 0, '=SUM(A3:A4)')
# 在 B5 单元格处插⼊⼀个图⽚
worksheet.insert_image('B5', 'logo.png')
# 关闭 Excel ⽂件
workbook.close()
完成图
⽅法解析
⾏和列的表⽰⽅法
XlsxWriter⽀持两种表⽰法来指定单元格的位置:⾏列符和A1符号。
⾏列符号表⽰法是对⾏和列都使⽤基于零的索引号表⽰。
⽽A1符号表⽰法是使⽤标准Excel中的字母表⽰列,基于1的数字表⽰⾏。例如:
# 下⾯两个都表⽰为第⼀⾏的第⼀列
(0, 0)
('A1')
# 下⾯两个都表⽰为第七⾏的第三列
(6, 2)
('C7')
如果您以编程⽅式引⽤单元格,则⾏列符号表⽰法很有⽤:
for row in range(0, 5):
worksheet.write(row, 0, 'Hello')
如何表⽰⾏列范围
XlsxWriter⽀持Excel的⼯作表限制1,048,576⾏16,384列。
# ⽤ A1 符号表⽰法
worksheet.print_area('A1:XFD1') # Same as 1:1
worksheet.print_area('A1:A1048576') # Same as A:A
这些范围也可以使⽤⾏列符号指定:
worksheet.print_area(0, 0, 0, 16383) # Same as 1:1
worksheet.print_area(0, 0, 1048575, 0) # Same as A:A
Workbook 类
⽤于创建⼀个新的 Excel ⽂件
workbook = xlsxwriter.Workbook('demo.xlsx')
注意:和⽂件的打开模式w⼀样,会把原来的内容清空。所以只能新建⽂件。
他会返回⼀个 Workbook 的实例对象,代表了整个 Excel ⽂件,并且会把这个⽂件存储在磁盘上。最后要记得关闭这个⽂件
workbook.close()
当然建议使⽤with管理上下⽂,这样就可以不⽤显⽰的调⽤workboo.close()
with xlsxwriter.Workbook('hello_world.xlsx') as workbook:
worksheet = workbook.add_worksheet()
worksheet.write('A1', 'Hello world')
我们通过这个实例的⽅法来操作 Excel ⽂件,具体有以下⽅法:
add_worksheet([sheetname]) ⽅法
⽤于创建⼀个新的⼯作表
sheet_shee1 = workbook.add_worksheet() # ⼯作表名: Shee1
sheet_qf01 = workbook.add_worksheet('qf01') # ⼯作表名: qf01
sheet_shee3 = workbook.add_worksheet() # ⼯作表名: Shee3
它会返回⼀个表的对象,可以通过这个对象对表⾥的内容和样式来进⾏具体的操作。
add_format([properties]) ⽅法
⽤于创建⼀个格式化对象,使⽤这个对象可以对任意⼀个单元格进⾏格式化
properties是⼀个字典类型的参数,⾥边定义具体的格式
字体加粗格式
bold = workbook.add_format({'bold': True})
⽇期格式
date_format = workbook.add_format({'num_format': 'yyyy-mm-dd'})
⽰例演练
假设有如下数据主机 IP 信息,需要转化成 Excel ⽂件来展⽰
import xlsxwriter
host_ip = (
["server1",'192.168.1.101','2018-06-11'],
["server2",'192.168.1.102','2018-06-11'],
["server3",'192.168.1.103','2018-06-11'],
["server4",'192.168.1.104','2018-06-11']
)
⽰例代码
import xlsxwriter
host_ip = (
["server1",'192.168.1.101','2018-06-11'],
["server2",'192.168.1.102','2018-06-11'],
["server3",'192.168.1.103','2018-06-11'],
["server4",'192.168.1.104','2018-06-11']
)
# 创建⼀个新的⽂件
with xlsxwriter.Workbook('host_ip.xlsx') as workbook:
# 添加⼀个⼯作表
worksheet = workbook.add_worksheet('ip信息')
# 设置⼀个加粗的格式
bold = workbook.add_format({"bold": True})
# 设置⼀个⽇期的格式
date_format = workbook.add_format(
{'num_format': 'yyyy-mm-dd'})
# 分别设置⼀下 A 和 B 列的宽度
worksheet.set_column('A:A', 10)
worksheet.set_column('B:B', 15)
worksheet.set_column('C:C', 18)
# 先把表格的抬头写上,并设置字体加粗
worksheet.write('A1', '主机名', bold)
worksheet.write('B1', 'IP 地址', bold)
worksheet.write(0,2, '统计⽇期', bold)
# 设置数据写⼊⽂件的初始⾏和列的索引位置
row = 1
col = 0
# 迭代数据并逐⾏写⼊⽂件
for name, ip,date in (host_ip):
worksheet.write(row, col, name)
worksheet.write(row, col + 1, ip)
worksheet.write(row, col + 2, date, date_format)
row += 1
⽰例⽂档的样⼦
openpyxl 读写
安装
pip install openpyxl
基本使⽤
在内存中创建⼀个新⽂档
>>> from openpyxl import Workbook
>>> wb = Workbook()
⼀个新⽂档中必须⾄少有⼀个⼯作表
创建⼀个新⼯作表
>>> ws = wb.active
# 或者
>>> ws1 = wb.create_sheet() # 默认在结尾创建⼀个⼯作表
>>> ws2 = wb.create_sheet("date1", 0) # 指定在开头创建⼀个⼯作表
在创建表格时,假如不指定名称,则表格会⾃动命名。(Sheet1,Sheet2)
⼯作表的名称可以更改
ws.title = 'New Title'
可以在⼀个⽂件中对某⼀个⼯作表进⾏复制操作
qf_copy = wb.copy_worksheet(ws2)
qf_copy.title = 'date1_copy'
注意:
只有单元格(包括值,样式,超链接和注释)和某些⼯作表属性(包括尺⼨,格式和属性)被复制。所有其他⼯作簿/⼯作表属性不会被复制- 例如图像,图表。
查看当前⽂件中所有的⼯作表对象
print(wb.worksheets)
# 输出结果:
[<Worksheet "date1">, <Worksheet "New Title">, <Worksheet "Sheet1">, <Worksheet "date1_copy">]
当然也可以循环这些⼯作表名称
for sheet in wb:
print(sheet.title)
# 输出结果
date1
New Title
Sheet1
访问单元格
当⼯作表在内存中创建时,它不包含单元格。它们在第⼀次访问时创建。
单元格可以作为⼯作表的键直接访问
# 存在则获取值,不存在则创建
>>> c= ws['A4']
# 赋值操作,不存在则直接创建
>>> ws['A4'] = 4
这使⽤⾏和列表⽰法提供对单元格的访问权限:
>>> d = ws.cell(row=4, column=2, value=10)
警告
由于这个特性,即使没有为它们赋值,通过滚动单元格⽽不是直接访问它们也会在内存中创建它们。就像是
>>> for i in range(1,101):
for j in range(1,101):
将在内存中创建100x100的单元格,⽆需任何操作。
单元格的范围操作
同样⽀持 A1 表⽰法的切⽚操作
>>> cell_range = ws['A1':'C2']
还可以⽤以下⽅法获取
ws[1:4] # 获取到第⼀列的第⼀⾏到第四⾏
循环单元格以⾏为单位返回
for row in ws.iter_rows(min_row=1, max_col=3, max_row=2):
print(row) # 每⼀⾏
for cell in row:
print(cell) # 每⼀⾏中的每⼀列
循环单元格以列为单位返回
for col in ws.iter_cols(min_row=1, max_col=3, max_row=2):
for cell in col:
print(cell)
给单元格赋值
从以上知识点中我们得到了具体的单元格对象,此时我们就可对他们进⾏赋值的操作了# 可以这样赋值
# 还可以这样
for col in ws.iter_cols(min_row=1, max_col=3, max_row=2):
for cell in col:
cell.value = 'sharkyun'
获取单元格的值
# ⽅式⼀指定获取第 4 ⾏的第 3 列
cell_val = ws.cell(row=4,column=3).value
print(cell_val)
# ⽅式⼆循环得到每个单元格的值
for col in ws.iter_cols(min_row=1, max_col=3, max_row=2):
for cell in col:
print(cell.value)
设置单元格的字体样式
from openpyxl.styles import Font
from openpyxl.styles import colors
# 设置字体样式
ft = Font(bold=True, # 加粗
size=20, # ⼤⼩
color=colors.RED, # 颜⾊
# color='FFBB00' # 颜⾊
)
python中文文档# 使⽤字体样式到单元格
ws["A1"].font = ft
ws["B1"].font = ft
ws["C1"].font = ft
设置列宽
迭代所有的⾏和列
迭代所有的⾏
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
# 假如循环的是新创建的⼯作表,那么初始时⼯作表中是没有单元格的,
# 所以需要先在⼯作表中创建出⼀些单元格
ws['C4'] = "Hello"
# ws.rows 是⼀个⽣成器对象,可以迭代它,每次迭代会返回⼯作表中的⼀⾏
for row ws:
print(row)
# 以下是输出结果
(<Cell 'Sheet3'.A1>, <Cell 'Sheet3'.B1>, <Cell 'Sheet3'.C1>)
(<Cell 'Sheet3'.A2>, <Cell 'Sheet3'.B2>, <Cell 'Sheet3'.C2>)
(<Cell 'Sheet3'.A3>, <Cell 'Sheet3'.B3>, <Cell 'Sheet3'.C3>)
(<Cell 'Sheet3'.A4>, <Cell 'Sheet3'.B4>, <Cell 'Sheet3'.C4>)
迭代所有的列
此⽰例的数据对象,沿⽤了上⾯的⽰例
for col lumns:
print(col)
# 以下是输出结果
(<Cell 'Sheet3'.A1>, <Cell 'Sheet3'.A2>, <Cell 'Sheet3'.A3>, <Cell 'Sheet3'.A4>)
(<Cell 'Sheet3'.B1>, <Cell 'Sheet3'.B2>, <Cell 'Sheet3'.B3>, <Cell 'Sheet3'.B4>)
(<Cell 'Sheet3'.C1>, <Cell 'Sheet3'.C2>, <Cell 'Sheet3'.C3>, <Cell 'Sheet3'.C4>)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论