Fix Excel sheet name limitations and add error handling
This commit is contained in:
@@ -104,10 +104,99 @@ def update_excel_variables(excel_path):
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"Error updating cell {cell_ref}: {e}")
|
print(f"Error updating cell {cell_ref}: {e}")
|
||||||
|
|
||||||
# Save the workbook
|
# Update sheet names - replace {store_name} with actual store name
|
||||||
wb.save(excel_path)
|
store_name = user_data.get('store_name', '')
|
||||||
print(f"Excel file updated successfully: {excel_path}")
|
if store_name:
|
||||||
return True
|
# 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:
|
except Exception as e:
|
||||||
print(f"Error updating Excel file: {e}")
|
print(f"Error updating Excel file: {e}")
|
||||||
|
|||||||
Reference in New Issue
Block a user