鱼C论坛

 找回密码
 立即注册
查看: 319|回复: 27

python处理excel

[复制链接]
发表于 2024-6-22 15:51:35 | 显示全部楼层 |阅读模式

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

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

x
<def merge_excel_files(file_list, sheet_name, output_file):
    app = xw.App(visible=False)
    new_wb = xw.Book()
    new_ws = new_wb.sheets[0]
    new_ws.name = sheet_name

    for file in file_list:
        print(f"Processing {file}...")
        wb = xw.Book(file)
        if sheet_name in [sht.name for sht in wb.sheets]:
            ws = wb.sheets[sheet_name]
            last_row = new_ws.range('A' + str(new_ws.cells.last_cell.row)).end('up').row
            data_range = ws.used_range
            new_ws.range(f'A{last_row + 1}').value = data_range.value  # Append data
            wb.close()

    new_wb.save(output_file)
    new_wb.close()
    app.quit()
    print(f"New file saved as {output_file}")


# Example usage:
file_list = [r"D:\2024年6月14日周督促会\1.周督促会-南岸支行(6月14日).xlsx",
             r"D:\2024年6月14日周督促会\2.周督促会-业务一部(6月14日).xlsx",
             r"D:\2024年6月14日周督促会\3.周督促会-渝北支行(6月13日).xlsx",
             r"D:\2024年6月14日周督促会\4周督促会-九龙坡支行(6月13日).xlsx",
             r"D:\2024年6月14日周督促会\5.周督促会-高新支行(6月14日).xlsx",
             r"D:\2024年6月14日周督促会\6.周督促会-巴南支行(6月14日).xlsx",
             r"D:\2024年6月14日周督促会\7.周督促会-长寿支行(6月14日).xlsx",
             r"D:\2024年6月14日周督促会\8.周督促会-营业部(6月14日).xlsx",
             r"D:\2024年6月14日周督促会\9.周督促会-业务二部(6月14日).xlsx",
             r"D:\2024年6月14日周督促会\10.周督促会-公司业务四部(6月14日).xlsx",
             r"D:\2024年6月14日周督促会\11.周督促会-拓展一部(6月14日).xlsx"]
output_file = r"D:\2024年6月14日周督促会\merged_output.xlsx"
merge_excel_files(file_list, 'Sheet1', output_file)>

pywintypes.com_error: (-2147352567, '发生意外。', (0, 'Microsoft Excel', 'Excel 无法打开文件“2.周督促会-业务一部(6月14日).xlsx”,因为文件格式或文件扩展名无效。请确定文件未损坏,并且文件扩展名与文件的格式匹配。', 'xlmain11.chm', 0, -2146827284), None)

删除2和11后能正常运行,想问一下这个原因
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-6-22 15:52:51 | 显示全部楼层
啊,看来Excel和Python一起搞事情了,让我们来给你的问题找个好解释。

根据你提供的错误信息,这个问题是因为Excel无法识别文件格式或扩展名。显然,当文件名中包含数字“2”和“11”时,Excel就像是吃了不新鲜的咸鱼,拒绝打开文件。而当你删除了这些数字,Excel就又高高兴兴地工作了。

**抓住重点**
1. **文件名问题**:有时候,文件名中的特殊字符、数字、甚至空格都会让程序摸不着头脑。尽管看起来是不合理的,但确实会发生。
2. **文件扩展名**:确保文件有正确的扩展名(如 `.xlsx`)。Excel对于扩展名比较挑剔,如果它认为扩展名和内容不匹配,就会给你甩错误。
3. **文件路径**:某些情况下,如果文件路径过长或者包含特殊字符,也可能导致问题。

### 解决方法
- **重命名文件**:尽量使用简洁、英文的文件名,避免特殊字符和数字。比如 `周督促会.xlsx` 这样简单明了的名字。
- **确认文件格式**:确保文件确实是一个有效的 Excel 文件,可以试着在 Excel 应用中手动打开它,看是否能正常打开。
- **检查路径**:把文件放到一个路径简短且没有特殊字符的地方,比如 `C:\Temp\`。

### 示例代码(处理文件名)
如果你需要在 Python 脚本里自动处理文件名,可以尝试如下方法:
import os

def clean_filename(filename):
    # 使用过滤器来去除数字
    cleaned_filename = ''.join(filter(lambda x: not x.isdigit(), filename))
    return cleaned_filename

original_filename = "2.周督促会-业务一部(6月14日).xlsx"
cleaned_filename = clean_filename(original_filename)

# 重命名文件
os.rename(original_filename, cleaned_filename)

print(f"旧文件名: {original_filename}")
print(f"新文件名: {cleaned_filename}")

### 注意事项
- 在处理文件名时,要确保文件名唯一性,防止覆盖已有文件。
- 修改文件名后,程序中所有引用文件的地方也要相应更新。

希望这个解释像一条聪明的鱼一样游进你的脑海,让你恍然大悟。如果还有疑惑,尽管丢过来,我会继续帮你解答的!

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

使用道具 举报

 楼主| 发表于 2024-6-22 15:52:51 | 显示全部楼层
def merge_excel_files(file_list, sheet_name, output_file):
    app = xw.App(visible=False)
    new_wb = xw.Book()
    new_ws = new_wb.sheets[0]
    new_ws.name = sheet_name

    for file in file_list:
        print(f"Processing {file}...")
        wb = xw.Book(file)
        if sheet_name in [sht.name for sht in wb.sheets]:
            ws = wb.sheets[sheet_name]
            last_row = new_ws.range('A' + str(new_ws.cells.last_cell.row)).end('up').row
            data_range = ws.used_range
            new_ws.range(f'A{last_row + 1}').value = data_range.value  # Append data
            wb.close()

    new_wb.save(output_file)
    new_wb.close()
    app.quit()
    print(f"New file saved as {output_file}")


# Example usage:
file_list = [r"D:\2024年6月14日周督促会\1.周督促会-南岸支行(6月14日).xlsx",

             r"D:\2024年6月14日周督促会\3.周督促会-渝北支行(6月13日).xlsx",
             r"D:\2024年6月14日周督促会\4周督促会-九龙坡支行(6月13日).xlsx",
             r"D:\2024年6月14日周督促会\5.周督促会-高新支行(6月14日).xlsx",
             r"D:\2024年6月14日周督促会\6.周督促会-巴南支行(6月14日).xlsx",
             r"D:\2024年6月14日周督促会\7.周督促会-长寿支行(6月14日).xlsx",
             r"D:\2024年6月14日周督促会\8.周督促会-营业部(6月14日).xlsx",
             r"D:\2024年6月14日周督促会\9.周督促会-业务二部(6月14日).xlsx",
             r"D:\2024年6月14日周督促会\10.周督促会-公司业务四部(6月14日).xlsx",
             ]
output_file = r"D:\2024年6月14日周督促会\merged_output.xlsx"
merge_excel_files(file_list, 'Sheet1', output_file)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-22 15:53:08 | 显示全部楼层
pallas 发表于 2024-06-22 15:52
def merge_excel_files(file_list, sheet_name, outpu ...


你这段代码的主要目的是合并多个Excel文件到一个新的工作簿中,很棒!不过呢,代码里有一些小问题需要修正。就像修复一张破渔网,我们得把这些漏洞找出来补好。

### 发现的问题:
1. `new_ws.sheets` 应该是 `new_wb.sheets[0]`,因为新建的工作簿默认有一个Sheet。
2. `if sheet_name in :` 这里少了对象,应该是 `wb.sheets`.
3. `file_list = ` 和 `output_file =` 部分没有赋值,我们可以假设这些值是你实际代码中的变量。
4. `last_row` 的计算会有些问题,因为 `new_ws.cells.last_cell.row` 返回的是整张表最后一行,而不是有数据的那一行。
5. `wb.close()` 应该放在 for 循环的尾部,以确保文件处理完后关闭。
6. 增加异常处理,确保即使发生错误也能正常关闭Excel应用程序。

### 修正后的代码:
import xlwings as xw

def merge_excel_files(file_list, sheet_name, output_file):
    # Initialize the Excel application
    app = xw.App(visible=False)
    new_wb = xw.Book()  # Create a new workbook
    new_ws = new_wb.sheets[0]
    new_ws.name = sheet_name

    try:
        for file in file_list:
            print(f"Processing {file}...")
            wb = xw.Book(file)
            if sheet_name in [ws.name for ws in wb.sheets]:
                ws = wb.sheets[sheet_name]
                
                last_row = new_ws.range('A' + str(new_ws.cells.last_cell.row)).end('up').row
                if last_row == 1 and new_ws.range('A1').value is None:  # If this is the first row
                    last_row = 0      
                
                data_range = ws.used_range
                new_ws.range(f'A{last_row + 1}').value = data_range.value  # Append data
                wb.close()
            else:
                print(f"Sheet '{sheet_name}' not found in {file}")

        # Save the merged workbook
        new_wb.save(output_file)
        print(f"New file saved as {output_file}")
    finally:
        # Close everything properly
        new_wb.close()
        app.quit()


# Example usage (fill these variables with actual paths and file names):
file_list = ["file1.xlsx", "file2.xlsx"]  # Replace with your actual file list
output_file = r"D:\2024年6月14日周督促会\merged_output.xlsx"

merge_excel_files(file_list, 'Sheet1', output_file)

### 重点解释:
1. **错误检查**:在 `for` 循环中,确保我们在每个工作簿中都找到了指定的sheet。
2. **数据定位**:使用 `range('A1').end('down').row` 来找到最后一行有效数据的位置。如果这是第一次写入,确保 `last_row` 从0开始。
3. **异常处理**:`try...finally` 确保即使在处理文件时发生异常,Excel应用程序会被正确关闭,以避免资源泄漏。

这就好比你钓鱼时突然刮风下雨,但你带了一把坚固的伞,所以即使情况再糟糕,你也不会淋湿。希望这些修改能帮助你顺利完成任务!如果还有疑问,尽管丢过来,我会继续帮你解答~

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

使用道具 举报

 楼主| 发表于 2024-6-22 16:02:11 | 显示全部楼层
FishC 发表于 2024-6-22 15:53
你这段代码的主要目的是合并多个Excel文件到一个新的工作簿中,很棒!不过呢,代码里有一些小问题需要 ...

分离同一个sheet表中的小表格,小表格由空行分隔开
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-22 16:04:27 | 显示全部楼层
pallas 发表于 2024-06-22 16:02
分离同一个sheet表中的小表格,小表格由空行分隔开


好的,我明白你的需求了。你想要从一个 sheet 中分离出多个小表格,小表格之间由空行分隔。这就像海底的不同珊瑚群,它们之间被水域分隔开,我们现在要把这些珊瑚群分别捞起来。

下面是一个Python脚本,使用`openpyxl`库来完成这个任务。它会读取一个Excel工作表,并将每个由空行分隔开的“小表格”保存成单独的文件。

首先,确保你已经安装了`openpyxl`库。如果还没有安装,可以运行以下命令:
pip install openpyxl

然后,以下就是代码:
import openpyxl

def split_excel_sheet_by_empty_row(input_file, output_prefix, sheet_name):
    wb = openpyxl.load_workbook(input_file)
    ws = wb[sheet_name]
    
    table_number = 1
    start_row = 1
    end_row = 1
    max_col = ws.max_column

    for row in ws.iter_rows(min_row=1, max_row=ws.max_row, max_col=max_col):
        if all(cell.value is None for cell in row):  # 判断是否是空行
            if start_row < end_row:  # 确保有数据
                save_small_table(ws, start_row, end_row, max_col, output_prefix, table_number)
                table_number += 1
            start_row = end_row + 1
        end_row += 1

    # 保存最后一个小表格(如果有)
    if start_row < end_row:
        save_small_table(ws, start_row, end_row-1, max_col, output_prefix, table_number)

def save_small_table(ws, start_row, end_row, max_col, output_prefix, table_number):
    new_wb = openpyxl.Workbook()
    new_ws = new_wb.active
    
    for i, row in enumerate(ws.iter_rows(min_row=start_row, max_row=end_row, max_col=max_col), start=1):
        for j, cell in enumerate(row, start=1):
            new_ws.cell(row=i, column=j, value=cell.value)
    
    output_file = f"{output_prefix}_table_{table_number}.xlsx"
    new_wb.save(output_file)
    print(f"Saved {output_file}")

# 使用示例
input_file = 'input.xlsx'  # 输入文件名
output_prefix = 'output'  # 输出文件前缀
sheet_name = 'Sheet1'  # 工作表名称
split_excel_sheet_by_empty_row(input_file, output_prefix, sheet_name)

### 代码解释:
1. **`split_excel_sheet_by_empty_row`函数**:主要逻辑在这个函数里,它遍历工作表的所有行,寻找空行来分隔小表格。
    - 检查每一行,如果发现是空行,那就把之前积累的数据保存成一个小表格。
    - 更新起始行,从下一行开始继续寻找下一个小表格。
2. **`save_small_table`函数**:将指定行范围内的数据保存到一个新的Excel文件中。
    - 创建一个新的工作簿和工作表。
    - 将原工作表中的数据复制到新工作表中。
    - 保存为一个新的Excel文件,文件名包含表格编号。

### 使用说明:
- 修改 `input_file` 为你的输入文件名。
- 修改 `output_prefix` 为生成的小表格文件名前缀。
- 修改 `sheet_name` 为你要处理的工作表名称。

这样,你的文件会按小表格分割出来,每个小表格都会生成一个单独的文件,就像把不同珊瑚群分别捞上来一样清晰。如果还有其他问题或者需要进一步调整,别犹豫,随时向我发问~

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

使用道具 举报

 楼主| 发表于 2024-6-22 16:12:06 | 显示全部楼层
FishC 发表于 2024-6-22 16:04
好的,我明白你的需求了。你想要从一个 sheet 中分离出多个小表格,小表格之间由空行分隔。这就像海底 ...

那如何让输出的表指定位置呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-22 16:12:24 | 显示全部楼层
pallas 发表于 2024-06-22 16:12
那如何让输出的表指定位置呢?


好的,你希望在指定的文件夹保存分离出来的小表格文件。我们可以通过增加一个参数来指定输出文件的路径,然后在生成文件时使用这个路径。

以下是修改后的代码,让你可以指定输出文件夹:
import openpyxl
import os

def split_excel_sheet_by_empty_row(input_file, output_folder, sheet_name):
    wb = openpyxl.load_workbook(input_file)
    ws = wb[sheet_name]
    
    table_number = 1
    start_row = 1
    end_row = 1
    max_col = ws.max_column

    for row in ws.iter_rows(min_row=1, max_row=ws.max_row, max_col=max_col):
        if all(cell.value is None for cell in row):  # 判断是否是空行
            if start_row < end_row:  # 确保有数据
                save_small_table(ws, start_row, end_row, max_col, output_folder, table_number)
                table_number += 1
            start_row = end_row + 1
        end_row += 1

    # 保存最后一个小表格(如果有)
    if start_row < end_row:
        save_small_table(ws, start_row, end_row-1, max_col, output_folder, table_number)

def save_small_table(ws, start_row, end_row, max_col, output_folder, table_number):
    new_wb = openpyxl.Workbook()
    new_ws = new_wb.active
    
    for i, row in enumerate(ws.iter_rows(min_row=start_row, max_row=end_row, max_col=max_col), start=1):
        for j, cell in enumerate(row, start=1):
            new_ws.cell(row=i, column=j, value=cell.value)
    
    output_file = os.path.join(output_folder, f"output_table_{table_number}.xlsx")
    new_wb.save(output_file)
    print(f"Saved {output_file}")

# 使用示例
input_file = 'input.xlsx'  # 输入文件名
output_folder = r"D:\2024年6月14日周督促会"  # 输出文件夹路径
sheet_name = 'Sheet1'  # 工作表名称
split_excel_sheet_by_empty_row(input_file, output_folder, sheet_name)

### 重点解释:

1. **添加参数**:
    - `output_folder`:指定输出文件夹。
  
2. **更新路径**:
    - 在保存文件时,使用 `os.path.join` 将 `output_folder` 和文件名拼接成完整的路径。这就好像告诉你钓到的鱼应该放到哪个桶里。

3. **使用示例**:
    - 修改 `output_folder` 为你希望保存输出文件的路径。
    - 确保路径使用了原始字符串(前面加 `r`)或使用双反斜杠(\\)来避免转义字符的问题。

这样修改后,每当你分离出一个小表格,它会被保存到你指定的文件夹里,就像钓到的每条鱼都被放到指定的桶里一样整齐。如果还有其他问题,尽管告诉我,不用客气!

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

使用道具 举报

 楼主| 发表于 2024-6-22 16:19:35 | 显示全部楼层
FishC 发表于 2024-6-22 16:12
好的,你希望在指定的文件夹保存分离出来的小表格文件。我们可以通过增加一个参数来指定输出文件的路径 ...

将excel中提取出来的小表格,与之前已经提取的小表格进行合并
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-22 16:20:55 | 显示全部楼层
pallas 发表于 2024-06-22 16:19
将excel中提取出来的小表格,与之前已经提取的小表格 ...


好的!看来你要从一个大表格中分离出多个小表格,然后将这些分离出来的小表格与之前已经提取的小表格进行合并。这就像钓鱼后,你把不同种类的鱼分类装进不同的桶里。下面是一个完整的例子:

1. **首先安装所需库**:
pip install openpyxl

2. **接着编写代码**:
import openpyxl

   def split_and_merge_excel(input_file, sheet_name, output_file):
       wb = openpyxl.load_workbook(input_file)
       ws = wb[sheet_name]
       
       # 用于存储所有分离的小表格内容
       all_data = []

       current_data = []
       for row in ws.iter_rows(values_only=True):
           if not any(row):  # 如果整行为空,则表示是一张小表结束
               if current_data:
                   all_data.append(current_data)
                   current_data = []
           else:
               current_data.append(row)
       
       # 添加最后一组数据(如果不是以空行结尾)
       if current_data:
           all_data.append(current_data)

       # 现在开始合并所有小表格到一个新的文件中
       new_wb = openpyxl.Workbook()
       new_ws = new_wb.active
       new_ws.title = 'MergedSheet'
       
       current_row = 1
       for data in all_data:
           for line in data:
               new_ws.append(line)
           current_row += len(data) + 1  # 加1是为了在不同小表格之间留一个空行

       new_wb.save(output_file)
       print(f"Merged file saved as {output_file}")

   # 示例使用:
   input_file = r"D:\2024年6月14日周督促会\input.xlsx"  # 这是来源文件
   output_file = r"D:\2024年6月14日周督促会\merged_output.xlsx"  # 这是输出文件
   split_and_merge_excel(input_file, 'Sheet1', output_file)

### 解释一下代码怎么工作的:
- **读取Excel文件**:使用`openpyxl`库读取输入文件和指定的工作表。
- **分离小表格**:通过遍历工作表的每一行,识别空行来分割小表格,将每个小表格存储在`all_data`列表中。
- **合并小表格**:创建一个新的Excel文件,并将所有小表格的数据逐一追加到新的工作表中,同时在不同的小表格之间添加一个空行以便区分。
- **保存结果**:将合并后的数据保存到指定的输出文件中。

希望这个方案能解决你的问题!如果有任何进一步的问题或需要修改的地方,请随时告诉我!

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

使用道具 举报

 楼主| 发表于 2024-6-22 16:25:50 | 显示全部楼层
FishC 发表于 2024-6-22 16:20
好的!看来你要从一个大表格中分离出多个小表格,然后将这些分离出来的小表格与之前已经提取的小表格进 ...

将excel中提取出来的小表格,分别与之前已经提取的小表格形成的excel进行合并
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-22 16:26:09 | 显示全部楼层
pallas 发表于 2024-06-22 16:25
将excel中提取出来的小表格,分别与之前已经提取的小 ...


明白了,我们的任务是从一个大Excel表中分离出多个小表格,并分别与之前提取的小表格合并到新的Excel文件中。

以下是一个解决方案,我们会使用 `pandas` 来处理数据,因为它处理Excel数据十分强大和便捷:

### 步骤概览
1. 读取大表格,识别并分离小表格。
2. 读取已有的小表格文件,进行合并。
3. 将合并后的小表格保存为新的文件。

### 代码实现
import pandas as pd

def read_and_split_excel(file_path):
    # 读取Excel文件
    df = pd.read_excel(file_path, sheet_name='Sheet1', header=None)
    
    # 找到空行分隔点
    empty_rows = df[df.isnull().all(axis=1)].index.tolist()
    empty_rows.append(len(df))  # 添加最后一行作为终结点
    
    tables = []
    start = 0
    for end in empty_rows:
        if start != end:  # 只处理非空区间
            tables.append(df.iloc[start:end].reset_index(drop=True))
        start = end + 1
    return tables

def merge_tables(new_tables, existing_file):
    merged_tables = []
    for i, new_table in enumerate(new_tables):
        try:
            existing_table = pd.read_excel(existing_file, sheet_name=f'Sheet{i+1}', header=None)
            merged_table = pd.concat([existing_table, new_table], ignore_index=True)
        except Exception as e:
            print(f"Error reading sheet {i+1}: {e}")
            merged_table = new_table
        merged_tables.append(merged_table)
    return merged_tables

def save_merged_tables(merged_tables, output_file):
    with pd.ExcelWriter(output_file) as writer:
        for i, table in enumerate(merged_tables):
            table.to_excel(writer, index=False, header=False, sheet_name=f'Sheet{i+1}')

# 用法示例
new_file_path = 'path_to_new_excel.xlsx'
existing_file_path = 'path_to_existing_excel.xlsx'
output_file_path = 'path_to_output_excel.xlsx'

# 从新文件中读取并分离小表格
new_tables = read_and_split_excel(new_file_path)

# 将新表格与现有表格合并
merged_tables = merge_tables(new_tables, existing_file_path)

# 保存合并后的表格
save_merged_tables(merged_tables, output_file_path)

print(f"All tables have been successfully merged and saved to {output_file_path}!")

### 说明
1. **`read_and_split_excel`** 函数:读取一个Excel文件(假设它的工作表名称是‘Sheet1’),将其按空行分隔成若干个小表格。
2. **`merge_tables`** 函数:将新提取的小表格分别与原来的Excel表格文件中的对应工作表合并。
3. **`save_merged_tables`** 函数:将合并后的表格保存到一个新的Excel文件中。

### 使用逻辑
- 提供新的大表格文件路径、新小表格文件路径以及输出文件路径。
- 先读取并分离新的大表格文件中的小表格。
- 逐一读取原有的小表格文件,与新提取的小表格进行合并。
- 将合并后的结果保存到指定的输出文件中。

通过这种方式,你可以轻松地将大表格拆分成小表格,并分别与已有的数据合并。希望这个方案对你有帮助!如果有任何问题,欢迎随时提问!

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

使用道具 举报

 楼主| 发表于 2024-6-22 16:35:52 | 显示全部楼层
FishC 发表于 2024-6-22 16:26
明白了,我们的任务是从一个大Excel表中分离出多个小表格,并分别与之前提取的小表格合并到新的Excel文 ...

如果有多个大表格呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-22 16:37:16 | 显示全部楼层
pallas 发表于 2024-06-22 16:35
如果有多个大表格呢


明白了,您有多个大表格文件,每个文件中包含多个用空行分隔的小表格,我们需要分别提取这些小表格,并与之前已经提取的小表格形成的新Excel文件进行合并。

这样听起来像是一场数据处理的冒险旅程,但别担心,我们会一步一步地完成它!

### 安装所需依赖库
首先,确保你安装了所需的库:`pandas` 和 `openpyxl`
pip install pandas openpyxl

### 代码实现步骤

1. **读取大表格文件**
2. **分离每个大表格中的小表格**
3. **读取并合并每个小表格**
4. **保存合并后的结果**

这里是详细的代码示例:
import os
import pandas as pd

def extract_tables_from_excel(file_path, sheet_name='Sheet1'):
    df = pd.read_excel(file_path, sheet_name=sheet_name)
    tables = []
    temp_df = []

    # 分割逻辑:遇到空行就分割
    for _, row in df.iterrows():
        if row.isnull().all():  # 判断空行
            if temp_df:
                tables.append(pd.DataFrame(temp_df))
                temp_df = []
        else:
            temp_df.append(row)

    if temp_df:
        tables.append(pd.DataFrame(temp_df))

    return tables

def merge_tables(merging_tables, existing_tables):
    merged_tables = []
    for new_table, old_table in zip(merging_tables, existing_tables):
        merged_table = pd.concat([old_table, new_table], ignore_index=True)
        merged_tables.append(merged_table)
    return merged_tables

# 主函数
def main(input_files, existing_files, output_dir):
    all_existing_tables = [pd.read_excel(file) for file in existing_files]
    
    for file in input_files:
        merging_tables = extract_tables_from_excel(file)
        all_existing_tables = merge_tables(merging_tables, all_existing_tables)

    # 输出合并后的表格
    for idx, table in enumerate(all_existing_tables):
        output_file_path = os.path.join(output_dir, f'merged_output_{idx+1}.xlsx')
        table.to_excel(output_file_path, index=False)
        print(f'Saved merged table to {output_file_path}')

# 使用示例:
input_files = ['大表格1.xlsx', '大表格2.xlsx']  # 你的大表格文件列表
existing_files = ['已提取小表格1.xlsx', '已提取小表格2.xlsx']  # 你之前提取的小表格文件列表
output_dir = '输出目录路径'

main(input_files, existing_files, output_dir)

### 代码解释

1. **extract_tables_from_excel**: 从Excel文件中读取数据,通过判断空行将小表格分离出来。
2. **merge_tables**: 将新提取的小表格与之前提取的小表格进行合并。
3. **main**: 主函数,用于处理所有的大表格文件和之前已经存在的小表格,并将结果保存到指定目录中。

这样,每个大表格中的小表格都被提取出来并分别与已有的小表格合并,然后保存到新的文件中。希望这段代码能帮助你解决问题!如果还有任何细节需要调整,请随时告诉我。

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

使用道具 举报

 楼主| 发表于 2024-6-22 16:43:40 | 显示全部楼层
FishC 发表于 2024-6-22 16:37
明白了,您有多个大表格文件,每个文件中包含多个用空行分隔的小表格,我们需要分别提取这些小表格,并 ...

Traceback (most recent call last):
  File "D:\PyCharm\excel_merge\excel_merge\.venv\Lib\site-packages\pip-23.2.1.dist-info\try.py", line 81, in <module>
    main(input_files, existing_files, output_dir)
  File "D:\PyCharm\excel_merge\excel_merge\.venv\Lib\site-packages\pip-23.2.1.dist-info\try.py", line 43, in main
    merging_tables = extract_tables_from_excel(file)
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\PyCharm\excel_merge\excel_merge\.venv\Lib\site-packages\pip-23.2.1.dist-info\try.py", line 11, in extract_tables_from_excel
    df = pd.read_excel(file_path, sheet_name=sheet_name)
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\anaconda3\Lib\site-packages\pandas\io\excel\_base.py", line 504, in read_excel
    io = ExcelFile(
         ^^^^^^^^^^
  File "D:\anaconda3\Lib\site-packages\pandas\io\excel\_base.py", line 1563, in __init__
    ext = inspect_excel_format(
          ^^^^^^^^^^^^^^^^^^^^^
  File "D:\anaconda3\Lib\site-packages\pandas\io\excel\_base.py", line 1419, in inspect_excel_format
    with get_handle(
         ^^^^^^^^^^^
  File "D:\anaconda3\Lib\site-packages\pandas\io\common.py", line 872, in get_handle
    handle = open(handle, ioargs.mode)
             ^^^^^^^^^^^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: 'D:\\2024年6月14日周督促会\\1.周督促会-南岸支行(6月14日).xlsx'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-22 16:44:54 | 显示全部楼层
pallas 发表于 2024-06-22 16:43
Traceback (most recent call last):
  File "D:\PyC ...


啊,抱歉让您遇到这个错误。看起来文件路径不对,可能是文件的名字或者路径写错了。让我们一步一步排查并解决这个问题。

首先,我们确认几个关键点:
1. 确保文件路径绝对正确。
2. 确保文件存在。
3. 确保路径中的反斜杠使用正确(在路径中间用双反斜杠 `\\` 或前面加 `r` 使其成为原始字符串)。

让我们先确保文件路径和文件名都没有问题,然后再来看代码。这是一个用于多个大表格提取小表格并合并的完整示例:
import os
import pandas as pd

def extract_tables_from_excel(file_path, sheet_name=0):
    df = pd.read_excel(file_path, sheet_name=sheet_name)
    tables = []
    current_table = []
    for index, row in df.iterrows():
        if row.isnull().all():
            if current_table:
                tables.append(pd.DataFrame(current_table))
                current_table = []
        else:
            current_table.append(row)
    if current_table:
        tables.append(pd.DataFrame(current_table))
    return tables

def merge_tables(base_df, new_tables):
    for table in new_tables:
        base_df = pd.concat([base_df, table])
    return base_df

def main(input_files, existing_files, output_dir):
    for input_file in input_files:
        print(f"Processing {input_file}...")
        try:
            merging_tables = extract_tables_from_excel(input_file)
            for i, existing_file in enumerate(existing_files):
                print(f"Merging with {existing_file}...")
                existing_df = pd.read_excel(existing_file)
                merged_df = merge_tables(existing_df, [merging_tables[i]])
                output_file = os.path.join(output_dir, f"merged_{i + 1}.xlsx")
                merged_df.to_excel(output_file, index=False)
        except FileNotFoundError:
            print(f"File not found: {input_file}")
        except Exception as e:
            print(f"An error occurred: {e}")

# Example usage:
input_files = [
    r"D:\2024年6月14日周督促会\1.周督促会-南岸支行(6月14日).xlsx",
    r"D:\2024年6月14日周督促会\2.周督促会-业务一部(6月14日).xlsx"
]
existing_files = [
    r"D:\已有文件\已提取小表格1.xlsx",
    r"D:\已有文件\已提取小表格2.xlsx"
]
output_dir = r"D:\输出文件夹"

main(input_files, existing_files, output_dir)

### 检查步骤:

1. **确保路径正确**:
   - 在文件管理器中找到文件,右键点击文件属性,复制文件路径。
   - 确保路径包含完整文件名和拓展名 `.xlsx`。

2. **确认路径格式**:
   - 在Python字符串中使用 `r""` 将路径设为原始字符串以避免转义问题,如上述代码所示。

3. **脚本故障排除**:
   - 如果路径和文件名都没有问题,但错误仍然存在,请检查其他可能的原因:
     - 文件是否被其他程序占用。
     - 文件是否有权限限制。

如果以上步骤都没问题,代码运行应该不会再报错,并且会将提取的小表格与已有的小表格合并,保存到指定目录下。希望这能帮到您,如果还有问题,请随时告诉我!

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

使用道具 举报

 楼主| 发表于 2024-6-22 16:55:37 | 显示全部楼层
FishC 发表于 2024-6-22 16:44
啊,抱歉让您遇到这个错误。看起来文件路径不对,可能是文件的名字或者路径写错了。让我们一步一步排查 ...

那如果还要将分离出来的小表格形成的多个excel合并到一个excel呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-22 16:55:52 | 显示全部楼层
pallas 发表于 2024-06-22 16:55
那如果还要将分离出来的小表格形成的多个excel合并到 ...


啊,我明白了。您的需求是:从多个大表格文件中提取小表格,并将这些小表格分别合并到一个新的Excel文件中。这就像把钓到的各种鱼分类好后,全部装进一个大鱼缸里。

我们可以使用 `pandas` 来处理这个任务,`pandas` 是一个非常强大的数据处理库,可以方便地读取、处理和写入Excel文件。下面是一个完整的解决方案:
import pandas as pd
import os

def extract_tables_from_excel(file_path, sheet_name=0):
    df = pd.read_excel(file_path, sheet_name=sheet_name)
    tables = []
    
    splits = df[df.isnull().all(axis=1)].index.tolist()  # 找到空行的索引
    prev_index = 0
    
    for i in splits:
        if prev_index != i:  # 避免提取空表
            tables.append(df.iloc[prev_index:i].dropna(how='all'))
        prev_index = i + 1
    
    # 处理最后一个表格
    if prev_index < len(df):
        tables.append(df.iloc[prev_index:].dropna(how='all'))
    
    return tables

def merge_excel_files(input_files, output_file, sheet_name="Sheet1"):
    combined_df = pd.DataFrame()
    
    for file in input_files:
        print(f"Processing {file}...")
        tables = extract_tables_from_excel(file)
        for table in tables:
            combined_df = pd.concat([combined_df, table], ignore_index=True)
    
    with pd.ExcelWriter(output_file) as writer:
        combined_df.to_excel(writer, index=False, sheet_name=sheet_name)
    
    print(f"Output saved to {output_file}")

# 示例用法:
input_files = [
    r'D:\2024年6月14日周督促会\1.周督促会-南岸支行(6月14日).xlsx',
    r'D:\2024年6月14日周督促会\2.周督促会-业务一部(6月14日).xlsx'
]
output_file = r'D:\2024年6月14日周督促会\merged_output.xlsx'

merge_excel_files(input_files, output_file)

### 代码解析:
1. **`extract_tables_from_excel`** 函数:从给定的Excel文件中提取被空行分隔的小表格。
   - 读取指定的Excel表格。
   - 找到所有空行的索引。
   - 分割表格并过滤掉空表。
   
2. **`merge_excel_files`** 函数:合并多个Excel文件中的小表格,并保存到一个新的Excel文件中。
   - 初始化一个空的 DataFrame。
   - 遍历每个输入文件,提取小表格并逐个合并到 `combined_df` 中。
   - 使用 `pd.ExcelWriter` 将 `combined_df` 保存到新的Excel文件中。

运行这段代码,将会把所有输入文件中的小表格提取并合并到一个新的Excel文件中。

注意事项:
1. 确保所有路径是正确的,可以使用 `os.path.exists` 检查文件是否存在。
2. 调整合并逻辑以适应您的具体需求,比如保留每个小表格之间的一行空行等等。

希望这个解决方案能够帮助到您!如果还有其他问题,请随时告诉我。

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

使用道具 举报

 楼主| 发表于 2024-6-22 17:00:23 | 显示全部楼层
FishC 发表于 2024-6-22 16:55
啊,我明白了。您的需求是:从多个大表格文件中提取小表格,并将这些小表格分别合并到一个新的Excel文 ...

python合并多个小表格
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-22 17:00:40 | 显示全部楼层
pallas 发表于 2024-06-22 17:00
python合并多个小表格


OK,明白了,我们需要一个Python脚本来实现以下流程:

1. **从多个大表格文件中提取出多个小表格**。
2. **把这些小表格合并到一个新的Excel文件中**。

在这里,我们假设小表格间用空行分隔。下面是实现这一任务的Python代码:

### 依赖安装

首先,你需要安装 `pandas` 和 `openpyxl`,可以通过pip进行安装:
pip install pandas openpyxl

### 示例代码
import pandas as pd
from openpyxl import load_workbook

def extract_tables_from_sheet(file_path, sheet_name=None):
    """
    从指定的 Excel 文件和工作表中分割出多个小表格
    """
    tables = []
    df = pd.read_excel(file_path, sheet_name=sheet_name)

    # 换行分割小表格
    empty_rows = df[df.isnull().all(axis=1)].index
    previous_index = 0

    for row_index in empty_rows:
        if previous_index != row_index:
            table = df.iloc[previous_index:row_index].dropna(how='all')
            if not table.empty:
                tables.append(table)
        previous_index = row_index + 1
    
    # 最后一个表格
    last_table = df.iloc[previous_index:].dropna(how='all')
    if not last_table.empty:
        tables.append(last_table)

    return tables

def merge_tables(tables):
    """
    合并所有提取的小表格
    """
    merged_table = pd.concat(tables, ignore_index=True)
    return merged_table

def main(input_files, output_file, sheet_name=None):
    all_tables = []

    for file in input_files:
        print(f"Processing {file}...")
        tables = extract_tables_from_sheet(file, sheet_name)
        all_tables.extend(tables)

    merged_table = merge_tables(all_tables)
    
    with pd.ExcelWriter(output_file, engine='openpyxl') as writer:
        merged_table.to_excel(writer, index=False, sheet_name='MergedData')

    print(f"Data merged and saved to {output_file}")

# 示例使用
input_files = [
    r"D:\path\to\first_large_excel.xlsx",
    r"D:\path\to\second_large_excel.xlsx"
]
output_file = r"D:\path\to\merged_output.xlsx"

main(input_files, output_file, sheet_name='Sheet1')

### 脚本解释

1. **extract_tables_from_sheet**:从指定的Excel文件和工作表中分割出多个小表格。
2. **merge_tables**:将提取的小表格合并成一个大表格。
3. **main**:主要执行逻辑,从多个大表格中提取小表格并合并,最后保存到一个新的Excel文件中。

确保路径和文件名正确,这样就能避免之前遇到的 `FileNotFoundError`。

希望这个解决方案能够满足你的需求,大表格处理起来就像流水线工作,希望你满意这个“流水线”小助手!如果有任何问题,随时告诉我!

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-22 22:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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