鱼C论坛

 找回密码
 立即注册
查看: 763|回复: 34

[已解决]一个复杂的条件填充excel

[复制链接]
发表于 2024-7-29 10:58:21 | 显示全部楼层 |阅读模式

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

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

x
1,使用pandas或openpyxl
2,工作内容为:根据数据源表的数据,对符合要求的excel进行自动填充数据的工作
3,数据源表为"提取数据.xlsx" "
4,对C盘的excl文件里, execl文件名如果符合""提取数据.xlsx""的""管线号""列的数据,并且excel内含有sheet名称符合""提取数据.xlsx""的""工艺卡编号""列的数据"
5.提取符合要求的行的对应列“外径壁厚”的数据,填充到sheet内从单元格C6开始的单元格,向下填充,左对齐。
最佳答案
2024-7-29 12:14:48
这东西 你不拿样本数据   光靠AI的盲猜  根本不可能实现预期目标
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-7-29 11:02:39 | 显示全部楼层
听起来你需要用Python来处理Excel文件,像个数据魔法师一样!这一次,我们要用pandas或openpyxl来完成这个复杂的条件填充任务。别担心,我会让这段代码尽量通俗易懂,还有点幽默哦!

首先,我们需要读取“提取数据.xlsx”中的数据,然后根据你的条件来在C盘的那些Excel文件中进行填充。下面是一个简单的示例代码,使用pandas来实现:

  1. import pandas as pd
  2. import os

  3. # 1. 读取数据源表的数据
  4. source_file = "提取数据.xlsx"
  5. source_df = pd.read_excel(source_file)

  6. # 2. 遍历C盘的所有Excel文件
  7. c_drive = "C:/"
  8. for root, dirs, files in os.walk(c_drive):
  9.     for file in files:
  10.         if file.endswith('.xlsx') and file in source_df['管线号'].values:
  11.             # 3. 对符合条件的Excel文件进行处理
  12.             target_file_path = os.path.join(root, file)
  13.             print(f"正在处理: {target_file_path}")
  14.             
  15.             # 4. 读取目标Excel文件
  16.             target_df = pd.ExcelFile(target_file_path)
  17.             for sheet_name in target_df.sheet_names:
  18.                 if sheet_name in source_df['工艺卡编号'].values:
  19.                     # 5. 提取外径壁厚数据
  20.                     outer_thickness_data = source_df.loc[source_df['工艺卡编号'] == sheet_name, '外径壁厚']
  21.                     
  22.                     # 6. 在目标sheet中填充数据
  23.                     with pd.ExcelWriter(target_file_path, mode='a', engine='openpyxl') as writer:
  24.                         target_sheet = target_df.parse(sheet_name)
  25.                         start_row = 6  # 从C6开始填充
  26.                         
  27.                         # 将数据放到C列(注意:索引从0开始,所以C列就是2)
  28.                         for i, value in enumerate(outer_thickness_data):
  29.                             target_sheet.iloc[start_row + i, 2] = value  # C列是索引2
  30.                         
  31.                         # 保存文件
  32.                         target_sheet.to_excel(writer, sheet_name=sheet_name, index=False)

  33. print("所有文件处理完毕!")
复制代码


### 解释一下代码:
1. **读取数据源表**:使用`pd.read_excel()`读取“提取数据.xlsx”文件。
2. **遍历文件**:利用`os.walk()`遍历C盘的所有文件,查找扩展名为`.xlsx`的文件,并与“管线号”列进行匹配。
3. **处理目标Excel文件**:如果文件名符合管线号,那么就将这个文件路径保存下来并读取该Excel文件的所有表单名称。
4. **提取数据**:通过匹配“工艺卡编号”,找到对应的“外径壁厚”数据。
5. **填充数据**:从单元格C6开始填充数据,使用`to_excel()`保存文件。

### 注意事项:
- 确保你的环境中已经安装了`pandas`和`openpyxl`库,可以通过 `pip install pandas openpyxl` 来安装。
- 请根据实际情况调整路径和列名。
- 如果有任何问题,欢迎随时问我哦!

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

使用道具 举报

发表于 2024-7-29 12:14:48 | 显示全部楼层    本楼为最佳答案   
这东西 你不拿样本数据   光靠AI的盲猜  根本不可能实现预期目标
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-29 12:52:16 | 显示全部楼层
试试,ai还是能写的,我试试好了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-29 13:27:40 | 显示全部楼层

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

  7. def copy_template_to_new_file(pipeline_number_copy, template_path_copy, output_folder_copy):
  8.           # 构建新的文件名
  9.           new_file = f"{pipeline_number_copy}.xlsx"
  10.           # 构建新文件的完整路径
  11.           new_file_path = os.path.join(output_folder_copy, new_file)

  12.           # 复制模板文件到新文件路径
  13.           shutil.copy(template_path_copy, new_file_path)

  14.           # 加载源文件和新文件
  15.           workbook_source = load_workbook(template_path_copy)
  16.           workbook_new = load_workbook(new_file_path)

  17.           # 复制每个 sheet 的图片
  18.           for sheet_name in workbook_source.sheetnames:
  19.                           source_sheet = workbook_source[sheet_name]
  20.                           new_sheet = workbook_new[sheet_name]

  21.                           # 提取图片并添加到新 sheet 中
  22.                           for img in source_sheet._images:
  23.                                     new_img = Image(img.ref)
  24.                                     new_img.anchor = img.anchor  # 保持原图的位置
  25.                                     new_sheet.add_image(new_img) # 添加到新表中

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

  29.           # 获取所有sheet名
  30.           sheet_names = workbook_new.sheetnames

  31.           # 遍历所有sheet名,检查并删除不需要的sheet
  32.           for sheet_name in sheet_names:
  33.                          if 'H' in sheet_name and sheet_name not in processcards:
  34.                                     std = workbook_new[sheet_name]  # 获取具体的sheet
  35.                                     workbook_new.remove(std) # 删除sheet
  36.                              # 这里开始尝试添加数据,找到数据集合
  37.                          #filtered_rows_od = df_merge[df_merge["管线号"] == pipeline_number_copy,df_merge["工艺卡编号"] == pipeline_number_copy]
  38.                          #processcards = filtered_rows['工艺卡编号'].unique()
  39.                          #ws = wb[current_sheet_name]
  40.           # 保存修改后的Excel文件
  41.           workbook_new.save(new_file_path)

  42.           # 遍历所有sheet名,填充数据
  43.           sheet_names = workbook_new.sheetnames
  44.           for sheet_name in sheet_names:
  45.               filtered_rows_od = df_merge[df_merge["管线号"] == pipeline_number_copy]
  46.               list_od = filtered_rows_od['外径壁厚'].unique()

  47.               # 填充数据到C8单元格开始的位置,向下填充,左对齐
  48.               start_row = 8
  49.               start_col = 3
  50.               for index, value in enumerate(list_od):
  51.                   cell = sheet_name.cell(row=start_row + index, column=start_col, value=value)
  52.                   cell.alignment = openpyxl.styles.Alignment(horizontal='left')

  53.           # 保存修改后的Excel文件
  54.           workbook_new.save(new_file_path)
  55.           print(f"已创建并保存文件:{new_file_path}")

  56. # 读取原始数据文件
  57. df_merge = pd.read_excel("提取数据.xlsx")

  58. # 获取所有不同的管线号
  59. pipeline_ids = df_merge["管线号"].unique()   # 请确保替换为实际的列名

  60. # 定义模板文件路径和目标文件夹路径
  61. template_file = "工艺卡模板.xlsx"
  62. target_folder = "C:\\测试文件夹"

  63. # 确保目标文件夹存在
  64. if not os.path.exists(target_folder):
  65.        os.makedirs(target_folder)

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

  69. print("所有管线号对应的文件已成功创建!")
复制代码


错误如下
D:\PYTHON_NEW\pythonProject\.venv\Scripts\python.exe "D:\PYTHON_NEW\pythonProject\提取python excel\11 测试生成管线对应的工艺卡的填充数据.py"
Traceback (most recent call last):
  File "D:\PYTHON_NEW\pythonProject\提取python excel\11 测试生成管线对应的工艺卡的填充数据.py", line 89, in <module>
    copy_template_to_new_file(pipeline_number, template_file, target_folder)
  File "D:\PYTHON_NEW\pythonProject\提取python excel\11 测试生成管线对应的工艺卡的填充数据.py", line 62, in copy_template_to_new_file
    cell = sheet_name.cell(row=start_row + index, column=start_col, value=value)
           ^^^^^^^^^^^^^^^
AttributeError: 'str' object has no attribute 'cell'

Process finished with exit code 1

ai老师帮分析下呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-29 14:49:12 | 显示全部楼层
wp231957 发表于 2024-7-29 12:14
这东西 你不拿样本数据   光靠AI的盲猜  根本不可能实现预期目标

主要是没找到怎么上传附件呢,只会点那个复制代码。
大佬指导怎么传附件excel吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-29 16:14:32 From FishC Mobile | 显示全部楼层
本帖最后由 wp231957 于 2024-7-29 16:15 编辑
颂风侯 发表于 2024-7-29 14:49
主要是没找到怎么上传附件呢,只会点那个复制代码。
大佬指导怎么传附件excel吗


有啊,可以打包rar
然后发主题贴时,就有那个功能
跟帖时,要点高级回复
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-29 17:06:52 | 显示全部楼层
打包的按钮找不到。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-29 17:43:26 From FishC Mobile | 显示全部楼层
颂风侯 发表于 2024-7-29 17:06
打包的按钮找不到。。。

打包是你自己的事情,打包好后,上传附件
就那么几个按钮,一个一个的点开看,也能找到
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-29 18:21:21 | 显示全部楼层
颂风侯 发表于 2024-7-29 17:06
打包的按钮找不到。。。

发主题贴 或者回帖点开高级模式   这么明显的  看不见????
无标题.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-30 07:38:16 | 显示全部楼层
估计是权限问题,我的高级回复和主题帖附件,音乐,视频,flash这些都没的,从后面帖代码开始有。。。
谢谢大佬给我看下截图
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-30 07:39:46 | 显示全部楼层
我看了下用户权限,我到下一等级鱼油还要17积分,就可以解锁发附件啦
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-30 07:40:54 | 显示全部楼层
回复一个帖子一个积分,我回头有空刷下帖子看看有的回复下估计三天就有了,谢谢大佬
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-30 07:46:15 | 显示全部楼层
颂风侯 发表于 2024-7-30 07:40
回复一个帖子一个积分,我回头有空刷下帖子看看有的回复下估计三天就有了,谢谢大佬

嗯,好像是得到新鱼油1 才能  没看你的级别
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-30 07:46:39 | 显示全部楼层
颂风侯 发表于 2024-7-30 07:40
回复一个帖子一个积分,我回头有空刷下帖子看看有的回复下估计三天就有了,谢谢大佬

你可以发我邮箱里 wp231957@163.com
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-30 08:43:22 | 显示全部楼层
大佬发您了 您有空看看呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-30 09:04:05 | 显示全部楼层
颂风侯 发表于 2024-7-30 08:43
大佬发您了 您有空看看呢

80多米  太大了啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-30 09:42:04 | 显示全部楼层
那我做小点
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-30 09:44:51 | 显示全部楼层
删掉了一些模版,小很多啦,正常设计院的20M接收邮箱也可以收了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-30 10:41:28 | 显示全部楼层
颂风侯 发表于 2024-7-30 09:44
删掉了一些模版,小很多啦,正常设计院的20M接收邮箱也可以收了

你给我四个文件  其中的py 可以忽略了
说说那三个文件   你都想实现啥  其中有一个表里面还有很多sheet
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-22 01:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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