鱼C论坛

 找回密码
 立即注册
查看: 451|回复: 5

复制excel 图片复制失败

[复制链接]
发表于 2024-9-14 09:03:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
复制带有图片的excel失败,图片没复制过去,图片已经做成jpg格式了,许愿下,万一有大佬能帮帮呢
  1. import pandas as pd
  2. import tkinter as tk
  3. from tkinter import filedialog
  4. from openpyxl import load_workbook
  5. from openpyxl.drawing.image import Image
  6. import os
  7. import shutil


  8. def select_input_file():
  9.     file_path = filedialog.askopenfilename(filetypes=[("Excel files", "*.xlsx;*.xls")], title="请选择输入数据excel,.xlsx格式")
  10.     return file_path


  11. def select_template_file():
  12.     file_path = filedialog.askopenfilename(filetypes=[("Excel files", "*.xlsx;*.xls")], title="请选择工艺卡模版的excel,.xlsx格式")
  13.     return file_path


  14. def select_target_folder():
  15.     folder_path = filedialog.askdirectory(title="请选择输出文件夹")
  16.     return folder_path


  17. def process01_df(df_in):
  18.     for index, row in df_in.iterrows():
  19.         if row['焊接类型'] == '对焊' or row['焊接类型'] == '承插焊':
  20.             diam_thickness = f"Φ{row['主管外径']}*{row['壁厚']}"
  21.             df_in.at[index, '外径壁厚'] = diam_thickness
  22.         elif row['焊接类型'] == '开口焊':
  23.             diam_thickness = f"Φ{row['支管外径']}*{row['支管壁厚']}-Φ{row['主管外径']}*{row['壁厚']}"
  24.             df_in.at[index, '外径壁厚'] = diam_thickness

  25.         # 提取前段材质和前段材质编号
  26.         if "A105" in row["焊缝前材质"]:
  27.             df_in.at[index, '前材质'] = "A105"
  28.             df_in.at[index, '前材质编码'] = 20
  29.         elif "20-G" in row["焊缝前材质"]:
  30.             df_in.at[index, '前材质'] = "20"
  31.             df_in.at[index, '前材质编码'] = 21
  32.         elif "20G-" in row["焊缝前材质"]:
  33.             df_in.at[index, '前材质'] = "20G"
  34.             df_in.at[index, '前材质编码'] = 22
  35.         elif "20Ⅱ" in row["焊缝前材质"]:
  36.             df_in.at[index, '前材质'] = "20Ⅱ"
  37.             df_in.at[index, '前材质编码'] = 23
  38.         elif "20Ⅲ" in row["焊缝前材质"]:
  39.             df_in.at[index, '前材质'] = "20Ⅲ"
  40.             df_in.at[index, '前材质编码'] = 24
  41.         elif "12Cr1MoVG" in row["焊缝前材质"]:
  42.             df_in.at[index, '前材质'] = "12Cr1MoVG"
  43.             df_in.at[index, '前材质编码'] = 2
  44.         elif "12Cr1MoVⅡ" in row["焊缝前材质"]:
  45.             df_in.at[index, '前材质'] = "12Cr1MoVⅡ"
  46.             df_in.at[index, '前材质编码'] = 3
  47.         elif "12Cr1MoVⅢ" in row["焊缝前材质"]:
  48.             df_in.at[index, '前材质'] = "12Cr1MoVⅢ"
  49.             df_in.at[index, '前材质编码'] = 4
  50.         elif "15CrMoG" in row["焊缝前材质"]:
  51.             df_in.at[index, '前材质'] = "15CrMoG"
  52.             df_in.at[index, '前材质编码'] = 5
  53.         elif "15CrMoⅡ" in row["焊缝前材质"]:
  54.             df_in.at[index, '前材质'] = "15CrMoⅡ"
  55.             df_in.at[index, '前材质编码'] = 6
  56.         elif "15CrMoⅢ" in row["焊缝前材质"]:
  57.             df_in.at[index, '前材质'] = "15CrMoⅢ"
  58.             df_in.at[index, '前材质编码'] = 7
  59.         elif "S30408-" in row["焊缝前材质"]:
  60.             df_in.at[index, '前材质'] = "S30408"
  61.             df_in.at[index, '前材质编码'] = 11
  62.         elif "S30408Ⅱ" in row["焊缝前材质"]:
  63.             df_in.at[index, '前材质'] = "S30408Ⅱ"
  64.             df_in.at[index, '前材质编码'] = 12
  65.         elif "S30408Ⅲ" in row["焊缝前材质"]:
  66.             df_in.at[index, '前材质'] = "S30408Ⅲ"
  67.             df_in.at[index, '前材质编码'] = 13
  68.         elif "S31603-" in row["焊缝前材质"]:
  69.             df_in.at[index, '前材质'] = "S31603"
  70.             df_in.at[index, '前材质编码'] = 14
  71.         elif "S31603Ⅱ" in row["焊缝前材质"]:
  72.             df_in.at[index, '前材质'] = "S31603Ⅱ"
  73.             df_in.at[index, '前材质编码'] = 15
  74.         elif "S31603Ⅲ" in row["焊缝前材质"]:
  75.             df_in.at[index, '前材质'] = "S31603Ⅲ"
  76.             df_in.at[index, '前材质编码'] = 16
  77.         else:
  78.             df_in.at[index, '前材质编码'] = 0

  79.     # 提取后段材质和前段材质编号
  80.         if "A105" in row["焊缝后材质"]:
  81.             df_in.at[index, '后材质'] = "A105"
  82.             df_in.at[index, '后材质编码'] = 20
  83.         elif "20-G" in row["焊缝后材质"]:
  84.             df_in.at[index, '后材质'] = "20"
  85.             df_in.at[index, '后材质编码'] = 21
  86.         elif "20G-" in row["焊缝后材质"]:
  87.             df_in.at[index, '后材质'] = "20G"
  88.             df_in.at[index, '后材质编码'] = 22
  89.         elif "20Ⅱ" in row["焊缝后材质"]:
  90.             df_in.at[index, '后材质'] = "20Ⅱ"
  91.             df_in.at[index, '后材质编码'] = 23
  92.         elif "20Ⅲ" in row["焊缝后材质"]:
  93.             df_in.at[index, '后材质'] = "20Ⅲ"
  94.             df_in.at[index, '后材质编码'] = 24
  95.         elif "12Cr1MoVG-" in row["焊缝后材质"]:
  96.             df_in.at[index, '后材质'] = "12Cr1MoVG"
  97.             df_in.at[index, '后材质编码'] = 2
  98.         elif "12Cr1MoVⅡ" in row["焊缝后材质"]:
  99.             df_in.at[index, '后材质'] = "12Cr1MoVⅡ"
  100.             df_in.at[index, '后材质编码'] = 3
  101.         elif "12Cr1MoVⅢ" in row["焊缝后材质"]:
  102.             df_in.at[index, '后材质'] = "12Cr1MoVⅢ"
  103.             df_in.at[index, '后材质编码'] = 4
  104.         elif "15CrMoG-" in row["焊缝后材质"]:
  105.             df_in.at[index, '后材质'] = "15CrMoG"
  106.             df_in.at[index, '后材质编码'] = 5
  107.         elif "15CrMoⅡ" in row["焊缝后材质"]:
  108.             df_in.at[index, '后材质'] = "15CrMoⅡ"
  109.             df_in.at[index, '后材质编码'] = 6
  110.         elif "15CrMoⅢ" in row["焊缝后材质"]:
  111.             df_in.at[index, '后材质'] = "15CrMoⅢ"
  112.             df_in.at[index, '后材质编码'] = 7
  113.         elif "S30408-" in row["焊缝后材质"]:
  114.             df_in.at[index, '后材质'] = "S30408"
  115.             df_in.at[index, '后材质编码'] = 11
  116.         elif "S30408Ⅱ" in row["焊缝后材质"]:
  117.             df_in.at[index, '后材质'] = "S30408Ⅱ"
  118.             df_in.at[index, '后材质编码'] = 12
  119.         elif "S30408Ⅲ" in row["焊缝后材质"]:
  120.             df_in.at[index, '后材质'] = "S30408Ⅲ"
  121.             df_in.at[index, '后材质编码'] = 13
  122.         elif "S31603-" in row["焊缝后材质"]:
  123.             df_in.at[index, '后材质'] = "S31603"
  124.             df_in.at[index, '后材质编码'] = 14
  125.         elif "S31603Ⅱ" in row["焊缝后材质"]:
  126.             df_in.at[index, '后材质'] = "S31603Ⅱ"
  127.             df_in.at[index, '后材质编码'] = 15
  128.         elif "S31603Ⅲ" in row["焊缝后材质"]:
  129.             df_in.at[index, '后材质'] = "S31603Ⅲ"
  130.             df_in.at[index, '后材质编码'] = 16
  131.         else:
  132.             df_in.at[index, '后材质编码'] = 0
  133.         # 汇合成为材质列
  134.         df_in['材质'] = ''
  135.         df_in.loc[(df_in['前材质编码'] == 0) & (df_in['后材质编码'] == 0), '材质'] = ''
  136.         df_in.loc[(df_in['前材质编码'] == 0) & (df_in['后材质编码'] != 0), '材质'] = df_in['后材质']
  137.         df_in.loc[(df_in['前材质编码'] != 0) & (df_in['后材质编码'] == 0), '材质'] = df_in['前材质']
  138.         df_in.loc[(df_in['前材质编码'] != 0) & (df_in['后材质编码'] != 0) & (df_in['前材质编码'] == df_in['后材质编码']),\
  139.         '材质'] = df_in['前材质'].astype(str)
  140.         df_in.loc[(df_in['前材质编码'] != 0) & (df_in['后材质编码'] != 0) & (df_in['前材质编码'] < df_in['后材质编码']),\
  141.         '材质'] = df_in['前材质'].astype(str) + "&" + df_in['后材质'].astype(str)
  142.         df_in.loc[(df_in['前材质编码'] != 0) & (df_in['后材质编码'] != 0) & (df_in['前材质编码'] > df_in['后材质编码']),\
  143.         '材质'] = df_in['后材质'].astype(str) + "&" + df_in['前材质'].astype(str)

  144.         if row['管线寸口'] == '1/2"':
  145.             df_in.at[index, '寸口'] = 1
  146.         elif row['管线寸口'] == '3/4"':
  147.             df_in.at[index, '寸口'] = 1
  148.         elif row['管线寸口'] == '1"':
  149.             df_in.at[index, '寸口'] = 1
  150.         elif row['管线寸口'] == '11/4"':
  151.             df_in.at[index, '寸口'] = 1.25
  152.         elif row['管线寸口'] == '11/2"':
  153.             df_in.at[index, '寸口'] = 1.5
  154.         elif row['管线寸口'] == '2"':
  155.             df_in.at[index, '寸口'] = 2
  156.         elif row['管线寸口'] == '21/2"':
  157.             df_in.at[index, '寸口'] = 2.5
  158.         elif row['管线寸口'] == '3"':
  159.             df_in.at[index, '寸口'] = 3
  160.         elif row['管线寸口'] == '4"':
  161.             df_in.at[index, '寸口'] = 4
  162.         elif row['管线寸口'] == '5"':
  163.             df_in.at[index, '寸口'] = 5
  164.         elif row['管线寸口'] == '6"':
  165.             df_in.at[index, '寸口'] = 6
  166.         elif row['管线寸口'] == '8"':
  167.             df_in.at[index, '寸口'] = 8
  168.         elif row['管线寸口'] == '10"':
  169.             df_in.at[index, '寸口'] = 10
  170.         elif row['管线寸口'] == '12"':
  171.             df_in.at[index, '寸口'] = 12
  172.         elif row['管线寸口'] == '14"':
  173.             df_in.at[index, '寸口'] = 14
  174.         elif row['管线寸口'] == '16"':
  175.             df_in.at[index, '寸口'] = 16
  176.         elif row['管线寸口'] == '20"':
  177.             df_in.at[index, '寸口'] = 20
  178.         elif row['管线寸口'] == '24"':
  179.             df_in.at[index, '寸口'] = 24

  180.         df_in['道数'] = 1
  181.     return df_in



  182. # 定义填充“工艺卡编号”的函数
  183. def fill_process_card(row):
  184.     if row['焊接类型'] == '对焊' and '12Cr' in row['材质']:
  185.         if row['壁厚'] > 13:
  186.             return 'HKB12-06'
  187.         elif row['壁厚'] > 10:
  188.             return 'HKB12-05'
  189.         elif row['壁厚'] > 8:
  190.             return 'HKB12-04'
  191.         elif row['壁厚'] > 5.5:
  192.             return 'HKB12-03'
  193.         elif row['壁厚'] > 3:
  194.             return 'HKB12-02'
  195.         elif row['壁厚'] > 0:
  196.             return 'HKB12-01'

  197.     elif row['焊接类型'] == '承插焊' and '12Cr' in row['材质']:
  198.         if row['壁厚'] > 5.5:
  199.             return 'HKC12-03'
  200.         elif row['壁厚'] > 3:
  201.             return 'HKC12-02'
  202.         elif row['壁厚'] > 0:
  203.             return 'HKC12-01'

  204.     elif row['焊接类型'] == '开口焊' and '12Cr' in row['材质']:
  205.         if row['支管壁厚'] > 5:
  206.             return 'HKD12-03'
  207.         elif row['支管壁厚'] > 3:
  208.             return 'HKD12-02'
  209.         elif row['支管壁厚'] > 0:
  210.             return 'HKD12-01'

  211.     elif row['焊接类型'] == '对焊' and '15Cr' in row['材质']:
  212.         if row['壁厚'] > 13:
  213.             return 'HKB15-06'
  214.         elif row['壁厚'] > 10:
  215.             return 'HKB15-05'
  216.         elif row['壁厚'] > 8:
  217.             return 'HKB15-04'
  218.         elif row['壁厚'] > 5.5:
  219.             return 'HKB15-03'
  220.         elif row['壁厚'] > 3:
  221.             return 'HKB15-02'
  222.         elif row['壁厚'] > 0:
  223.             return 'HKB15-01'

  224.     elif row['焊接类型'] == '承插焊' and '15Cr' in row['材质']:
  225.         if row['壁厚'] > 5.5:
  226.             return 'HKC15-03'
  227.         elif row['壁厚'] > 3:
  228.             return 'HKC15-02'
  229.         elif row['壁厚'] > 0:
  230.             return 'HKC15-01'

  231.     elif row['焊接类型'] == '开口焊' and '15Cr' in row['材质']:
  232.         if row['支管壁厚'] > 5:
  233.             return 'HKD15-03'
  234.         elif row['支管壁厚'] > 3:
  235.             return 'HKD15-02'
  236.         elif row['支管壁厚'] > 0:
  237.             return 'HKD15-01'

  238.     elif row['焊接类型'] == '对焊' and ('304' in row['材质'] or '316' in row['材质']):
  239.         if row['壁厚'] > 7:
  240.             return 'HKB304-04'
  241.         elif row['壁厚'] > 5:
  242.             return 'HKB304-03'
  243.         elif row['壁厚'] > 3:
  244.             return 'HKB304-02'
  245.         elif row['壁厚'] > 0:
  246.             return 'HKB304-01'

  247.     elif row['焊接类型'] == '承插焊' and ('304' in row['材质'] or '316' in row['材质']):
  248.         if row['壁厚'] > 5.5:
  249.             return 'HKC304-03'
  250.         elif row['壁厚'] > 3:
  251.             return 'HKC304-02'
  252.         elif row['壁厚'] > 0:
  253.             return 'HKC304-01'

  254.     elif row['焊接类型'] == '开口焊' and ('304' in row['材质'] or '316' in row['材质']):
  255.         if row['支管壁厚'] > 6.5:
  256.             return 'HKD304-04'
  257.         elif row['支管壁厚'] > 5:
  258.             return 'HKD304-03'
  259.         elif row['支管壁厚'] > 3:
  260.             return 'HKD304-02'
  261.         elif row['支管壁厚'] > 0:
  262.             return 'HKD304-01'

  263.     elif row['焊接类型'] == '对焊' and '20' in row['材质']:
  264.         if row['壁厚'] > 13:
  265.             return 'HKB20-06'
  266.         elif row['壁厚'] > 10:
  267.             return 'HKB20-05'
  268.         elif row['壁厚'] > 8:
  269.             return 'HKB20-04'
  270.         elif row['壁厚'] > 5.5:
  271.             return 'HKB20-03'
  272.         elif row['壁厚'] > 3:
  273.             return 'HKB20-02'
  274.         elif row['壁厚'] > 0:
  275.             return 'HKB20-01'

  276.     elif row['焊接类型'] == '承插焊' and '20' in row['材质']:
  277.         if row['壁厚'] > 5.5:
  278.             return 'HKC20-03'
  279.         elif row['壁厚'] > 3:
  280.             return 'HKC20-02'
  281.         elif row['壁厚'] > 0:
  282.             return 'HKC20-01'

  283.     elif row['焊接类型'] == '开口焊' and '20' in row['材质']:
  284.         if row['壁厚'] > 8 and row['支管壁厚'] > 8:
  285.             return 'HKD20-09'
  286.         elif row['壁厚'] > 8 and row['支管壁厚'] > 6.5:
  287.             return 'HKD20-08'
  288.         elif row['壁厚'] > 8 and row['支管壁厚'] > 5:
  289.             return 'HKD20-07'
  290.         elif row['壁厚'] > 8 and row['支管壁厚'] > 3:
  291.             return 'HKD20-06'
  292.         elif row['壁厚'] > 8 and row['支管壁厚'] > 0:
  293.             return 'HKD20-05'
  294.         elif row['壁厚'] > 0 and row['支管壁厚'] > 6.5:
  295.             return 'HKD20-04'
  296.         elif row['壁厚'] > 0 and row['支管壁厚'] > 5:
  297.             return 'HKD20-03'
  298.         elif row['壁厚'] > 0 and row['支管壁厚'] > 3:
  299.             return 'HKD20-02'
  300.         elif row['壁厚'] > 0 and row['支管壁厚'] > 0:
  301.             return 'HKD20-01'
  302.     return ""


  303. # 做一个将焊缝编号进行归总序列化的函数,用来函数内调用
  304. def format_numbers(numbers):
  305.     if not numbers:
  306.         return ""

  307.     # 对数字列表进行排序
  308.     sorted_numbers = sorted(set(numbers))

  309.     # 初始化结果字符串和当前范围的起始值
  310.     result = []
  311.     start = sorted_numbers[0]
  312.     end = start

  313.     # 遍历排序后的数字列表,合并连续的数字范围
  314.     for num in sorted_numbers[1:]:
  315.         if num == end + 1:
  316.             end = num
  317.         else:
  318.             if start == end:
  319.                 result.append(str(start))
  320.             else:
  321.                 result.append(f"{start}~{end}")
  322.             start = end = num

  323.     # 处理最后一个范围
  324.     if start == end:
  325.         result.append(str(start))
  326.     else:
  327.         result.append(f"{start}~{end}")

  328.     # 将结果列表转换为字符串,用逗号分隔
  329.     return ",".join(result)



  330. def copy_template_to_new_file(pipeline_number_copy, template_path_copy, output_folder_copy):
  331.           # 构建新的文件名
  332.           new_file = f"{pipeline_number_copy}.xlsx"
  333.           # 构建新文件的完整路径
  334.           #new_file_path = os.path.join(output_folder_copy, new_file)
  335.           new_file_path = f"{output_folder_copy}/{new_file}"  #实测这样写格式没有问题的,可以读到实际位置。
  336.           # 复制模板文件到新文件路径
  337.           shutil.copy(template_path_copy, new_file_path)
  338.           # 加载源文件和新文件
  339.           workbook_source = load_workbook(template_path_copy)
  340.           workbook_new = load_workbook(new_file_path)
  341.           # 复制每个 sheet 的图片
  342.           for sheet_name in workbook_source.sheetnames:
  343.                           source_sheet = workbook_source[sheet_name]
  344.                           new_sheet = workbook_new[sheet_name]

  345.                           # 提取图片并添加到新 sheet 中
  346.                           for img in source_sheet._images:
  347.                                     new_img = Image(img.ref)
  348.                                     new_img.anchor = img.anchor  # 保持原图的位置
  349.                                     new_sheet.add_image(new_img) # 添加到新表中

  350.           # 筛选出管线号对应的行
  351.           filtered_rows = df_merge[df_merge["管线号"] == pipeline_number_copy]
  352.           processcards = filtered_rows['工艺卡编号'].unique()

  353.           # 获取所有sheet名
  354.           sheet_names = workbook_new.sheetnames

  355.           # 遍历所有sheet名,检查并删除不需要的sheet
  356.           for sheet_name in sheet_names:
  357.                          if 'H' in sheet_name and sheet_name not in processcards:
  358.                                     std = workbook_new[sheet_name]  # 获取具体的sheet
  359.                                     workbook_new.remove(std) # 删除sheet
  360.           # 保存修改后的Excel文件
  361.           workbook_new.save(new_file_path)
  362.           """
  363.           这里加代码
  364.           """

  365.           #尝试取得外径壁厚的值
  366.           # 筛选出管线号对应的行
  367.           filtered_rows_OD1 = df_merge[df_merge["管线号"] == pipeline_number_copy]
  368.           processcards = filtered_rows['工艺卡编号'].unique()
  369.           workbook_new = load_workbook(new_file_path)

  370.           #sheet3.cell((7 + i), 1).value = unique_result_list[i][0]
  371.           workbook_new["封面"].cell(17,9) .value = pipeline_number_copy.removeprefix(r"/")


  372.           count_sheet = 1
  373.           for sheet3 in workbook_new:
  374.               #sheet_name.cell(8,1,"好的")
  375.               #sheet_name.cell(9,1,"不好")
  376.               if 'H' in sheet3.title:
  377.                 cover = workbook_new["封面"].cell(5, 13).value
  378.                 sheet3.cell(2, 14).value = f"{cover}-{count_sheet}"

  379.                 #sheet3['C8'] = "11"
  380.                 #sheet3['C9'] = "12"
  381.                 filtered_rows_OD = df_merge[(df_merge['管线号'] == pipeline_number_copy) & (df_merge['工艺卡编号'] == sheet3.title)]

  382.                 # 提取“外径壁厚”和“焊接材质”列的值并存储到列表中
  383.                 result_list = []
  384.                 bianhao = []
  385.                 for index, row in filtered_rows_OD.iterrows():
  386.                     result_list.append((row['材质'], row['外径壁厚']))
  387.                     bianhao.append(row['焊缝编号'])
  388.                 unique_result_list = list(set(result_list))

  389.                 txt_bianhao = format_numbers(bianhao)
  390.                 txt_bianhao = txt_bianhao.replace(".0", "")
  391.                 sheet3.cell(4, 13).value = f"{txt_bianhao}({len(bianhao)}处)"


  392.                 #这里为了测试,先避开不同壁厚的
  393.                 for i in range(0, min(len(unique_result_list ),6)):
  394.                     sheet3.cell((7 + i), 1).value = unique_result_list[i][0]
  395.                     sheet3.cell((7 + i), 3).value = unique_result_list[i][1]

  396.                 # 这里开始填写目录
  397.                 workbook_new["焊接工艺目录"].cell((7 + count_sheet), 1).value = sheet3.cell(4, 13).value
  398.                 workbook_new["焊接工艺目录"].cell((7 + count_sheet), 2).value = sheet3.cell(4, 4).value
  399.                 workbook_new["焊接工艺目录"].cell((7 + count_sheet), 3).value = sheet3.cell(2, 14).value

  400.                 # 提取第1列的第8行到11行的数据
  401.                 data_weld = []
  402.                 for row in range(24,27):
  403.                     cell_value = sheet3.cell(row=row, column=1).value
  404.                     if cell_value is not None:
  405.                         data_weld.append(cell_value)

  406.                 # 去重并去除空值
  407.                 unique_data = list(set(filter(None, data_weld)))

  408.                 # 将数据转换为字符串并用+号连接
  409.                 result = '+'.join(map(str, unique_data))
  410.                 workbook_new["焊接工艺目录"].cell((7 + count_sheet), 4).value = result
  411.                 workbook_new["焊接工艺目录"].cell((7 + count_sheet), 5).value = sheet3.cell(4, 8).value
  412.                 workbook_new["焊接工艺目录"].cell((7 + count_sheet), 6).value = sheet3.cell(21, 8).value


  413.                 count_sheet += 1

  414.           workbook_new.save(new_file_path)
  415.           print(f"已创建并保存文件:{new_file_path}")

  416. """
  417. 新增图形界面
  418. """
  419. root = tk.Tk()
  420. root.withdraw()  # 隐藏主窗口

  421. input_file = select_input_file()
  422. if not input_file:
  423.     print("未选择输入文件")
  424.     exit()


  425. template_file = select_template_file()
  426. if not template_file:
  427.     print("未选择模板文件")
  428.     exit()



  429. target_folder = select_target_folder()
  430. if not target_folder:
  431.     print("未选择输出文件夹")
  432.     exit()
  433. # 读取原始数据文件
  434. df_merge = pd.read_excel(input_file)

  435. # 将列“焊缝类型”数值为“对焊”,“承插焊”,“开口焊”的行里列“主管外径”,“壁厚”类型改为浮点型
  436. selected_weld_types = ['对焊', '承插焊', '开口焊']
  437. df_merge.loc[df_merge['焊接类型'].isin(selected_weld_types), ['主管外径', '壁厚']] = df_merge.loc[df_merge['焊接类型'].isin(selected_weld_types), ['主管外径', '壁厚']].astype(float)

  438. # 将列“焊缝类型”数值为"开口焊"的行里列“支管外径”,“支管壁厚”类型改为浮点型
  439. df_merge.loc[df_merge['焊接类型'] == '开口焊', ['支管外径', '支管壁厚']] = df_merge.loc[df_merge['焊接类型'] == '开口焊', ['支管外径', '支管壁厚']].astype(float)


  440. df_merge = process01_df(df_merge)

  441. df_merge['工艺卡编号'] = df_merge.apply(fill_process_card, axis=1)

  442. df_merge = df_merge[df_merge["工艺卡编号"] != ""]

  443. # 对相同的“管线号”,“焊缝类型”,“焊缝材质”进行分组,并对“焊缝数量”求和
  444. #df_merge = df_merge.groupby(["管线号", "焊接类型", "工艺卡编号", "焊接材质", "外径壁厚", "管线寸口"], as_index=False).agg({"焊接寸口": "sum"})
  445. # df_merge = df_merge.groupby(["管线号", "焊接类型", "工艺卡编号", "材质", "外径壁厚", "管线寸口"], as_index=False).agg({"道数": "sum","焊接寸口": "sum"})

  446. # 根据“管线号”,“焊缝类型”,“焊缝材质”进行排序
  447. # df_merge.sort_values(by=["管线号", "材质", "管线寸口", "外径壁厚", "焊接类型"], inplace=True)




  448. # 获取所有不同的管线号
  449. pipeline_ids = df_merge["管线号"].unique()   # 请确保替换为实际的列名
  450. output_file = f"{target_folder}/new.xlsx"
  451. df_merge.to_excel(output_file, index=False)


  452. # 确保目标文件夹存在
  453. if not os.path.exists(target_folder):
  454.        os.makedirs(target_folder)

  455. # 遍历所有管线号,复制模板文件并重命名
  456. for pipeline_number in pipeline_ids:
  457.     copy_template_to_new_file(pipeline_number, template_file, target_folder)


复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-9-14 09:06:55 | 显示全部楼层
图片没啥好办法  虽然图片能提取出来,但是和你的单元格的位置  都是无法匹配的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-9-14 09:07:56 | 显示全部楼层
之前成功过能提取的,后来隔了一个月,继续开始做这个事。程序继续往下做,又失败了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-9-14 09:12:04 | 显示全部楼层
或者确实没办法了,就只能换种思路来,我指定一个图片文件夹,图片文件名为对应的sheet,对应sheet找到了,就贴过去图,这样估计反而行,但是不管怎么样,其实还是在许愿能直接复制阶段就能完成,别搞太难看
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-9-14 09:12:36 | 显示全部楼层
我来写个测试程序测试下这个思路,应该是可以
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-9-14 09:12:53 | 显示全部楼层
你好,鱼油!从你的代码和描述来看,图片未能复制到Excel文件。在使用`openpyxl`库处理Excel文件,并插入图片时,可以按照以下步骤:

1. **确保图片路径和格式正确**:
   确保图片路径和格式都正确,确保图片文件确实存在并能被正常读取。

2. **用`openpyxl`插入图片**:
   使用`openpyxl.drawing.image.Image`来插入图片,并将其添加到指定的单元格中。以下是完整的修改代码:

  1. import pandas as pd
  2. import tkinter as tk
  3. from tkinter import filedialog
  4. from openpyxl import load_workbook
  5. from openpyxl.drawing.image import Image
  6. import os
  7. import shutil

  8. def select_input_file():
  9.     file_path = filedialog.askopenfilename(filetypes=[("Excel files", "*.xlsx")], title="请选择输入数据excel,.xlsx格式")
  10.     return file_path

  11. def select_template_file():
  12.     file_path = filedialog.askopenfilename(filetypes=[("Excel files", "*.xlsx")], title="请选择工艺卡模版的excel,.xlsx格式")
  13.     return file_path

  14. def select_target_folder():
  15.     folder_path = filedialog.askdirectory(title="请选择输出文件夹")
  16.     return folder_path

  17. def process_file(input_file, template_file, target_folder):
  18.     df_in = pd.read_excel(input_file)
  19.     process01_df(df_in)
  20.    
  21.     # 读取模板文件
  22.     wb = load_workbook(template_file)
  23.     ws = wb.active

  24.     # 这里假设你需要把图片插入到特定的单元格
  25.     for index, row in df_in.iterrows():
  26.         # 根据你的逻辑进行处理
  27.         
  28.         # 假设图片路径在某个列(比如第5列)
  29.         image_path = row[4]
  30.         if os.path.exists(image_path):
  31.             img = Image(image_path)
  32.             ws.add_image(img, f"A{index+2}")  # 假设从A2单元格开始插入图片
  33.    
  34.     # 将处理后的文件保存到目标文件夹
  35.     output_file = os.path.join(target_folder, os.path.basename(input_file))
  36.     wb.save(output_file)

  37. def main():
  38.     root = tk.Tk()
  39.     root.withdraw()  # 隐藏主窗口

  40.     input_file = select_input_file()
  41.     template_file = select_template_file()
  42.     target_folder = select_target_folder()

  43.     if input_file and template_file and target_folder:
  44.         process_file(input_file, template_file, target_folder)

  45. def process01_df(df_in):
  46.     for index, row in df_in.iterrows():
  47.         if row == '对焊' or row == '承插焊':
  48.             diam_thickness = f"Φ{row}*{row}"
  49.             df_in.at = diam_thickness
  50.         elif row == '开口焊':
  51.             diam_thickness = f"Φ{row}*{row}-Φ{row}*{row}"
  52.             df_in.at = diam_thickness

  53.         # 提取前段材质和前段材质编号
  54.         if "A105" in row:
  55.             df_in.at = "A105"
  56.             df_in.at = 20
  57.         elif "20-G" in row:
  58.             df_in.at = "20"
  59.             df_in.at = 21
  60.         elif "20G-" in row:
  61.             df_in.at = "20G"
  62.             df_in.at = 22
  63.         elif "20Ⅱ" in row:
  64.             df_in.at = "20Ⅱ"
  65.             df_in.at = 23
  66.         elif "20Ⅲ" in row:
  67.             df_in.at = "20Ⅲ"
  68.             df_in.at = 24
  69.         elif "12Cr1MoVG" in row:
  70.             df_in.at = "12Cr1MoVG"
  71.             df_in.at = 2
  72.         elif "12Cr1MoVⅡ" in row:
  73.             df_in.at = "12Cr1MoVⅡ"
  74.             df_in.at = 3
  75.         elif "12Cr1MoVⅢ" in row:
  76.             df_in.at = "12Cr1MoVⅢ"
  77.             df_in.at = 4
  78.         elif "15CrMoG" in row:
  79.             df_in.at = "15CrMoG"
  80.             df_in.at = 5
  81.         elif "15CrMoⅡ" in row:
  82.             df_in.at = "15CrMoⅡ"
  83.             df_in.at = 6
  84.         elif "15CrMoⅢ" in row:
  85.             df_in.at = "15CrMoⅢ"
  86.             df_in.at = 7

  87. if __name__ == "__main__":
  88.     main()
复制代码


这样,程序将插入图片到Excel中适当的单元格。注意修改`ws.add_image(img, f"A{index+2}")`这部分代码,确保图片插入到正确的单元格。根据实际情况调整代码即可。希望这个解答能帮到你!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-21 05:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表