使用OpenPyXL遍历工作表和单元格,并更新单元格为拼接字符串

5 投票
4 回答
41639 浏览
提问于 2025-04-18 16:51

我想用OpenPyXL来查找一个工作簿里的内容,但遇到了一些问题,希望有人能帮我。

以下是我面临的一些困难和待办事项:

  • 我有不确定数量的工作表和单元格
  • 我想在工作簿中查找,并把工作表的名字放到一个数组里
  • 我想遍历这个数组中的每个项目,查找包含特定字符串的单元格
  • 我有一些单元格里有UNC路径,指向一个旧服务器。我需要提取服务器名称后面的所有文本,更新服务器名称,然后把剩下的文本加回到新的服务器名称后面。
    例如:\file-server\blah\blah\blah.xlsx; 提取 \file-server\; 用 \file-server1\ 替换; 然后把剩下的 blah\blah\blah.xlsx 放到新的名称后面。
  • 保存xlsx文档

我刚开始学Python,所以有人能给我指个方向吗?如果能提供示例代码就更好了,因为到目前为止我只会在已知的工作簿和已知的工作表名中查找,然后打印数据。我不知道在遍历工作表和单元格时如何使用通配符。

这是我用来显示单元格内容的代码:

from openpyxl import load_workbook, worksheet

def main():
    #read workbook to get data
    wb = load_workbook(filename = 'Book1_test.xlsx', use_iterators = True)
    ws = wb.get_sheet_by_name(name = 'Sheet1')
    #ws = wb.worksheets

    #Iterate through worksheet and print cell contents
    for row in ws.iter_rows():
        for cell in row:
            print cell.value

    #Iterate through workbook & print worksheets     
    #for sheet in wb.worksheets:
    #    print sheet


if __name__ == '__main__':
    main()

-----------------------更新-------------------------

我能在单元格中查找并提取服务器名称,但我无法保存电子表格,因为我处于只读模式。当我尝试切换到optimized_write=True时,出现了错误:

AttributeError: 'ReadOnlyCell'对象没有'upper'这个属性

这是我的代码:

from openpyxl import load_workbook, worksheet, Workbook

def main():
    #read workbook to get data
    wb = load_workbook(filename = 'Book1_test.xlsx', use_iterators = True)
    ws = wb.get_sheet_by_name(name = 'Sheet1')
    #ws = wb.worksheets

    #Iterate through worksheet and print cell contents
    for row in ws.iter_rows():
        for cell in row:
            cellContent = str(cell.value)
            #Scans the first 14 characters of the string for the server name
            if cellContent[:14] == '\\\\file-server\\':
                #open workbook in write mode?
                wb = Workbook(optimized_write=True)
                ws = wb.create_sheet()

                #update cell content
                ws[cell] = '\\\\file-server1\\' + cellContent[14:]
                print cellContent[:14]

                #save workbooks
                wb.save('Book1_test.xlsx')


if __name__ == '__main__':
    main()

有人知道怎么更新单元格内容吗?

4 个回答

-1

像这样按行处理(只是个想法)是可行的:

sheet = wb.create_sheet(index = 1, title = 'Hipster') # name of the obj. sheet

for counter in range(1,11):
    sheet['A'+ str(counter)] = 'Hola'
2

你可以更新单元格里的内容。你需要给它一个新的值:

workBook = load_workbook('example.xlsx')
sheet = workBook.get_sheet_by_name('sheet')

a = sheet.cell(row=i,column=j)

a.value = 'nuevo valor'

然后保存这个更改:

workBook.save('example.xlsx')   
4

你为什么不看看文档呢?如果你直接打开工作簿而不加任何标志,你是可以编辑它的。

这个问题和OpenPyXL + 如何在Excel中搜索单元格内容,如果内容符合搜索条件就更新内容?是重复的。

2

我觉得你不能直接更新单元格的内容。你可以打开一个文件来读取,或者打开一个新文件来写入。
我想你需要创建一个新的工作簿,然后每个你读取的单元格,如果你选择不修改它,就把它写到你新的工作簿里。在你的示例代码中,你把用来读取的wb覆盖成了用来写入的wb。把它从循环中拿出来,给它起个不同的名字。

撰写回答