在Python中使用openpyxl将数据写入excel工作表有没有更快的方法?

neskvpey  于 2023-01-16  发布在  Python
关注(0)|答案(1)|浏览(286)

我目前正在编写一个程序,将数据从一个电子表格更新和复制到另一个电子表格。我编写的代码工作正常,但它需要太长的时间才能实用。总共,它需要大约一个小时来执行这项任务。电子表格也非常大,我可能会添加,一个是20,000行乘30列,另一个是3,000行乘30列。代码更新较大电子表格中的特定行,然后将数据从较小电子表格复制到较大电子表格(如果该数据在较大电子表格中不存在)。在分析问题可能是什么之后,我发现将数据复制和写入较大的电子表格花费了大部分时间(~55min). openpyxl中的write_only选项不支持按我的需要写入现有文件,所以我被困在如何加快这个写作过程中。我也是Python的新手,所以任何帮助都将不胜感激,谢谢!
这是密码:

# iterate through ticket column of first sheet
for roww in range (2, sheet.max_row+1):
    sheet1_ticket_number = sheet.cell(row=roww, column = 3).value
    # iterate through ticket column of second sheet
    # Ticket number x from sheet 1 compared to all ticket numbers in sheet 2
    for row2 in range(starting_row, (sheet2.max_row+1+sheet.max_row)):
        sheet2_ticket_number = sheet.cell(row = row2, column = 3).value

        # If ticket number matches, check to see if columns match, if not, update
        if (sheet.cell(row=roww, column = 3).value == sheet2.cell(row = row2, column = 3).value):
            check = 'true'
            for i in range(1, sheet.max_column+1):
                if sheet2.cell(row=row2, column = 3+i).value != sheet.cell(row=roww, column =3+i).value and (3+i != 15) and (3+i != 38) and (3+i != 14):
                    sheet2.cell(row=row2, column = 3+i).value = sheet.cell(row=roww, column =3+i).value
                    #print('updated row# ', row2, 'Column#', 3+i, 'ticket#', sheet2.cell(row=row2, column = 3).value,  'to:', sheet2.cell(row=row2, column = 3+i).value)

                if sheet2.cell(row=row2, column = 1).value is None:
                    sheet2.cell(row=row2, column = 1).value = sheet.cell(row=roww, column =1).value
                if sheet2.cell(row=row2, column = 2).value is None:
                    sheet2.cell(row=row2, column = 1).value = sheet.cell(row=roww, column =1).value
            break

        # if ticket number is not in second file/ empty row, add new ticket row w column entries. 
        if (sheet2.cell(row = row2, column = 3).value is None) and (sheet2.cell(row = row2+1, column = 3).value is None):
            sheet2.cell(row=row2, column =3).value = sheet1_ticket_number
            #print('printed new ticket row# ', sheet2.cell(row=row2, column =3).value)
            for j in range(1, sheet.max_column+1):
                if sheet2.cell(row=row2, column = 3+j).value != sheet.cell(row=roww, column =3+j).value:
                    sheet2.cell(row=row2, column = 2).value = sheet.cell(row=roww, column =2).value
                    sheet2.cell(row=row2, column = 1).value = sheet.cell(row=roww, column =1).value
                    sheet2.cell(row=row2, column = 3+j).value = sheet.cell(row=roww, column =3+j).value
            break
tzdcorbm

tzdcorbm1#

快速Excel工作需要数组,开始

首先,不要读取任何单元格,而是将范围读入数组,这样第一个工作表和另一个工作表的数据都存储在数组中。

Excel速度快,不需要Python openpyxl(虽然不是你的问题,但这是最好的方法)

然后只在数组中循环/选择项目。Excel处理单元格的速度非常慢。当所有操作完成后,标记要粘贴的数组大小的范围,这样就可以一次粘贴所有内容,而不是逐个单元格粘贴。
简而言之(图例:第一张纸= 1,其它纸= 2):

  • 从范围1到数组1,从范围2到数组2
  • 用数组1的数据刷新数组2
  • 从数组2到范围2。
Python openpyxl(不需要,Excel更好,但您的问题要求使用它)

您已经命名了openpyxl的只写模式,按照Why does writing to a workbook of a few MB with Python's openpyxl module eat Gigabytes of RAM?,您可以保存大量RAM(和时间)与它,但正如你所说,它只写到一个新的工作簿。(虽然我认为你不应该这样问,但只要用数组加速你的代码,并在最后粘贴到另一个工作表中),为什么不直接将其他Excel工作表的数组输出(参见上面的Excel标题)转储到这样一个新工作簿中,然后手动打开它,并将数据作为值再次粘贴到其他Excel工作表中(注意:在粘贴时关闭任何单元格更新)。这是手工操作的一个步骤,但会为您节省一个小时的单元格复制和粘贴。这只是某种程度上让openpyxl起作用的一个答案。您不需要它,使用Excel就行了。

相关问题