鱼C论坛

 找回密码
 立即注册
查看: 164|回复: 3

[已解决]求助 根据excel的每行的内容,对应填充到模板的excel表

[复制链接]
发表于 2024-7-18 22:14:46 | 显示全部楼层 |阅读模式

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

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

x
求助 根据excel的每行的内容,对应填充到模板的excel表
想做一个python程序,根据一个excel里每行的内容,对应填写到模板excel的对应空格,文件名按照源文件excel每行的第一列文本名称。
神庙,拜拜
最佳答案
2024-7-22 10:05:25
颂风侯 发表于 2024-07-22 10:03
import pandas as pd

def process_excel(input_fil ...


好的,让我们来看看你的代码,找出问题并修复它!

### 潜在的问题和修复

1. **查找非零的行**:
   你用 `df[df != 0][]` 的方式来提取非零行,这是错误的。你需要使用 `.any(axis=1)` 方法来选择包含非零的行。

2. **合并数据框的方式**:
   `pd.concat()`没有指定要合并的数据框。

3. **分组和求和**:
   需要在 `groupby()` 中指定要分组的列名。

4. **缺少具体的列名**:
   对于 `groupby` 和 `concatenate` 都需要指定具体的列名称。

这里是更新后的代码示例:
import pandas as pd

def process_excel(input_file, output_file):
    # 读取Excel文件
    df = pd.read_excel(input_file)

    # 根据焊缝数量不为0的行提取指定列,假设我们想提取 '焊缝种类2' 和 '工艺卡编号2' 列
    df1 = df[df['焊缝数量'] != 0]  # 假设 '焊缝数量' 是你要检查的列名
    df2 = df[df['焊缝数量'] != 0][['焊缝种类2', '工艺卡编号2']]  # 提取所需列

    # 重命名焊缝种类2和工艺卡编号2的列名,以便后续合并
    df2.rename(columns={'焊缝种类2': '焊缝种类', '工艺卡编号2': '工艺卡编号'}, inplace=True)

    # 合并两个数据框
    merged_df = pd.concat([df1, df2], ignore_index=True)  # 记得传入列表并忽略索引

    # 对相同的焊缝种类和工艺卡编号进行分组求和
    result_df = merged_df.groupby(['焊缝种类', '工艺卡编号']).sum().reset_index()  # 指定分组列

    # 对结果按照管线号进行排序,假设 '管线号' 是一个存在的列名
    result_df.sort_values(by='管线号', inplace=True)

    # 将结果写入新的Excel文件
    result_df.to_excel(output_file, index=False)

if __name__ == "__main__":
    input_file = "原始数据.xlsx"
    output_file = "提取结果.xlsx"
    process_excel(input_file, output_file)

### 注意事项
- 请确保列名(如 `'焊缝数量'`, `'焊缝种类2'`, `'工艺卡编号2'`, `'管线号'`)在你的实际数据中是正确的。
- 要保证 `input_file` 文件路径正确,且文件存在。

希望这个改进能让你顺利运行代码!如果还有问题,请随时告诉我!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-7-18 22:15:22 | 显示全部楼层
好的,让我们来解决这个问题。首先,我们需要使用 `pandas` 和 `openpyxl` 库来处理 Excel 文件。如果你还没有安装这些库,可以通过以下命令来安装:
pip install pandas openpyxl

下面是一个简单的 Python 脚本,可以根据源 Excel 文件的每行内容填充到模板 Excel 文件中,并生成新的文件。假设源文件名为 `source.xlsx`,模板文件名为 `template.xlsx`。
import pandas as pd
from openpyxl import load_workbook

# 读取源文件
source_df = pd.read_excel('source.xlsx')

# 遍历每一行
for index, row in source_df.iterrows():
    # 读取模板文件
    template_wb = load_workbook('template.xlsx')
    template_ws = template_wb.active
    
    # 假设模板文件中需要填充的单元格是固定的,比如 A1, B1, C1 等
    # 根据源文件的列填充模板文件
    template_ws['A1'] = row['列1']
    template_ws['B1'] = row['列2']
    template_ws['C1'] = row['列3']
    
    # 生成新的文件名,根据源文件每行的第一列文本名称
    new_filename = f"{row['列1']}.xlsx"
    template_wb.save(new_filename)
    print(f"已生成文件: {new_filename}")

print("所有文件生成完毕")

在这个脚本中,我们做了以下几步:
1. 使用 `pandas` 读取源 Excel 文件。
2. 遍历源文件的每一行。
3. 读取模板文件。
4. 根据源文件的每一行内容填充模板文件的对应单元格。
5. 根据源文件每行的第一列内容生成新的文件名,并保存填充后的模板文件。

注意:上面的例子假设源文件和模板文件的结构是已知的,且模板文件中需要填充的单元格是固定的。如果你的模板文件有更复杂的结构,可能需要调整脚本中填充单元格的逻辑。

希望这个脚本能帮到你,如果还有什么问题或者需要更具体的帮助,尽管问吧!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-22 10:03:03 | 显示全部楼层
import pandas as pd

def process_excel(input_file, output_file):
    # 读取Excel文件
    df = pd.read_excel(input_file)

    # 根据焊缝数量不为0的行提取指定列
    df1 = df[df['焊缝数量'] != 0][['管线号', '焊缝种类', '工艺卡编号']]
    df2 = df[df['焊缝数量2'] != 0][['管线号', '焊缝种类2', '工艺卡编号2']]

    # 重命名焊缝种类2和工艺卡编号2的列名,以便后续合并
    df2.rename(columns={'焊缝种类2': '焊缝种类', '工艺卡编号2': '工艺卡编号'}, inplace=True)

    # 合并两个数据框
    merged_df = pd.concat([df1, df2])

    # 对相同的焊缝种类和工艺卡编号进行分组求和
    result_df = merged_df.groupby(['管线号', '焊缝种类', '工艺卡编号']).sum().reset_index()

    # 对结果按照管线号进行排序
    result_df.sort_values(by='管线号', inplace=True)

    # 将结果写入新的Excel文件
    result_df.to_excel(output_file, index=False)

if __name__ == "__main__":
    input_file = "原始数据.xlsx"
    output_file = "提取结果.xlsx"
    process_excel(input_file, output_file)


AI写的这个代码看起来比较对了,运行出错呢,帮忙看下什么问题呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-22 10:05:25 | 显示全部楼层    本楼为最佳答案   
颂风侯 发表于 2024-07-22 10:03
import pandas as pd

def process_excel(input_fil ...


好的,让我们来看看你的代码,找出问题并修复它!

### 潜在的问题和修复

1. **查找非零的行**:
   你用 `df[df != 0][]` 的方式来提取非零行,这是错误的。你需要使用 `.any(axis=1)` 方法来选择包含非零的行。

2. **合并数据框的方式**:
   `pd.concat()`没有指定要合并的数据框。

3. **分组和求和**:
   需要在 `groupby()` 中指定要分组的列名。

4. **缺少具体的列名**:
   对于 `groupby` 和 `concatenate` 都需要指定具体的列名称。

这里是更新后的代码示例:
import pandas as pd

def process_excel(input_file, output_file):
    # 读取Excel文件
    df = pd.read_excel(input_file)

    # 根据焊缝数量不为0的行提取指定列,假设我们想提取 '焊缝种类2' 和 '工艺卡编号2' 列
    df1 = df[df['焊缝数量'] != 0]  # 假设 '焊缝数量' 是你要检查的列名
    df2 = df[df['焊缝数量'] != 0][['焊缝种类2', '工艺卡编号2']]  # 提取所需列

    # 重命名焊缝种类2和工艺卡编号2的列名,以便后续合并
    df2.rename(columns={'焊缝种类2': '焊缝种类', '工艺卡编号2': '工艺卡编号'}, inplace=True)

    # 合并两个数据框
    merged_df = pd.concat([df1, df2], ignore_index=True)  # 记得传入列表并忽略索引

    # 对相同的焊缝种类和工艺卡编号进行分组求和
    result_df = merged_df.groupby(['焊缝种类', '工艺卡编号']).sum().reset_index()  # 指定分组列

    # 对结果按照管线号进行排序,假设 '管线号' 是一个存在的列名
    result_df.sort_values(by='管线号', inplace=True)

    # 将结果写入新的Excel文件
    result_df.to_excel(output_file, index=False)

if __name__ == "__main__":
    input_file = "原始数据.xlsx"
    output_file = "提取结果.xlsx"
    process_excel(input_file, output_file)

### 注意事项
- 请确保列名(如 `'焊缝数量'`, `'焊缝种类2'`, `'工艺卡编号2'`, `'管线号'`)在你的实际数据中是正确的。
- 要保证 `input_file` 文件路径正确,且文件存在。

希望这个改进能让你顺利运行代码!如果还有问题,请随时告诉我!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-15 22:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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