鱼C论坛

 找回密码
 立即注册
查看: 2395|回复: 5

[已解决]For 循环遍历excel 单元格的方法

[复制链接]
发表于 2020-7-28 23:15:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
小弟现在需要对一定行数和列数的excel 表内各个单元格进行操作


实现目标:

1: 判断各条目下的单元格中数值是否 符合判定条件 (未完成,思路卡在不同的excel处理对象行数可能会有处于 1-100不定,然后条目1 下 >-15 为True,其余为false,条目2 字符串为True,空值为false,条目345中> 45 为True,其余为false,想利用for 循环来实现,但是苦于没用思路
2: 符合判定条件 的单元格着绿色背景,不符合的着黄色背景 (这个不太难,看了甲鱼老师的课程,PatternFill 可以实现)

如果是仅处理单行的话,还是比较好操作的,但是多行处理的话(每列下单元格的数值用统一标准)用for 循环来的话小弟就有点无力了
我问了一些人,有说用openpyxl 处理比较好的,也有说用pandas,xlrd,xlwt 的,小弟刚开始学,用的是openpyxl。。

我知道我这种有点伸手党的意思,但是网上查了一些暂时没找到这种操作的方法,所以发帖来问问大神们
最佳答案
2020-7-29 11:38:22
试试这个:import pandas as pd
from openpyxl  import load_workbook
from openpyxl.styles import PatternFill

data_test=pd.read_excel('test.xlsx',sheet_name=0)
print(data_test)

a=data_test[data_test['条目1']>15].index.tolist()  #取出条目1里面大于15的数据的索引
a=[i+2 for i in a]  #因为表格数据起始为1,索引起始为0,操作表格起始为1,所以这边需要+2,才能对应
b=[1 for _ in range(len(a))]  #生成全为1的列表,长度和a一样
d=zip(a,b)  #组成可迭代,这个就是目标行+列

wb = load_workbook('test.xlsx')
ws = wb.active
orange_fill = PatternFill(fill_type='solid', fgColor="FFBB00")
for r,c in d:
    print(r,c)
    ws.cell(row=r,column=c).fill=orange_fill
wb.save('test.xlsx')
只写了一个条目1,其他的都是类似的,改成一个函数,再重复调用就可以了

各条目下属性一致,但与其他条目不同

各条目下属性一致,但与其他条目不同
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-28 23:24:40 | 显示全部楼层
用pandas就行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-28 23:27:31 | 显示全部楼层
不同的excel处理对象行数可能会有处于 1-100不定,用openpyxl也可以获取当前行总数的吧,这个不算问题吧
• ② 获取最大行,最大列
# 获得最大列和最大行
print(sheet.max_row)
print(sheet.max_column)
③ 获取每一行,每一列
        • sheet.rows为生成器, 里面是每一行的数据,每一行又由一个tuple包裹。
        • sheet.columns类似,不过里面是每个tuple是每一列的单元格。
# 因为按行,所以返回A1, B1, C1这样的顺序
for row in sheet.rows:
    for cell in row:
        print(cell.value)
# A1, A2, A3这样的顺序
for column in sheet.columns:
    for cell in column:
        print(cell.value)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-29 08:12:05 | 显示全部楼层
疾风怪盗 发表于 2020-7-28 23:27
不同的excel处理对象行数可能会有处于 1-100不定,用openpyxl也可以获取当前行总数的吧,这个不算问题吧
& ...

感谢大神回复!!!
获取最大行最大列这个不难,但是对于获取之后的操作(比如对所有A列的值以15为标准进行判断,返回True or False,True的话单元格着绿色,false 着黄色)我就有点懵了啊,我第一时间想到的是单个单元格逐一判断,但是行数多了的情况就不现实了。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-29 11:38:22 | 显示全部楼层    本楼为最佳答案   
试试这个:import pandas as pd
from openpyxl  import load_workbook
from openpyxl.styles import PatternFill

data_test=pd.read_excel('test.xlsx',sheet_name=0)
print(data_test)

a=data_test[data_test['条目1']>15].index.tolist()  #取出条目1里面大于15的数据的索引
a=[i+2 for i in a]  #因为表格数据起始为1,索引起始为0,操作表格起始为1,所以这边需要+2,才能对应
b=[1 for _ in range(len(a))]  #生成全为1的列表,长度和a一样
d=zip(a,b)  #组成可迭代,这个就是目标行+列

wb = load_workbook('test.xlsx')
ws = wb.active
orange_fill = PatternFill(fill_type='solid', fgColor="FFBB00")
for r,c in d:
    print(r,c)
    ws.cell(row=r,column=c).fill=orange_fill
wb.save('test.xlsx')
只写了一个条目1,其他的都是类似的,改成一个函数,再重复调用就可以了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-29 21:12:11 | 显示全部楼层
疾风怪盗 发表于 2020-7-29 11:38
试试这个:import pandas as pd
from openpyxl  import load_workbook
from openpyxl.styles import Patt ...

感谢大神耐心解答 爱你么么哒!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-19 17:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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