¿Es posible crear un script de Python en automático que reste el valor de la celda con 2 hojas de trabajo en un archivo de Excel? He comprobado algunos documentos y parece que utilizo el método de pandas o openpyxl para hacerlo. Pero no puedo hacer eso. ¿Tienes alguna sugerencia para mí? Muchas gracias.

Guión:

from datetime import datetime
import pandas as pd
import openpyxl as xl;

currDateTime = datetime.now()

Sheet1 ="C:\\Users\\peter\\Downloads\\" + currDateTime.strftime('%Y%m%d') + "\\5250A" + "\\5250A.xlsx"
wb3 = xl.load_workbook(Sheet1) 
ws3 = wb3.worksheets[0] 
wb4 = xl.load_workbook(Sheet1) 
ws4 = wb4.worksheets[1] 
wb5 = xl.load_workbook(Sheet1) 
ws5 = wb5.create_sheet("Done")

wb4.subtract(wb3)

wb5.save(str(Sheet1)) 

Resultado esperado:

Figure1 Figure2 Figure3

-1
user11343272 3 mar. 2021 a las 05:43

1 respuesta

La mejor respuesta

Creo que hacerlo en Excel podría ser mucho más fácil. Podría haber una forma más inteligente de escribir este código.

[NOTA] Solo hago la sustracción celda por celda, por lo que si hay alguna discrepancia como misma fila pero diferente ID de departamento o misma columna pero diferente elemento cometerá errores. Si puede encontrarse con esta situación, tendrá un cambio en el siguiente código.

import openpyxl as xl

def get_row_values(worksheet):
    """
    return data structure:
    [
        [A1, B1, C1, ...],
        [A2, B2, C2, ...],
        ...
    ]
    """
    result = []
    for i in worksheet.rows:
        row_data = []
        for j in i:
            row_data.append(j.value)
        result.append(row_data)
    return result


if __name__ == '__main__':
    # load excel file
    wb = xl.load_workbook('test1.xlsx')
    ws1 = wb.worksheets[0]
    ws2 = wb.worksheets[1]

    # get data from the first 2 worksheets
    ws1_rows = get_row_values(ws1)
    ws2_rows = get_row_values(ws2)

    # calculate and make a new sheet
    ws_new = wb.create_sheet('Done')
    # insert header
    ws_new.append(ws1_rows[0])
    for row in range(1, len(ws1_rows)):
        # do the substract cell by cell
        row_data = []
        for column, value in enumerate(ws1_rows[row]):
            if column == 0:
                # insert first column
                row_data.append(value)
            else:
                if ws1_rows[row][0] == ws2_rows[row][0]:
                    # process only when first column match
                    row_data.append(value - ws2_rows[row][column])
        ws_new.append(row_data)
    wb.save('test2.xlsx')

Aquí está mi archivo de Excel de muestra

Primera hoja:

enter image description here

Segunda hoja:

enter image description here

Hoja generada:

enter image description here

1
Sean Hsieh 4 mar. 2021 a las 03:15