diff --git a/update_excel.py b/update_excel.py index efd69ad..ef3584f 100755 --- a/update_excel.py +++ b/update_excel.py @@ -104,10 +104,99 @@ def update_excel_variables(excel_path): except Exception as e: print(f"Error updating cell {cell_ref}: {e}") - # Save the workbook - wb.save(excel_path) - print(f"Excel file updated successfully: {excel_path}") - return True + # Update sheet names - replace {store_name} with actual store name + store_name = user_data.get('store_name', '') + if store_name: + # Make a copy of the sheet names to avoid modifying during iteration + sheet_names = wb.sheetnames.copy() + + # Keep track of used sheet names to avoid duplicates + used_sheet_names = set() + + for sheet_name in sheet_names: + if '{store_name}' in sheet_name: + # Replace the placeholder with the store name + new_sheet_name = sheet_name.replace('{store_name}', store_name) + + # Excel has a 31-character limit for sheet names + if len(new_sheet_name) > 31: + # Extract parts of the sheet name (assuming format like "2025 – Forecast {store_name}") + parts = sheet_name.split('{store_name}') + prefix = parts[0] if parts else "" + suffix = parts[1] if len(parts) > 1 else "" + + # Calculate how much space we have for the store name + available_chars = 31 - len(prefix) - len(suffix) + + # If we have space for at least part of the store name + if available_chars > 0: + # Use as much of the store name as possible + truncated_store_name = store_name[:available_chars] + new_sheet_name = prefix + truncated_store_name + suffix + else: + # If no space for store name, use a more aggressive approach + year_part = sheet_name.split('–')[0].strip() if '–' in sheet_name else "" + # Create a shorter name using just the year and abbreviated store name + abbrev_store = store_name[:15] if len(store_name) > 15 else store_name + new_sheet_name = f"{year_part} {abbrev_store}"[:31] + + # Remove any invalid characters for Excel sheet names + invalid_chars = [':', '\\', '/', '?', '*', '[', ']'] + for char in invalid_chars: + new_sheet_name = new_sheet_name.replace(char, '_') + + # Ensure the name is unique + base_name = new_sheet_name + counter = 1 + while new_sheet_name in used_sheet_names: + suffix = f" ({counter})" + new_sheet_name = f"{base_name[:31-len(suffix)]}{suffix}" + counter += 1 + + used_sheet_names.add(new_sheet_name) + + try: + # Get the sheet by its old name + sheet = wb[sheet_name] + # Set the new title + sheet.title = new_sheet_name + print(f"Renamed sheet '{sheet_name}' to '{new_sheet_name}'") + except Exception as e: + print(f"Error renaming sheet '{sheet_name}': {e}") + + # Save the workbook with error handling + try: + # First try saving with normal mode + wb.save(excel_path) + print(f"Excel file updated successfully: {excel_path}") + return True + except Exception as save_error: + print(f"Warning: Error saving Excel file: {save_error}") + + try: + # Try with a different approach - save to a new file and then replace + temp_path = excel_path + ".temp" + wb.save(temp_path) + + # Close any potential file handles + wb.close() + + # If the original file exists, try to remove it + if os.path.exists(excel_path): + try: + os.remove(excel_path) + except Exception as remove_error: + print(f"Warning: Could not remove original file: {remove_error}") + # If we can't remove it, use a new filename + excel_path = excel_path.replace(".xlsx", f"_new_{int(datetime.datetime.now().timestamp())}.xlsx") + + # Rename the temp file to the target file + os.rename(temp_path, excel_path) + print(f"Excel file saved with alternative method: {excel_path}") + return True + except Exception as alt_save_error: + print(f"Error: Failed to save Excel file with alternative method: {alt_save_error}") + return False except Exception as e: print(f"Error updating Excel file: {e}")