ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 390|回复: 8

[求助] 在python中用openpyxl读写xlsx的求助

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-3-8 11:50 | 显示全部楼层 |阅读模式
找了一圈没找到答案,借用宝地向万能的网友求助这个问题,谢谢

我在python中用openpyxl写入xlsx的时候,是用循环一行一行去append,能不能如vba那样一次性地将一个二维数组写进单元格区域呢?
读取单元格区域时,得到的不是值,是单元格对象,之后还得用一个一个地用.value取值,同样能不能vba那样一次性地将值读进二维数组呢?
当然用pandas完全可以,但就想知道用openpyxl怎么做。
希望各位达人解惑,谢谢各位达人!

TA的精华主题

TA的得分主题

发表于 2023-3-8 15:54 | 显示全部楼层
本帖最后由 wanghan519 于 2023-3-8 16:18 编辑

还没去查手册,但感觉append并不会慢,因为xlwings是操作com对象,openpyxl则相当于直接处理文本,python逐行写文本速度还行吧

搜了一下
ws = wb.active
ws.values
就是个二维数组

感觉openpyxl就像在逐行处理文本文件,思路和xlwings或vba截然不同
另外据说pandas是用openpyxl读取xlsx文件的

TA的精华主题

TA的得分主题

发表于 2023-3-8 16:16 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-3-8 16:41 | 显示全部楼层
谢谢两位。
试了下,好象不行。得到的还是对象,要得到值还是要循环value一下。
提这个问的原因,就是想了解一下openpyxl是怎么做的,可能思维上还处于VBA中,没跟上python的趟
pandas到是很直接得到值。

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-3-8 16:43 | 显示全部楼层
确实新安的pandas如果读写xlsx,就需要安装openpyxl

TA的精华主题

TA的得分主题

发表于 2023-3-8 16:46 来自手机 | 显示全部楼层
m_n_j001 发表于 2023-3-8 16:41
谢谢两位。
试了下,好象不行。得到的还是对象,要得到值还是要循环value一下。
提这个问的原因,就是想 ...

那就试一下
list(ws.values)

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-3-9 16:48 | 显示全部楼层
wanghan519 发表于 2023-3-8 16:46
那就试一下
list(ws.values)

非常感谢,还真是这样
还有写入又怎么办呢?

TA的精华主题

TA的得分主题

发表于 2023-3-9 16:56 | 显示全部楼层
在openpyxl中,可以使用ws.append()方法一行一行地将数据写入单元格,也可以使用ws.cell()方法直接指定单元格位置写入数据。但是,如果要一次性将一个二维数组写入单元格区域,可以使用ws.iter_rows()方法来遍历行,并使用zip()函数将行数据打包成元组,然后使用ws.append()方法一次性写入所有数据,示例代码如下:

python
Copy code
from openpyxl import Workbook
data = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]
wb = Workbook()
ws = wb.active
for row in data:
    ws.append(row)
wb.save('data.xlsx')

同样地,使用ws.iter_rows()方法也可以一次性将一个数据区域读入到一个二维数组中,示例代码如下:

python
Copy code
from openpyxl import load_workbook
wb = load_workbook(filename='data.xlsx')
ws = wb.active
data = []
for row in ws.iter_rows(min_row=1, max_row=3, min_col=1, max_col=3, values_only=True):
    data.append(list(row))
print(data)

这里的min_row、max_row、min_col、max_col参数指定了要读取的单元格区域,在values_only=True的情况下,iter_rows()方法会返回单元格的值而不是单元格对象。


评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-3-10 21:04 | 显示全部楼层
mmwwdd 发表于 2023-3-9 16:56
在openpyxl中,可以使用ws.append()方法一行一行地将数据写入单元格,也可以使用ws.cell()方法直接指定单元 ...

谢谢达人!太棒了!
用惯了VBA,总还在VBA的思维中,以为openpyxl也可以如VBA一样一次性的读一块数据或写一块数据。看来得用变通的法子。
谢谢!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-9-30 02:20 , Processed in 0.045469 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表