Python 提供了多种方式来写入电子表格文件(如.xlsx
、.csv
等格式),
可以使用openpyxl模块的 Workbook 函数来写入电子表格。
from openpyxl import Workbook
wb = Workbook()
这样就新建了一个新的工作表,这个工作薄可以保存以便其他程序使用。
若要指定只写模式,可以指定参数 write_only=True
。
在“只写”的情况下,可以访问工作簿与工作表, 但是没法访问单元格的信息。
一般打开电子表格时使用默认的可写可读模式就可以了。
在 OpenpyXL 可写可读模式下新建一个工作簿,会默认创建名为 Sheet
的表。
Excel 2016软件下新建的表默认名称为 Sheet1
。
sheetnames
属性可以查看电子表格中工作表名称的列表。旧版本中通过 get_sheet_names()
方法访问。
wb.sheetnames
['Sheet']
工作表的名称可以修改,直接赋值就可以改工作表的名称:
sheet = wb.active
sheet.title = 'Sheet1'
新建一个工作表,可以指定索引,适当安排其在工作簿中的位置。
被安排到第二个工作表,index=0
就是第一个位置。
wb.create_sheet('Data', index=0)
wb.create_sheet('Data2', index=1)
<Worksheet "Data2">
除了使用索引,也可以获取表格的名字,或使用属性 sheetnames
:
wb.sheetnames
['Data', 'Data2', 'Sheet1']
删除某个工作表,使用工作簿的方法 remove()
,或者直接使用 del
指令 del sheet
:
wb.remove(sheet)
为了避免程序运行时出错,可以在删除工作表之前判断一下工作簿中是否有这个工作表:
if sheet.title in wb.sheetnames:
wb.remove(sheet)
sheet['A1'] = 'good'
还可以使用公式。B9
处写入平均值:
sheet['B2'] = '=AVERAGE(B2:B8)'
但是如果是读取的时候需要加上 data_only=True
这样读到 B9
返回的就是数字,
如果不加这个参数,返回的将是公式本身 '=AVERAGE(B2:B8)'
。
通过对单元格的操作,可以实现新增数据,也可以实现更改数据。
sheet['B2'] = None
添加一行
row = [1 ,2, 3, 4, 5]
sheet.append(row)
现在将表格中数据打开出来查看:
for row in sheet.rows:
for cell in row:
if cell.value:
pass
else:
cell.value = ''
print( f'{cell.coordinate:3}:({cell.value:<4})', end=', ')
print()
A1 :(good), B1 :( ), C1 :( ), D1 :( ), E1 :( ), A2 :( ), B2 :( ), C2 :( ), D2 :( ), E2 :( ), A3 :(1 ), B3 :(2 ), C3 :(3 ), D3 :(4 ), E3 :(5 ),
可以看到在最下面添加了一行数据。
要添加二维列表与之类似,通过遍历的功能实现:
rows = [
['Num', 'd1', 'd2'],
[2, 40, 30],
[3, 40, 25],
]
for row in rows:
sheet.append(row)
for row in sheet.rows:
for cell in row:
if cell.value:
pass
else:
cell.value = ''
print( f'{cell.coordinate:3}:({cell.value:<4})' , end=', ')
print()
A1 :(good), B1 :( ), C1 :( ), D1 :( ), E1 :( ), A2 :( ), B2 :( ), C2 :( ), D2 :( ), E2 :( ), A3 :(1 ), B3 :(2 ), C3 :(3 ), D3 :(4 ), E3 :(5 ), A4 :(Num ), B4 :(d1 ), C4 :(d2 ), D4 :( ), E4 :( ), A5 :(2 ), B5 :(40 ), C5 :(30 ), D5 :( ), E5 :( ), A6 :(3 ), B6 :(40 ), C6 :(25 ), D6 :( ), E6 :( ),
list(zip(*rows))
[('Num', 2, 3), ('d1', 40, 40), ('d2', 30, 25)]
解释上面的list(zip(*rows))
,首先*rows
将列表打散,
相当于填入了若干个参数,zip
从某个列表中提取第1个值组合成一个tuple
,
再从每个列表中提取第2个值组合成一个tuple
,一直到最短列表的最后一个值提取完毕后结束,
更长列表的之后的值被舍弃,换句话,最后的元组个数是由原来每个参数(可迭代对象)的最短长度决定的。
比如现在随便删掉一个值,最短列表长度为2,data2
那一列(竖着看)的值全部被舍弃。
rows = [
['Number', 'data1', 'data2'],
[2, 40, 33],
[3, 40, 25],
]
wb.create_sheet('Data3', index=0)
<Worksheet "Data3">
sheet = wb['Data3']
for row in zip(*rows):
sheet.append(row)
for row in sheet.rows:
for cell in row:
if cell.value:
pass
else:
cell.value = ''
print( f'{cell.coordinate:3}:({cell.value:<6})' , end=', ')
print()
A1 :(Number), B1 :(2 ), C1 :(3 ), A2 :(data1 ), B2 :(40 ), C2 :(40 ), A3 :(data2 ), B3 :(33 ), C3 :(25 ),
wb.save('xx_example.xlsx')