pin_drop当前位置:知识文库 ❯ 图文

Python openpyxl单元格写入详解:多种写入方式与数据类型教程

单元格写入是向Excel文件中添加数据的核心操作。openpyxl支持多种写入方式:坐标写入、cell()方法写入、append()追加行写入。支持写入文本、数字、日期、公式、布尔值等多种数据类型。正确选择写入方式可以提高代码效率和可读性。


一、概述

在Python自动化办公中,将数据写入Excel是最常见的需求之一。无论是数据导出、报表生成还是考勤系统,都需要将Python中的数据写入Excel文件。openpyxl提供了灵活多样的写入方式,可以满足从单个单元格写入到批量数据录入的各种场景。

二、语法总览

openpyxl提供了四种主要的单元格写入语法:

代码示例

# 坐标写入
ws['A1'] = 'Hello'

# cell()方法写入
ws.cell(row=1, column=1, value='Hello')

# 追加行写入
ws.append([1, 2, 3])

# 公式写入
ws['A3'] = '=SUM(A1:A2)'

三、写入方式与数据类型

写入方式对比

方式 语法 适用场景
坐标写入 ws['A1'] = value 写入单个已知位置
cell()写入 ws.cell(row, col, value) 按索引循环写入
append()写入 ws.append([v1, v2, ...]) 逐行追加数据

支持的数据类型

Python类型 Excel类型 示例
str 文本 'Hello'
int 整数 100
float 小数 3.14
bool 布尔 True/False
datetime 日期时间 datetime(2024,1,1)
str(公式) 公式 '=SUM(A1:A2)'
None 空单元格 None
Decimal 数值 Decimal('3.14')

四、返回值说明

写入操作无返回值,直接修改工作表对象。写入完成后需要调用wb.save('文件名.xlsx')保存文件。

五、代码示例

示例1:基本数据写入

演示如何使用坐标写入和cell()方法写入不同类型的数据,包括文本、整数、浮点数、布尔值和日期时间。

代码示例

from openpyxl import Workbook
from datetime import datetime

wb = Workbook()
ws = wb.active

# 坐标写入
ws['A1'] = '文本数据'
ws['B1'] = 100
ws['C1'] = 3.14
ws['D1'] = True
ws['E1'] = datetime(2024, 6, 15)

# cell()方法写入
ws.cell(row=2, column=1, value='第二行')
ws.cell(row=2, column=2, value=200)
ws.cell(row=2, column=3, value=6.28)

# 查看写入结果
for col in range(1, 6):
    cell = ws.cell(row=1, column=col)
    print(f"{cell.coordinate}: {cell.value} (类型: {type(cell.value).__name__})")

wb.save('write_basic.xlsx')
print("\n基本写入文件已保存")

输出结果:

代码示例

A1: 文本数据 (类型: str)
B1: 100 (类型: int)
C1: 3.14 (类型: float)
D1: True (类型: bool)
E1: 2024-06-15 00:00:00 (类型: datetime)

基本写入文件已保存

示例2:append()追加与公式写入

演示如何使用append()逐行追加数据,以及如何写入Excel公式实现自动计算。

代码示例

from openpyxl import Workbook

wb = Workbook()
ws = wb.active

# 表头
ws.append(['产品', '单价', '数量', '金额'])

# 追加数据行
products = [
    ['苹果', 5.5, 10],
    ['香蕉', 3.2, 20],
    ['橙子', 4.8, 15],
    ['葡萄', 8.0, 8],
]
for product in products:
    ws.append(product)

# 写入公式(金额 = 单价 * 数量)
for row in range(2, 6):
    ws.cell(row=row, column=4).value = f'=B{row}*C{row}'

# 合计行
ws.append(['合计', '', '', '=SUM(D2:D5)'])

# 查看结果
for row in ws.iter_rows(values_only=True):
    print(f"  {row}")

wb.save('write_formula.xlsx')
print("\n公式写入文件已保存")

输出结果:

代码示例

  ('产品', '单价', '数量', '金额')
  ['苹果', 5.5, 10, '=B2*C2']
  ['香蕉', 3.2, 20, '=B3*C3']
  ['橙子', 4.8, 15, '=B4*C4']
  ['葡萄', 8.0, 8, '=B5*C5']
  ['合计', '', '', '=SUM(D2:D5)']

公式写入文件已保存

示例3:循环写入与日期格式

演示循环写入日期时间数据,并设置单元格的数字格式以控制显示样式。

代码示例

from openpyxl import Workbook
from datetime import datetime, timedelta

wb = Workbook()
ws = wb.active
ws.title = '考勤表'

# 写入表头
headers = ['日期', '姓名', '上班时间', '下班时间', '状态']
ws.append(headers)

# 循环写入日期数据
start_date = datetime(2024, 1, 1)
for i in range(5):
    date = start_date + timedelta(days=i)
    ws.cell(row=i+2, column=1, value=date)
    ws.cell(row=i+2, column=2, value=f'员工{i+1}')
    ws.cell(row=i+2, column=3, value=datetime(2024, 1, 1, 9, 0))
    ws.cell(row=i+2, column=4, value=datetime(2024, 1, 1, 18, 0))
    ws.cell(row=i+2, column=5, value='正常')

# 设置日期格式
from openpyxl.styles import numbers
for row in range(2, 7):
    ws.cell(row=row, column=1).number_format = 'YYYY-MM-DD'
    ws.cell(row=row, column=3).number_format = 'HH:MM'
    ws.cell(row=row, column=4).number_format = 'HH:MM'

# 查看结果
for row in ws.iter_rows(min_row=1, max_row=3, values_only=True):
    print(f"  {row}")

wb.save('write_date.xlsx')
print("\n日期写入文件已保存")

输出结果:

代码示例

  ('日期', '姓名', '上班时间', '下班时间', '状态')
  (datetime(2024, 1, 1, 0, 0), '员工1', datetime(2024, 1, 1, 9, 0), datetime(2024, 1, 1, 18, 0), '正常')
  (datetime(2024, 1, 2, 0, 0), '员工2', datetime(2024, 1, 1, 9, 0), datetime(2024, 1, 1, 18, 0), '正常')

日期写入文件已保存

六、实际应用场景

  • 数据导出:将数据库查询结果逐行写入Excel,生成数据报表供业务人员使用

  • 报表生成:使用公式自动计算汇总数据,如SUM、AVERAGE等,让Excel自动完成计算

  • 考勤系统:写入日期时间数据并设置格式,生成规范的考勤记录表

七、注意事项

注意:写入公式时使用字符串格式如'=SUM(A1:A10)',openpyxl不会计算公式结果,公式结果需要在Excel中打开后才会计算。

注意:日期时间需使用Python的datetime对象,配合number_format设置显示格式。

注意:append()从工作表末尾追加,不会覆盖已有数据,适合增量写入场景。

八、写入方式对比

方式 效率 灵活性 适用场景
坐标写入 少量精确位置写入
cell()写入 循环批量写入
append()写入 逐行追加数据

九、小结

  • 坐标写入适合少量精确位置,cell()适合循环写入,append()适合逐行追加数据

  • 支持str、int、float、bool、datetime、公式等多种数据类型,openpyxl自动识别类型

  • 公式以字符串形式写入,如'=SUM(A1:A10)',openpyxl不计算结果

  • 日期时间使用datetime对象,通过number_format设置显示格式,确保Excel中正确显示

十、练习题

练习1

创建一个工作表,使用3种写入方式分别写入文本、数字和日期数据。

练习2

创建一个销售数据表,使用append()写入5行数据,并在最后一行添加SUM公式。

练习3

创建一个考勤表,写入一周的日期数据,设置日期格式为YYYY-MM-DD。


常见问题

为什么写入公式后Excel显示的是公式而不是计算结果?

openpyxl只负责将公式字符串写入单元格,不会计算公式结果。公式结果需要在Excel中打开文件后才会自动计算。如果想要保存时计算公式,可以使用data_only参数,但这需要Excel先打开过一次。

append()可以追加字典数据吗?

可以。append()接受列表、元组、字典或生成器。当传入字典时,会按字典键的顺序追加值。但为了确保列顺序正确,推荐使用列表或有序字典。

写入大量数据时如何提高性能?

对于大量数据写入,建议使用Workbook(write_only=True)创建只写模式的工作簿,配合new_sheet()创建工作表,可以显著提升写入速度并减少内存占用。但只写模式不支持读取和修改已写入的数据。

如何写入带格式的日期?

首先使用datetime对象写入日期值,然后通过cell.number_format属性设置显示格式。常用格式有:'YYYY-MM-DD'(日期)、'HH:MM'(时间)、'YYYY-MM-DD HH:MM'(日期时间)等。


标签: openpyxl 单元格写入 append Excel公式 Python教程

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: Python openpyxl单元格读取详解:多种读取方式与实战教程 下一篇: Python openpyxl批量操作详解:高效处理大量Excel数据教程

poll相关推荐