鱼C论坛

 找回密码
 立即注册
查看: 400|回复: 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的盲猜  根本不可能实现预期目标
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[source_df['工艺卡编号'] == 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[start_row + i, 2] = 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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-29 12:14:48 | 显示全部楼层    本楼为最佳答案   
这东西 你不拿样本数据   光靠AI的盲猜  根本不可能实现预期目标
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-29 12:52:16 | 显示全部楼层
试试,ai还是能写的,我试试好了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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[sheet_name]
                          new_sheet = workbook_new[sheet_name]

                          # 提取图片并添加到新 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[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_name]  # 获取具体的sheet
                                    workbook_new.remove(std) # 删除sheet
                             # 这里开始尝试添加数据,找到数据集合
                         #filtered_rows_od = df_merge[df_merge["管线号"] == pipeline_number_copy,df_merge["工艺卡编号"] == pipeline_number_copy]
                         #processcards = filtered_rows['工艺卡编号'].unique()
                         #ws = wb[current_sheet_name]
          # 保存修改后的Excel文件
          workbook_new.save(new_file_path)

          # 遍历所有sheet名,填充数据
          sheet_names = workbook_new.sheetnames
          for sheet_name in sheet_names:
              filtered_rows_od = df_merge[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老师帮分析下呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

主要是没找到怎么上传附件呢,只会点那个复制代码。
大佬指导怎么传附件excel吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


有啊,可以打包rar
然后发主题贴时,就有那个功能
跟帖时,要点高级回复
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-29 17:06:52 | 显示全部楼层
打包的按钮找不到。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

打包是你自己的事情,打包好后,上传附件
就那么几个按钮,一个一个的点开看,也能找到
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

发主题贴 或者回帖点开高级模式   这么明显的  看不见????
无标题.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2024-7-30 07:39:46 | 显示全部楼层
我看了下用户权限,我到下一等级鱼油还要17积分,就可以解锁发附件啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-30 07:40:54 | 显示全部楼层
回复一个帖子一个积分,我回头有空刷下帖子看看有的回复下估计三天就有了,谢谢大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

嗯,好像是得到新鱼油1 才能  没看你的级别
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

你可以发我邮箱里 wp231957@163.com
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-30 08:43:22 | 显示全部楼层
大佬发您了 您有空看看呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

80多米  太大了啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-30 09:42:04 | 显示全部楼层
那我做小点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-30 09:44:51 | 显示全部楼层
删掉了一些模版,小很多啦,正常设计院的20M接收邮箱也可以收了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

你给我四个文件  其中的py 可以忽略了
说说那三个文件   你都想实现啥  其中有一个表里面还有很多sheet
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 23:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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