diff --git a/direct_xml_update.py b/direct_xml_update.py index d887c8c..bbc7bd6 100644 --- a/direct_xml_update.py +++ b/direct_xml_update.py @@ -8,6 +8,9 @@ def update_excel_with_direct_xml(excel_path, store_name): """ Update all references to {store_name} in the Excel file by directly modifying XML + This function preserves all cell values and formulas that were previously set + by the update_excel_variables function. + Args: excel_path: Path to the Excel file store_name: The store name to replace {store_name} with @@ -39,26 +42,30 @@ def update_excel_with_direct_xml(excel_path, store_name): # Only modify XML files that might contain formulas or text if item.filename.endswith('.xml'): - # Convert to string for text replacement - try: - text_content = content.decode('utf-8') - - # Check if this file contains our placeholder - if '{store_name}' in text_content: - # Count occurrences before replacement - occurrences = text_content.count('{store_name}') - total_replacements += occurrences + # Skip sheet8.xml which is the Variables sheet (based on common Excel structure) + if 'sheet8.xml' in item.filename: + print(f"Skipping Variables sheet: {item.filename}") + else: + # Convert to string for text replacement + try: + text_content = content.decode('utf-8') - # Replace all instances of {store_name} with the actual store name - modified_content = text_content.replace('{store_name}', store_name) - - # Convert back to bytes - content = modified_content.encode('utf-8') - - print(f"Replaced {occurrences} instances of '{{store_name}}' in {item.filename}") - except UnicodeDecodeError: - # Not a text file, leave as is - pass + # Check if this file contains our placeholder + if '{store_name}' in text_content: + # Count occurrences before replacement + occurrences = text_content.count('{store_name}') + total_replacements += occurrences + + # Replace all instances of {store_name} with the actual store name + modified_content = text_content.replace('{store_name}', store_name) + + # Convert back to bytes + content = modified_content.encode('utf-8') + + print(f"Replaced {occurrences} instances of '{{store_name}}' in {item.filename}") + except UnicodeDecodeError: + # Not a text file, leave as is + pass # Write the file (original or modified) to the new zip zip_out.writestr(item, content) diff --git a/server.js b/server.js index 54c51ae..10cd725 100644 --- a/server.js +++ b/server.js @@ -35,22 +35,33 @@ app.post('/calculate', async (req, res) => { await updateConfig(formData); console.log('Config file updated successfully'); - // Run Python script to create Excel file - exec('python3 create_excel.py', (error, stdout, stderr) => { - if (error) { - console.error(`Error executing Python script: ${error}`); - console.error(`stderr: ${stderr}`); - } else { - console.log(`Python script output: ${stdout}`); + // Run Python script to create Excel file synchronously + const { execSync } = require('child_process'); + try { + console.log('Executing Python script...'); + const stdout = execSync('python3 create_excel.py', { encoding: 'utf8' }); + console.log(`Python script output: ${stdout}`); + + // Send success response after Python script completes + res.json({ + success: true, + message: 'Form data saved and Excel file created successfully' + }); + console.log('Success response sent'); + } catch (execError) { + console.error(`Error executing Python script: ${execError.message}`); + if (execError.stderr) { + console.error(`stderr: ${execError.stderr}`); } - }); - - // Send success response - res.json({ - success: true, - message: 'Form data saved successfully' - }); - console.log('Success response sent'); + + // Send error response for Python script failure + res.status(500).json({ + success: false, + message: 'Error creating Excel file', + error: execError.message + }); + console.error('Error response sent for Python script failure'); + } } catch (error) { console.error('Error processing form data:', error); console.error('Error stack:', error.stack); diff --git a/template/Footprints AI for {store_name} - Retail Media Business Case Calculations.xlsx b/template/Footprints AI for {store_name} - Retail Media Business Case Calculations.xlsx index c90b9e8..0c0558d 100644 Binary files a/template/Footprints AI for {store_name} - Retail Media Business Case Calculations.xlsx and b/template/Footprints AI for {store_name} - Retail Media Business Case Calculations.xlsx differ diff --git a/update_excel.py b/update_excel.py index 7c4b5cf..9a39e42 100755 --- a/update_excel.py +++ b/update_excel.py @@ -101,10 +101,16 @@ def update_excel_variables(excel_path): # Update the cells for cell_ref, value in cell_mappings.items(): try: - sheet[cell_ref] = value + # Force the value to be set, even if the cell is protected or has data validation + cell = sheet[cell_ref] + cell.value = value print(f"Updated {cell_ref} with value: {value}") except Exception as e: print(f"Error updating cell {cell_ref}: {e}") + + # Save the workbook immediately after updating the cells + print("Saving workbook after updating variables...") + wb.save(excel_path) # Update sheet names - replace {store_name} with actual store name store_name = user_data.get('store_name', '') @@ -139,6 +145,23 @@ def update_excel_variables(excel_path): os.remove(modified_file) # Reload the workbook to get the changes wb = openpyxl.load_workbook(excel_path) + + # Re-apply the variables to make sure they weren't overwritten + print("Re-applying variables after XML modification...") + try: + sheet = wb['Variables'] + for cell_ref, value in cell_mappings.items(): + try: + cell = sheet[cell_ref] + cell.value = value + print(f"Re-applied {cell_ref} with value: {value}") + except Exception as e: + print(f"Error re-applying cell {cell_ref}: {e}") + + # Save the workbook again + wb.save(excel_path) + except Exception as e: + print(f"Error re-applying variables: {e}") # Save the workbook wb.save(excel_path)