any_script.py 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. import os
  2. from tqdm import tqdm
  3. from utils.logger_config import setup_logger
  4. from utils.tools import read_excel, create_sku_excel, add_sku_to_excel, add_suffix, read_json_file
  5. from utils.monitor import monitor_directory
  6. from services.order_fusion_services import large_order_service
  7. from concurrent.futures import ThreadPoolExecutor, as_completed
  8. from modules.export_excel import export_to_excel
  9. import pandas as pd
  10. from openpyxl import load_workbook, Workbook
  11. from openpyxl.styles import Alignment, Font, PatternFill
  12. import os
  13. import pandas as pd
  14. from openpyxl import load_workbook
  15. from openpyxl.styles import Font, Alignment, Border, Side
  16. import os
  17. import openpyxl
  18. from openpyxl.drawing.image import Image
  19. from openpyxl.styles import Font, Alignment, Border, Side, PatternFill
  20. import os
  21. def copy_cell_style(src_cell, dest_cell):
  22. """
  23. 复制单元格样式
  24. """
  25. if src_cell.has_style:
  26. dest_cell.font = Font(
  27. name=src_cell.font.name,
  28. size=src_cell.font.size,
  29. bold=src_cell.font.bold,
  30. italic=src_cell.font.italic,
  31. color=src_cell.font.color
  32. )
  33. dest_cell.alignment = Alignment(
  34. horizontal=src_cell.alignment.horizontal,
  35. vertical=src_cell.alignment.vertical,
  36. wrap_text=src_cell.alignment.wrap_text
  37. )
  38. dest_cell.border = Border(
  39. left=src_cell.border.left,
  40. right=src_cell.border.right,
  41. top=src_cell.border.top,
  42. bottom=src_cell.border.bottom
  43. )
  44. dest_cell.fill = PatternFill(
  45. start_color=src_cell.fill.start_color,
  46. end_color=src_cell.fill.end_color,
  47. fill_type=src_cell.fill.fill_type
  48. )
  49. # 复制数字格式(如果有)
  50. dest_cell.number_format = src_cell.number_format
  51. def copy_row_height(src_ws, dest_ws, row_idx):
  52. """
  53. 复制行高
  54. """
  55. dest_ws.row_dimensions[row_idx].height = src_ws.row_dimensions[row_idx].height
  56. def copy_column_width(src_ws, dest_ws, col_idx):
  57. """
  58. 复制列宽
  59. """
  60. col_letter = openpyxl.utils.get_column_letter(col_idx)
  61. dest_ws.column_dimensions[col_letter].width = src_ws.column_dimensions[col_letter].width
  62. # 修改 copy_images 函数,添加错误处理
  63. def copy_images(ws, merged_ws):
  64. for img in ws._images:
  65. try:
  66. # 方法1:直接复制整个图片对象
  67. # 注意:需要确保图片数据可用
  68. merged_ws.add_image(img, img.anchor)
  69. except Exception as e:
  70. print(f"方法1失败: {e}")
  71. try:
  72. # 方法2:通过反射获取内部图片数据
  73. if hasattr(img, 'ref') and img.ref:
  74. # 使用图片引用重新创建
  75. from openpyxl.drawing.image import Image
  76. new_img = Image(img.ref)
  77. new_img.anchor = img.anchor
  78. merged_ws.add_image(new_img)
  79. else:
  80. print("图片没有可用的引用")
  81. except Exception as e2:
  82. print(f"方法2也失败: {e2}")
  83. def merge_workbooks(file_paths, output_path):
  84. """
  85. 合并多个Excel工作簿到一个目标工作簿
  86. """
  87. # 创建一个新的工作簿
  88. merged_wb = openpyxl.Workbook()
  89. merged_ws = merged_wb.active
  90. merged_ws.title = "合并表格"
  91. # 当前行位置
  92. current_row = 1
  93. for file_path in file_paths:
  94. # 打开源工作簿
  95. wb = openpyxl.load_workbook(file_path, data_only=False)
  96. # 假设所有内容都在第一个工作表
  97. ws = wb.active
  98. # 复制每一行的内容、样式和图片
  99. for row in ws.iter_rows():
  100. for cell in row:
  101. # 在目标工作表中创建对应的单元格
  102. dest_cell = merged_ws.cell(
  103. row=current_row,
  104. column=cell.column,
  105. value=cell.value
  106. )
  107. # 复制样式
  108. copy_cell_style(cell, dest_cell)
  109. # 复制行高
  110. copy_row_height(ws, merged_ws, current_row)
  111. # 更新当前行
  112. current_row += 1
  113. # 复制列宽
  114. for col in range(1, ws.max_column + 1):
  115. copy_column_width(ws, merged_ws, col)
  116. # 复制图片
  117. copy_images(ws, merged_ws)
  118. # 如果不是最后一个文件,添加空行分隔
  119. if file_path != file_paths[-1]:
  120. current_row += 2 # 增加两行空行作为分隔
  121. # 保存合并后的工作簿
  122. merged_wb.save(output_path)
  123. print(f"表格合并完成!输出文件: {output_path}")
  124. def has_number_isdigit(text):
  125. """使用isdigit()方法检查字符串中是否包含数字"""
  126. return any(char.isdigit() for char in text)
  127. if __name__ == "__main__":
  128. print(has_number_isdigit(str(None)))
  129. # # 使用示例
  130. # file1 = "./output/10CL6E57038H.xlsx"
  131. # file2 = "./output/10CL6E1U086Y.xlsx"
  132. # output = "merged_data.xlsx"
  133. # aa = {
  134. # "a": True,
  135. # "b": True,
  136. # "c": True
  137. # }
  138. # print(all(aa.values()))
  139. # result = merge_excel_with_styles(file1, file2, output)
  140. # 执行合并
  141. # merge_workbooks([file1, file2], output)
  142. # file_dir = "./test/output/"
  143. # files = os.listdir(file_dir)
  144. # for file in tqdm(files):
  145. # if file.endswith('json'):
  146. # file_path = os.path.join(file_dir, file)
  147. # large_order_service.generate_outfit_orders(file_path)
  148. # json_content = read_json_file(file_path)
  149. # xlsx_name = os.path.basename(file).replace('json', 'xlsx')
  150. # print('xxxxxxxxxxxxxxx', xlsx_name)
  151. # export_to_excel(json_content, f"{xlsx_name}")