请教各位高人,使用 openpyxl 写入 excel 数据时,自己的方法太笨拙,有没有更简单的语句来实现?谢谢啦!

yoyofox2003 2018-05-13 10:37:37
各位高人:
大家好。小弟最近在使用 Python 读取 Excel 数据,然后写入到另一个 sheet 时,遇到个问题,想请教一下各位朋友。
详细请看这里:

环境: Python 2.7 和 openpyxl

目标: 将 sheet 1 里面的几个 日本汽车公司 筛选出来,写入到 sheet 2 里面。详见这里图片。
实际上,我从代码上已经实现了这一效果。但问题是,感觉自己在 ”写入 sheet 2” 时,使用的方法太笨拙:只会一列、 一列
的写入,这样使用了 三个for循环 才 ”按列” 写入到 sheet 2 里面。

问题: 现在就是想请教一下各位,怎样可以逐行写入,少用几个 for 循环来写入 sheet 2 ?具体请看下面的完整代码。



下面贴上完整的代码以及里面相应的注解,已调试通过,可以实现效果。

import openpyxl

my_excel = openpyxl.load_workbook("f:\\456.xlsx")
my_sheet = my_excel.worksheets[0]
my_sheet_2 = my_excel.worksheets[1]

fields = []
data = []
tmp_list = []

[color=#0000FF]# 下面这里是先从 sheet 1 获取表头的三个字段 "ID", "Company", "Country",保存到 名为 fileds 的列表里面。[/color]
for i in range(1, my_sheet.max_column + 1):
aa = str(my_sheet.cell(row = 1, column = i).value)

fields.append(aa)

print fields
print "\n"

[color=#0000FF]# 下面这里是先从 sheet 1 读取表头之外的所有数据(即汽车公司的 ID,公司名称 和 所属国家),保存到 名为 data 的列表里面。[/color]
for j in range(2, my_sheet.max_row + 1):

tmp_list = []

for k in range(1, my_sheet.max_column + 1):

bb = str(my_sheet.cell(row = j, column = k).value)

tmp_list.append(bb)

data.append(tmp_list)

print data



# 下面这里是从刚刚保存的 data 列表里面,筛选出 日本汽车公司的 数据,先保存到名为 MIG 的列表里面。
MIG = []

for iterm in data:

if ('Japan' in iterm[2]):

MIG.append(iterm)

print MIG


# 下面是,向 sheet 2 先写入表头 “ID”,“Company” 和 “Country” 这三个字段
for i in range(1,4):

my_sheet_2.cell(row = 1, column = i).value = my_sheet.cell(row = 1, column = i).value


# 下面,使用三个 for 循环,按列,将 MIG 里面的数据按列写入 sheet 2 里面。现在就是这里感觉太笨拙,使用了三个 for 循环、按列写入。能否有更简单的语句来实现?
for i in range(1,5):

my_sheet_2.cell(row = i + 1, column = 1).value = MIG[i-1][0]

for i in range(1,5):

my_sheet_2.cell(row = i + 1, column = 2).value = MIG[i-1][1]

for i in range(1,5):

my_sheet_2.cell(row = i + 1, column = 3).value = MIG[i-1][2]

my_excel.save('f:\\456.xlsx')

...全文
747 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
yoyofox2003 2018-05-14
  • 打赏
  • 举报
回复
我刚才想了一下,"陈年椰子" 和 "Chaleaoch_exist" 你们给出的这两种方法,实际已经解决了问题。感谢 "陈年椰子" 给出的 读取的同时即写入 的方法,和 "Chaleaoch_exist" 给出的 sheet.append(data) 方法。 我根据你们刚才给出的这两种方法,修改了自己的代码,修改之后的代码简洁了不少,读起来更容易理解,而且都已经调试通过。谢谢!
yoyofox2003 2018-05-14
  • 打赏
  • 举报
回复
你好,你刚才说的 sheet.append() 方法,我调试了一下。但是仍有个问题想问下:使用 sheet.append() 时,怎样指定写入到哪一行里面呢现在默认的好像就是只写入到 sheet 里面的第1行。 我刚是这样调试的: 完整代码详见这里: import openpyxl a = ['1','Toyota','Japan'] my_excel = openpyxl.load_workbook("C:\\new.xlsx") my_sheet = my_excel.worksheets[0] my_sheet.append(a) my_excel.save("C:\\new.xlsx") 打开 "new.xlsx",显示:
冯斯特罗 2018-05-14
  • 打赏
  • 举报
回复
你的例子没仔细看, 按行写入是有现成的api的.
# 添加一行
row = [1 ,2, 3, 4, 5]
sheet.append(row)
yoyofox2003 2018-05-14
  • 打赏
  • 举报
回复
谢谢你给出的这一建议方法,我现在正在调试。另外,还是想问一下,若是一次将所有数据读出,然后怎样 "按行" 将代码里面名为 MIG 的列表 写入 Sheet 2 呢?我自己的代码里面是使用 "按列" 的方法将名为 MIG 的列表写入 sheet 的,这样用了 3 个 for 循环,感觉很繁琐。
陈年椰子 2018-05-14
  • 打赏
  • 举报
回复
如果没有其他数据处理,仅仅这个过程。 建议读取数据的同时,直接写入。
db服务器连接mysql+redis高可用高性能框架干货1、使用c++语言,vs2019开发垮平台[windows和linux]连接MySql和redis框架。2、使用MySql持久化玩家数据,redis做玩家数据缓存层,redis不做数据持久化。mysql搭配redis工作效率非常高效,就好比男女搭配干活不累,没有redis,mysql也能独立很好的完成用户读写请求。有了redis,用户访问数据的效率高,短,快速的完成请求。3、讲解如何保持mysql和redis数据强一致性策略,并在代码里实现。每次启动redis,使用管道技术,从mysql批量导入活跃用户数据到redis中,并设置过期间.4、教程使用线程池技术,每个线程拥有自己独立的数据,线程绑定类。每一个实例就包含一个线程每个线程数据里包含:mysql连接器、redis连接器、内存回收池、安全的串行队列、条件变量、互斥量保证线程内的数据安全。5、工作原理:没有请求,各个工作线程处于休眠状态。有读写请求,从线程池获取一个线程,添加读写请求,把数据推送到线程工作队列中。然后工作线程获取队列的数据,进行串行工作任务安排,进行mysql数据库读写操作,以及redis读写数据操作,当完成工作任务,执行下一个工作任务,同把处理结果推送到逻辑线程,把数据给用户。6、用户读数据策略:用户获取数据首先是先从redis查找数据,redis命中,返回数据给玩家,redis命中失败,mysql中查找数据,然后写入数据到redis中,返回数据给用户。7、用户写数据策略:用户先从redis中删除数据,然后写数据到mysql中,最后再把数据写入到redis中,保持数据一致性。8、教程是一个干货教程,不是新手教程,mysql基础语法讲解的少,redis有讲解基础系列。教程讲解的是如何搭建一个支持高并发,高性能的读写数据库框架,使用mysql+redis搭配的高可用、高性能框架。该套框架在多个项目使用过,也在棋牌类项目里面使用过。

37,719

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧