| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- import os
- from tqdm import tqdm
- from utils.logger_config import setup_logger
- from utils.tools import read_excel, create_sku_excel, add_sku_to_excel, add_suffix, read_json_file
- from utils.monitor import monitor_directory
- from services.order_fusion_services import large_order_service
- from concurrent.futures import ThreadPoolExecutor, as_completed
- from modules.export_excel import export_to_excel
- import pandas as pd
- from openpyxl import load_workbook, Workbook
- from openpyxl.styles import Alignment, Font, PatternFill
- import os
- import pandas as pd
- from openpyxl import load_workbook
- from openpyxl.styles import Font, Alignment, Border, Side
- import os
- import openpyxl
- from openpyxl.drawing.image import Image
- from openpyxl.styles import Font, Alignment, Border, Side, PatternFill
- import os
- def copy_cell_style(src_cell, dest_cell):
- """
- 复制单元格样式
- """
- if src_cell.has_style:
- dest_cell.font = Font(
- name=src_cell.font.name,
- size=src_cell.font.size,
- bold=src_cell.font.bold,
- italic=src_cell.font.italic,
- color=src_cell.font.color
- )
- dest_cell.alignment = Alignment(
- horizontal=src_cell.alignment.horizontal,
- vertical=src_cell.alignment.vertical,
- wrap_text=src_cell.alignment.wrap_text
- )
- dest_cell.border = Border(
- left=src_cell.border.left,
- right=src_cell.border.right,
- top=src_cell.border.top,
- bottom=src_cell.border.bottom
- )
- dest_cell.fill = PatternFill(
- start_color=src_cell.fill.start_color,
- end_color=src_cell.fill.end_color,
- fill_type=src_cell.fill.fill_type
- )
- # 复制数字格式(如果有)
- dest_cell.number_format = src_cell.number_format
- def copy_row_height(src_ws, dest_ws, row_idx):
- """
- 复制行高
- """
- dest_ws.row_dimensions[row_idx].height = src_ws.row_dimensions[row_idx].height
- def copy_column_width(src_ws, dest_ws, col_idx):
- """
- 复制列宽
- """
- col_letter = openpyxl.utils.get_column_letter(col_idx)
- dest_ws.column_dimensions[col_letter].width = src_ws.column_dimensions[col_letter].width
- # 修改 copy_images 函数,添加错误处理
- def copy_images(ws, merged_ws):
- for img in ws._images:
- try:
- # 方法1:直接复制整个图片对象
- # 注意:需要确保图片数据可用
- merged_ws.add_image(img, img.anchor)
-
- except Exception as e:
- print(f"方法1失败: {e}")
- try:
- # 方法2:通过反射获取内部图片数据
- if hasattr(img, 'ref') and img.ref:
- # 使用图片引用重新创建
- from openpyxl.drawing.image import Image
- new_img = Image(img.ref)
- new_img.anchor = img.anchor
- merged_ws.add_image(new_img)
- else:
- print("图片没有可用的引用")
- except Exception as e2:
- print(f"方法2也失败: {e2}")
- def merge_workbooks(file_paths, output_path):
- """
- 合并多个Excel工作簿到一个目标工作簿
- """
- # 创建一个新的工作簿
- merged_wb = openpyxl.Workbook()
- merged_ws = merged_wb.active
- merged_ws.title = "合并表格"
- # 当前行位置
- current_row = 1
- for file_path in file_paths:
- # 打开源工作簿
- wb = openpyxl.load_workbook(file_path, data_only=False)
- # 假设所有内容都在第一个工作表
- ws = wb.active
- # 复制每一行的内容、样式和图片
- for row in ws.iter_rows():
- for cell in row:
- # 在目标工作表中创建对应的单元格
- dest_cell = merged_ws.cell(
- row=current_row,
- column=cell.column,
- value=cell.value
- )
- # 复制样式
- copy_cell_style(cell, dest_cell)
- # 复制行高
- copy_row_height(ws, merged_ws, current_row)
- # 更新当前行
- current_row += 1
- # 复制列宽
- for col in range(1, ws.max_column + 1):
- copy_column_width(ws, merged_ws, col)
- # 复制图片
- copy_images(ws, merged_ws)
- # 如果不是最后一个文件,添加空行分隔
- if file_path != file_paths[-1]:
- current_row += 2 # 增加两行空行作为分隔
- # 保存合并后的工作簿
- merged_wb.save(output_path)
- print(f"表格合并完成!输出文件: {output_path}")
- def has_number_isdigit(text):
- """使用isdigit()方法检查字符串中是否包含数字"""
- return any(char.isdigit() for char in text)
- if __name__ == "__main__":
- print(has_number_isdigit(str(None)))
- # # 使用示例
- # file1 = "./output/10CL6E57038H.xlsx"
- # file2 = "./output/10CL6E1U086Y.xlsx"
- # output = "merged_data.xlsx"
- # aa = {
- # "a": True,
- # "b": True,
- # "c": True
- # }
- # print(all(aa.values()))
-
- # result = merge_excel_with_styles(file1, file2, output)
- # 执行合并
- # merge_workbooks([file1, file2], output)
- # file_dir = "./test/output/"
- # files = os.listdir(file_dir)
- # for file in tqdm(files):
- # if file.endswith('json'):
- # file_path = os.path.join(file_dir, file)
- # large_order_service.generate_outfit_orders(file_path)
- # json_content = read_json_file(file_path)
- # xlsx_name = os.path.basename(file).replace('json', 'xlsx')
- # print('xxxxxxxxxxxxxxx', xlsx_name)
- # export_to_excel(json_content, f"{xlsx_name}")
-
|