【问题标题】:Search a word in a text string in Excel sheet using openpyxl使用 openpyxl 在 Excel 工作表中的文本字符串中搜索单词
【发布时间】:2020-06-16 11:02:05
【问题描述】:

我正在尝试在具有如下文本字符串的单元格中搜索一个单词(能源;绿色建筑;高性能建筑)。这是我写的代码,我得到一个语法错误

for row in ws.iter_rows('D2:D11'):
    for cell in row:
        if 'Energy' in ws.cell.value :
            Print 'yes'

显然,我不想打印 yes,这是为了测试搜索功能。

此外,我想获取单元格位置,然后告诉 openpyxl 为 E 列下同一行中的单元格分配颜色。这是我的 Excel 工作表的快照。 我知道如何使用此命令分配颜色

c.fill = PatternFill(start_color='FFFFE0', end_color='FFFFE0' fill_type='solid')

我只需要帮助获取单元格位置(具有匹配文本的单元格)并将其行号分配给 E 列中的另一个单元格

更新:我在下面写了这段代码,对我来说很好用:

import xml.etree.ElementTree as ET



fhand = open ('My_Collection')    
tree =ET.parse('My_Collection.xml')
data= fhand.read()
root = tree.getroot()
tree = ET.fromstring(data)

title_list= ['Title']
year_list = ['Year']
author_list= ['Author']
label_list = ['Label']



for child in tree:
    for children in child:
        if children.find('.//title')is None :
            t='N'
        else:
            t=children.find('.//title').text
        title_list.append(t)
    print title_list
    print len(title_list)


for child in tree:
    for children in child:
        if children.find('.//year')is None :
            y='N'
        else:
            y=children.find('.//year').text
        year_list.append(y)
    print year_list
    print len(year_list)


for child in tree:
    for children in child:
        if children.find('.//author')is None :
            a='N'
        else:
            a=children.find('.//author').text
        author_list.append(a)
    print author_list
    print len(author_list)


for child in tree:
    for children in child:
        if children.find('label')is None :
            l='N'
        else:
            l=children.find('label').text
        label_list.append(l)
    print label_list
print len(author_list) 





Modified_label_list=list()        
import re
for labels in label_list:

    all_labels=labels.split(';')

    for a_l in all_labels:
        if a_l not in  Modified_label_list: 
            Modified_label_list.append(a_l)
        else:
            continue
print Modified_label_list
print len(Modified_label_list)
label_list_for_col_header= Modified_label_list[1:]
print label_list_for_col_header
print len(label_list_for_col_header)




from openpyxl import Workbook 
wb = Workbook() 
ws = wb.active 


for row in zip(title_list, year_list, author_list, label_list): 
        ws.append(row)




r = 5
for N in label_list_for_col_header:
    ws.cell(row=1, column=r).value = str(N)
    r += 1


from openpyxl.styles import PatternFill 


general_lst= list()



COLOR_INDEX = ['FF000000', 'FFFFFFFF', 'FFFF0000', 'FF00FF00', 'FF0000FF',
               'FFFFFF00', 'FFFF00FF', 'FF00FFFF', 'FF800000', 'FF008000', 'FF000080',
               'FF808000', 'FF800080', 'FF008080', 'FFC0C0C0', 'FF808080', 'FF9999FF',
               'FF993366', 'FFFFFFCC', 'FFCCFFFF', 'FF660066', 'FFFF8080', 'FF0066CC',
               'FFCCCCFF', 'FF000080', 'FFFF00FF', 'FFFFFF00', 'FF00FFFF', 'FF800080',
               'FF800000', 'FF008080', 'FF0000FF', 'FF00CCFF', 'FFCCFFFF', 'FFCCFFCC',
               'FFFFFF99', 'FF99CCFF', 'FFFF99CC', 'FFCC99FF', 'FFFFCC99', 'FF3366FF',
               'FF33CCCC', 'FF99CC00', 'FFFFCC00', 'FFFF9900', 'FFFF6600', 'FF666699',
               'FF969696', 'FF003366', 'FF339966', 'FF003300', 'FF333300', 'FF993300',
               'FF993366', 'FF333399', 'FF333333']

import random
color_lst= random.sample(COLOR_INDEX, len(label_list_for_col_header))
print color_lst

print int(label_list_for_col_header.index(label_list_for_col_header[0]))

h= len(title_list)
m= 0    
for lbls in label_list_for_col_header: 
    j= int(label_list_for_col_header.index(lbls))+5
    for row in ws.iter_rows('D2:D11'):
        for cell in  row:

            if lbls in cell.value : 
                general_lst.append(cell.row)
                for items in range(len(general_lst)):

                    ws.cell(row = general_lst[items], column = j).fill = PatternFill(start_color=str(color_lst[m]), end_color=str(color_lst[m]) , fill_type='solid')
    general_lst = []
    m +=1       


ws.column_dimensions['A'].width = 70    
ws.column_dimensions['C'].width = 23
ws.column_dimensions['B'].width = 5        
wb.save("Test61.xlsx")      

【问题讨论】:

  • this other SO 的答案可能会帮助您了解您所在的行。 (使用enumerate
  • jcfollower,感谢您的提示。我认为这应该适用于我的情况。我会在我尝试后发表评论。现在我需要找到一种方法来搜索匹配的文本。
  • 哎哟!该代码已经变得非常冗长! ;-) 当你有时间时,你应该考虑重构一下。我还强烈建议您养成使用 print() 作为 Python 3 兼容性函数的习惯。我们都讨厌它,但事实就是这样。开始训练肌肉记忆!
  • 我知道,代码非常冗长,可能效率不高。它现在可以完成工作,我需要在大约 4 小时后向我的教授展示这个文件。我要更改一些字体样式,希望我能有一两个小时睡觉。干杯!

标签: python openpyxl


【解决方案1】:

对于搜索方法,我建议您查看answer to this question。创建一个术语字典,一次搜索并尽可能频繁地使用它。但是,您可能还想知道 openpyxl 还支持条件格式,以便您可以将格式委托给 Excel。见最底部of the examples in the documentation。上周我自己第一次使用这个。 Excel API 像往常一样愚蠢,但您可以将其抽象化并在文件中添加各种格式,而无需自己搜索。

【讨论】:

  • 查理,第三次再次感谢您的帮助。我稍后会看一下这两个链接。我会在尝试您的建议后发表评论。 -拉尼娅
  • 查理,你给我的链接有点高级,所以我想出了一个对我有用的简单(虽然可能效率不高)代码。我现在就在上面发帖。
  • 我有两个简单的问题。 1) 搜索我使用的文本(对于 ws.iter_rows('D2:D11') 中的行),但是,我将解析一个更大的 xml 文件,该文件将产生 135 行。我有一个行列表( rows_lst )如何将原始代码中的 D11 更改为列表的长度?以及如何删除列?
  • iter_rows() 默认情况下会遍历所有行。要获得更多控制,您可能需要查看get_squared_range(),这将允许您传入 min_row、min_column、max_row、max_column。在我看来,这种问题在 ML 上更好。不能删除或插入行和列。存储库上有一个 sn-p 提供了一些提示,但基本上你应该尽量避免想要这样做。
  • 查理,非常感谢您的帮助。我的教授对我刚刚学习了 python 并编写了一个脚本来生成这样的 Excel 文件印象深刻。除了看一些python编程之外,我以前没有编程经验。代码成功的很大一部分归功于令人敬畏的 openpyxl 模块。
【解决方案2】:

我试图找到这个问题的解决方案,这里的答案对我不起作用(也许 openpyxl 模块已更新,因此代码已过时)。所以,我尝试了一下,想出了以下工作代码:

import openpyxl

#Path
wb = openpyxl.load_workbook(r'PathOfTheFile')

#active worksheet data
ws = wb.active    

def wordfinder(searchString):
    for i in range(1, ws.max_row + 1):
        for j in range(1, ws.max_column + 1):
            if searchString == ws.cell(i,j).value:
                print("found")
                print(ws.cell(i,j))          


wordfinder("YourString")

希望这会有所帮助。 附言如果搜索到的单词不匹配,则代码不会给出输出

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-03
    • 2016-06-04
    • 1970-01-01
    • 2011-12-27
    • 2018-06-18
    相关资源
    最近更新 更多