2
0

excel_handler.py 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. import os
  2. import openpyxl
  3. from openpyxl.styles import Font, Alignment, PatternFill
  4. def create_workbook():
  5. """
  6. Create Excel workbook and set basic formatting
  7. Returns:
  8. tuple: (workbook object, worksheet object)
  9. """
  10. wb = openpyxl.Workbook()
  11. ws = wb.active
  12. ws.title = "Docs Structure Comparison"
  13. # Set headers
  14. headers = ["File Path", "File Extension", "Top Level Directory", "Source Version Exists", "Target Version Exists",
  15. "Status", "Source Version File Size(KB)", "Target Version File Size(KB)",
  16. "Markdown Syntax Consistency", "Formula"]
  17. for col_num, header in enumerate(headers, 1):
  18. cell = ws.cell(row=1, column=col_num)
  19. cell.value = header
  20. cell.font = Font(bold=True)
  21. cell.alignment = Alignment(horizontal="center")
  22. return wb, ws
  23. def get_status_fills():
  24. """
  25. Get fill colors for different statuses
  26. Returns:
  27. dict: Dictionary containing fill colors for different statuses
  28. """
  29. return {
  30. 'consistent': PatternFill(start_color='FFC6EFCE', end_color='FFC6EFCE', fill_type='solid'), # Green
  31. 'source_only': PatternFill(start_color='FFFFC7CE', end_color='FFFFC7CE', fill_type='solid'), # Red
  32. 'target_only': PatternFill(start_color='FFFFFF00', end_color='FFFFFF00', fill_type='solid') # Yellow
  33. }
  34. def write_file_info(ws, row_num, file_path, file_info, source_exists, target_exists, status_fills):
  35. """
  36. Write file information to worksheet
  37. Parameters:
  38. ws: Worksheet object
  39. row_num: Row number
  40. file_path: File path
  41. file_info: File information dictionary
  42. source_exists: Whether source version exists
  43. target_exists: Whether target version exists
  44. status_fills: Status fill color dictionary
  45. Returns:
  46. str: File status
  47. """
  48. # Determine status
  49. if source_exists and target_exists:
  50. status = "Consistent"
  51. status_fill = status_fills['consistent']
  52. elif source_exists and not target_exists:
  53. status = "Source Only"
  54. status_fill = status_fills['source_only']
  55. elif not source_exists and target_exists:
  56. status = "Target Only"
  57. status_fill = status_fills['target_only']
  58. else:
  59. status = "Does Not Exist"
  60. status_fill = None
  61. # Write basic information
  62. ws.cell(row=row_num, column=1, value=file_path)
  63. ws.cell(row=row_num, column=2, value=file_info['extension'])
  64. ws.cell(row=row_num, column=3, value=file_info['top_dir'])
  65. ws.cell(row=row_num, column=4, value="Yes" if source_exists else "No")
  66. ws.cell(row=row_num, column=5, value="Yes" if target_exists else "No")
  67. # Set status cell
  68. status_cell = ws.cell(row=row_num, column=6, value=status)
  69. if status_fill:
  70. status_cell.fill = status_fill
  71. return status
  72. def write_file_sizes(ws, row_num, source_file_info, target_file_info):
  73. """
  74. Write file size information
  75. Parameters:
  76. ws: Worksheet object
  77. row_num: Row number
  78. source_file_info: Source version file information
  79. target_file_info: Target version file information
  80. """
  81. ws.cell(row=row_num, column=7, value=source_file_info.get('size', ''))
  82. ws.cell(row=row_num, column=8, value=target_file_info.get('size', ''))
  83. def write_markdown_consistency(ws, row_num, consistency_result):
  84. """
  85. Write Markdown syntax consistency results
  86. Parameters:
  87. ws: Worksheet object
  88. row_num: Row number
  89. consistency_result: Consistency check result
  90. """
  91. ws.cell(row=row_num, column=9, value=consistency_result)
  92. def write_formula_text(ws, row_num, file_path, source_dir=None, target_dir=None):
  93. """
  94. Write formula column
  95. Parameters:
  96. ws: Worksheet object
  97. row_num: Row number
  98. file_path: File path
  99. source_dir: Source directory path (optional)
  100. target_dir: Target directory path (optional)
  101. """
  102. # Use provided directory names or default to generic names
  103. source_dir_name = source_dir if source_dir else "source"
  104. target_dir_name = target_dir if target_dir else "target"
  105. # Generate formula text based on file path
  106. formula_text = f"Compare {source_dir_name}\\{file_path} and {target_dir_name}\\{file_path} paragraph by paragraph with each heading as a paragraph, to ensure the target version is a complete and accurate translation of the source version."
  107. ws.cell(row=row_num, column=10, value=formula_text)
  108. def adjust_column_widths(ws):
  109. """
  110. Adjust worksheet column widths
  111. Parameters:
  112. ws: Worksheet object
  113. """
  114. ws.column_dimensions['A'].width = 50 # File Path
  115. ws.column_dimensions['B'].width = 10 # File Extension
  116. ws.column_dimensions['C'].width = 15 # Top Level Directory
  117. ws.column_dimensions['D'].width = 15 # Source Version Exists
  118. ws.column_dimensions['E'].width = 15 # Target Version Exists
  119. ws.column_dimensions['F'].width = 20 # Status
  120. ws.column_dimensions['G'].width = 20 # Source Version File Size
  121. ws.column_dimensions['H'].width = 20 # Target Version File Size
  122. ws.column_dimensions['I'].width = 50 # Markdown Syntax Consistency
  123. ws.column_dimensions['J'].width = 100 # Formula
  124. def save_workbook(wb, output_file):
  125. """
  126. Save workbook to file
  127. Parameters:
  128. wb: Workbook object
  129. output_file: Output file path
  130. Returns:
  131. bool: Whether save was successful
  132. """
  133. try:
  134. print(f"Preparing to save Excel file to: {output_file}")
  135. # Ensure output directory exists
  136. output_dir = os.path.dirname(output_file)
  137. if output_dir and not os.path.exists(output_dir):
  138. os.makedirs(output_dir)
  139. print(f"Created output directory: {output_dir}")
  140. # Save Excel file
  141. wb.save(output_file)
  142. print(f"\nCompleted! File structure comparison results have been saved to: {output_file}")
  143. # Verify if file was successfully created
  144. if os.path.exists(output_file):
  145. file_size = os.path.getsize(output_file)
  146. print(f"Excel file successfully created, file size: {file_size} bytes")
  147. return True
  148. else:
  149. print("Error: Excel file was not successfully created")
  150. return False
  151. except Exception as e:
  152. print(f"Error saving Excel file: {str(e)}")
  153. import traceback
  154. traceback.print_exc()
  155. return False
  156. def print_statistics(ws, row_num):
  157. """
  158. Print statistics results
  159. Parameters:
  160. ws: Worksheet object
  161. row_num: Total number of rows
  162. """
  163. print(f"Compared {row_num - 2} files in total")
  164. # Statistics results
  165. consistent_count = sum(1 for i in range(2, row_num) if ws.cell(row=i, column=6).value == "Consistent")
  166. source_only_count = sum(1 for i in range(2, row_num) if ws.cell(row=i, column=6).value == "Source Only")
  167. target_only_count = sum(1 for i in range(2, row_num) if ws.cell(row=i, column=6).value == "Target Only")
  168. print("Statistics results:")
  169. print(f"- Files existing in both versions: {consistent_count}")
  170. print(f"- Files existing only in source version: {source_only_count}")
  171. print(f"- Files existing only in target version: {target_only_count}")