颂风侯 发表于 2024-7-29 10:58:21

一个复杂的条件填充excel

1,使用pandas或openpyxl
2,工作内容为:根据数据源表的数据,对符合要求的excel进行自动填充数据的工作
3,数据源表为"提取数据.xlsx" "
4,对C盘的excl文件里, execl文件名如果符合""提取数据.xlsx""的""管线号""列的数据,并且excel内含有sheet名称符合""提取数据.xlsx""的""工艺卡编号""列的数据"
5.提取符合要求的行的对应列“外径壁厚”的数据,填充到sheet内从单元格C6开始的单元格,向下填充,左对齐。

FishC 发表于 2024-7-29 11:02:39

听起来你需要用Python来处理Excel文件,像个数据魔法师一样!这一次,我们要用pandas或openpyxl来完成这个复杂的条件填充任务。别担心,我会让这段代码尽量通俗易懂,还有点幽默哦!

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

import pandas as pd
import os

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

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

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 小助理,如未能正确解答您的问题,请继续追问。

wp231957 发表于 2024-7-29 12:14:48

这东西 你不拿样本数据   光靠AI的盲猜根本不可能实现预期目标

颂风侯 发表于 2024-7-29 12:52:16

试试,ai还是能写的,我试试好了

颂风侯 发表于 2024-7-29 13:27:40


import pandas as pd
import openpyxl
from openpyxl import load_workbook
from openpyxl.drawing.image import Image
import os
import shutil

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

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

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

          # 复制每个 sheet 的图片
          for sheet_name in workbook_source.sheetnames:
                        source_sheet = workbook_source
                        new_sheet = workbook_new

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

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

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

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

          # 遍历所有sheet名,填充数据
          sheet_names = workbook_new.sheetnames
          for sheet_name in sheet_names:
            filtered_rows_od = df_merge == pipeline_number_copy]
            list_od = filtered_rows_od['外径壁厚'].unique()

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

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

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

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

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

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

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

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老师帮分析下呢

颂风侯 发表于 2024-7-29 14:49:12

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

主要是没找到怎么上传附件呢,只会点那个复制代码。
大佬指导怎么传附件excel吗

wp231957 发表于 2024-7-29 16:14:32

本帖最后由 wp231957 于 2024-7-29 16:15 编辑

颂风侯 发表于 2024-7-29 14:49
主要是没找到怎么上传附件呢,只会点那个复制代码。
大佬指导怎么传附件excel吗

有啊,可以打包rar
然后发主题贴时,就有那个功能
跟帖时,要点高级回复

颂风侯 发表于 2024-7-29 17:06:52

{:10_269:}打包的按钮找不到。。。{:5_104:}

wp231957 发表于 2024-7-29 17:43:26

颂风侯 发表于 2024-7-29 17:06
打包的按钮找不到。。。

打包是你自己的事情,打包好后,上传附件
就那么几个按钮,一个一个的点开看,也能找到

wp231957 发表于 2024-7-29 18:21:21

颂风侯 发表于 2024-7-29 17:06
打包的按钮找不到。。。

发主题贴 或者回帖点开高级模式   这么明显的看不见????

颂风侯 发表于 2024-7-30 07:38:16

估计是权限问题,我的高级回复和主题帖附件,音乐,视频,flash这些都没的,从后面帖代码开始有。。。
谢谢大佬给我看下截图

颂风侯 发表于 2024-7-30 07:39:46

我看了下用户权限,我到下一等级鱼油还要17积分,就可以解锁发附件啦

颂风侯 发表于 2024-7-30 07:40:54

回复一个帖子一个积分,我回头有空刷下帖子看看有的回复下估计三天就有了,谢谢大佬

wp231957 发表于 2024-7-30 07:46:15

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

嗯,好像是得到新鱼油1 才能没看你的级别

wp231957 发表于 2024-7-30 07:46:39

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

你可以发我邮箱里 wp231957@163.com

颂风侯 发表于 2024-7-30 08:43:22

大佬发您了{:5_109:} 您有空看看呢

wp231957 发表于 2024-7-30 09:04:05

颂风侯 发表于 2024-7-30 08:43
大佬发您了 您有空看看呢

80多米太大了啊

颂风侯 发表于 2024-7-30 09:42:04

那我做小点

颂风侯 发表于 2024-7-30 09:44:51

删掉了一些模版,小很多啦,正常设计院的20M接收邮箱也可以收了

wp231957 发表于 2024-7-30 10:41:28

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

你给我四个文件其中的py 可以忽略了
说说那三个文件   你都想实现啥其中有一个表里面还有很多sheet
页: [1] 2
查看完整版本: 一个复杂的条件填充excel