automation / app.py
patrickligardes's picture
Update app.py
e7797e7 verified
import pandas as pd
from openpyxl import Workbook
import gradio as gr
import os
import warnings
# Suppress warnings
warnings.filterwarnings("ignore", category=UserWarning, module="openpyxl")
# Hardcoded mapping logic (from reference file)
MAPPING = [
{"Sheet Name": "Sheet1", "Input Column": "A", "PO Output Column": "Order Number", "Start Row": 2},
{"Sheet Name": "Sheet1", "Input Column": "B", "PO Output Column": "Customer Name", "Start Row": 2},
{"Sheet Name": "Sheet2", "Input Column": "C", "PO Output Column": "Product Code", "Start Row": 2},
{"Sheet Name": "Sheet2", "Input Column": "D", "PO Output Column": "Quantity", "Start Row": 2},
# Add more mappings as needed
]
# Function to extract and map data from the input workbook
def transform_data(input_path):
# Load the input workbook
input_workbook = pd.ExcelFile(input_path)
# Initialize a dictionary to store data for output
output_data = {}
# Iterate through each mapping rule
for mapping in MAPPING:
output_column = mapping["PO Output Column"]
input_sheet = mapping["Sheet Name"]
input_column = mapping["Input Column"]
start_row = mapping.get("Start Row", 2) # Default start row is 2 if not specified
# Extract data from the specified sheet and column
if input_sheet in input_workbook.sheet_names:
sheet_data = pd.read_excel(input_path, sheet_name=input_sheet, usecols=[input_column], skiprows=start_row - 1)
output_data[output_column] = sheet_data.iloc[:, 0].tolist()
else:
output_data[output_column] = [] # If sheet is missing, add empty column
# Ensure all columns have the same number of rows by filling with blanks
max_rows = max(len(col_data) for col_data in output_data.values())
for key in output_data:
while len(output_data[key]) < max_rows:
output_data[key].append("")
return pd.DataFrame(output_data)
# Main processing function
def process_files(input_workbook):
try:
# Validate input file
if not os.path.exists(input_workbook):
return None, "Input workbook file does not exist."
# Transform the data
transformed_data = transform_data(input_workbook)
# Create a new workbook for the output
output_workbook = Workbook()
output_sheet = output_workbook.active
output_sheet.title = "Generated Output"
# Write headers
headers = transformed_data.columns.tolist()
for col_idx, header in enumerate(headers, start=1):
output_sheet.cell(row=1, column=col_idx, value=header)
# Write data rows
for row_idx, row_data in enumerate(transformed_data.itertuples(index=False), start=2):
for col_idx, value in enumerate(row_data, start=1):
output_sheet.cell(row=row_idx, column=col_idx, value=value)
# Save the generated output file
output_file_path = "Generated_Output_Final.xlsx"
output_workbook.save(output_file_path)
return output_file_path, None
except Exception as e:
return None, f"An error occurred during file generation: {e}"
# Define the Gradio interface
def generate_excel(input_workbook):
file_path, error = process_files(input_workbook.name)
if error:
return None, error
return file_path, "File generated successfully."
with gr.Blocks() as app:
gr.Markdown("# Excel Sheet Generator")
gr.Markdown("Upload the input workbook to generate the final Excel file.")
with gr.Row():
input_workbook = gr.File(label="Input Workbook", file_types=[".xlsx"])
output_file = gr.File(label="Generated Excel File")
status_message = gr.Textbox(label="Status", interactive=False)
generate_button = gr.Button("Generate Excel File")
generate_button.click(generate_excel, inputs=[input_workbook], outputs=[output_file, status_message])
# Launch the app
app.launch()