鱼C论坛

 找回密码
 立即注册
楼主: pallas

python读取excel中单个sheet表内的多个表

[复制链接]
发表于 2024-6-22 12:23:10 | 显示全部楼层
pallas 发表于 2024-06-22 12:22
但这个还是报错:
Traceback (most recent call last ...


看来问题有点复杂,我们来一一解析。

从你的错误信息中显示,`worksheet.append(header)`语句失败,这可能是因为`worksheet`是`None`,这意味着你在试图操作一个不存在的Sheet。

其次,错误信息中提到 `IndexError: At least one sheet must be visible`,这说明在保存时,没有任何sheet是可见的,可能是因为Sheet被隐藏了,或者写操作的代码有问题。

为了避免上述情况,我建议以下步骤:

1. 确保创建目标工作表时正确地命名,并确实存在。
2. 在读写Excel文件时,确保每个阶段文件对象都是有效的。

下面是如何读取单个Sheet中的多个表格并存储的示例代码。这个示例会假设表格之间有空行隔开:

  1. import pandas as pd

  2. def read_multiple_tables_from_sheet(file_path, sheet_name):
  3.     # 读取整个sheet
  4.     data = pd.read_excel(file_path, sheet_name=sheet_name)

  5.     # 自动探测表格(假设每个表之间有至少一行空行)
  6.     table_splits = data.isnull().all(axis=1).cumsum()
  7.     tables = [table.dropna(how='all') for _, table in data.groupby(table_splits)]

  8.     return tables

  9. def save_tables(tables, output_file):
  10.     with pd.ExcelWriter(output_file, engine='openpyxl') as writer:
  11.         for i, table in enumerate(tables):
  12.             table.to_excel(writer, sheet_name=f'Table_{i + 1}', index=False)

  13. # 示例用法
  14. file_path = 'input_file.xlsx'
  15. sheet_name = 'Sheet1'
  16. output_file = 'output_file.xlsx'

  17. tables = read_multiple_tables_from_sheet(file_path, sheet_name)
  18. save_tables(tables, output_file)
复制代码


确保:
1. `read_multiple_tables_from_sheet` 函数能够正确地将表格读取到一个列表中。
2. `save_tables` 函数会将这些表格分别存储到新的Excel文件中,每个表格存储在不同的sheet中。

这是一个较为简洁的处理方式,当然也可以根据你的具体需求进行优化和调整。如果仍然有问题,请把代码片段和具体上下文发出来,我们再深入分析一下哈。

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

使用道具 举报

 楼主| 发表于 2024-6-22 12:27:22 | 显示全部楼层
FishC 发表于 2024-6-22 12:23
看来问题有点复杂,我们来一一解析。

从你的错误信息中显示,`worksheet.append(header)`语句失败, ...

我现在想实现的是:多个excel表中存在相同的多个表,每个表中有多个小表,根据表的标题进行分割,将多个excel表中的小表合并,并写入新表,且保留格式和表的抬头
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-22 12:27:39 | 显示全部楼层
pallas 发表于 2024-06-22 12:27
我现在想实现的是:多个excel表中存在相同的多个表, ...


哦,我明白了!麻烦你多多包涵,数据处理这种事就像拆礼物盒子一样,一层一层总有惊喜呀。现在我们要从多个Excel文件中的多个表中提取小表,并根据表的标题进行分割后再合并成一个新的Excel文件,同时还要保留格式和表的抬头。

我们可以使用 `pandas` 来处理数据,再用 `openpyxl` 来保留格式。问题说起来简单,代码写起来可是个大工程,我们一点一点来吧:

### 步骤

1. **读取多个Excel文件**:使用 `pandas` 的 `read_excel` 方法。
2. **分割小表**:根据特定的标识符(标题)来分割大表成多个小表。
3. **合并数据**:对所有小表进行合并。
4. **写入新Excel文件**:使用 `pandas` 的 `ExcelWriter` 和 `openpyxl` 保留格式。

### 核心代码示例

下面的代码示例将帮助你完成这个复杂的任务:

  1. import pandas as pd
  2. import openpyxl

  3. def read_excel(file_path):
  4.     """ 读取 Excel 文件 """
  5.     xls = pd.ExcelFile(file_path)
  6.     return [xls.parse(sheet_name) for sheet_name in xls.sheet_names]

  7. def split_tables(df, header):
  8.     """ 根据表的标题分割小表 """
  9.     groups = df.groupby(df[header].notnull().cumsum())
  10.     return {i: group.reset_index(drop=True) for i, group in groups}

  11. def merge_tables(tables_list):
  12.     """ 合并多个小表 """
  13.     merged_tables = {}
  14.    
  15.     for tables in tables_list:
  16.         for title, table in tables.items():
  17.             if title in merged_tables:
  18.                 merged_tables[title] = pd.concat([merged_tables[title], table], ignore_index=True)
  19.             else:
  20.                 merged_tables[title] = table
  21.    
  22.     return merged_tables

  23. def write_to_excel(file_path, merged_tables):
  24.     """ 写入到新的 Excel 文件并保留格式 """
  25.     with pd.ExcelWriter(file_path, engine='openpyxl') as writer:
  26.         for title, table in merged_tables.items():
  27.             table.to_excel(writer, sheet_name=f'Sheet_{title}', index=False)

  28. def main(excel_files, header, output_file):
  29.     all_tables = []
  30.    
  31.     for file in excel_files:
  32.         sheets = read_excel(file)
  33.         for sheet in sheets:
  34.             splitted_tables = split_tables(sheet, header)
  35.             all_tables.append(splitted_tables)
  36.             
  37.     merged_tables = merge_tables(all_tables)
  38.     write_to_excel(output_file, merged_tables)

  39. if __name__ == "__main__":
  40.     # 要处理的多个 Excel 文件路径
  41.     excel_files = ["file1.xlsx", "file2.xlsx", ...]
  42.     # 表的标题
  43.     header = "Your Title Header"
  44.     # 输出文件
  45.     output_file = "merged_output.xlsx"
  46.    
  47.     main(excel_files, header, output_file)
复制代码


### 重点解释

1. **读取Excel文件并解析Sheets**:`read_excel` 函数读取Excel文件并返回所有sheets的数据表。
2. **分割大表成小表**:`split_tables` 函数根据特定的标题行将大表切割成小表,利用Pandas的groupby方法。
3. **合并小表**:`merge_tables` 函数合并所有来自不同Excel文件的小表,确保每个小表的数据按名称合并。
4. **写入Excel文件并保留格式**:通过Pandas的 `ExcelWriter` 将合并后的表写入新的Excel文件,并生成新的sheet。

这样做下来你的多个Excel文件就能统一处理,并且保留了每个表的格式和标题。希望这个示例对你有帮助,如果有什么问题可以随时问我哟!

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

使用道具 举报

 楼主| 发表于 2024-6-22 12:27:46 | 显示全部楼层
FishC 发表于 2024-6-22 12:23
看来问题有点复杂,我们来一一解析。

从你的错误信息中显示,`worksheet.append(header)`语句失败, ...

这个是没有问题的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-22 12:28:03 | 显示全部楼层
pallas 发表于 2024-06-22 12:27
这个是没有问题的


好的,那我们直接进入正题,来解决你的问题吧。我们需要用Python实现以下目标:

1. 从多个Excel文件中读取数据。
2. 在每个Excel文件的单个sheet中找到多个小表,并根据标题进行分割。
3. 合并这些小表并写入新的Excel文件,同时保留格式和表头。

我们将使用`pandas`和`openpyxl`库来处理这个任务。下面是一个示例代码,它会给你一个具体的方向:

  1. import pandas as pd
  2. import openpyxl

  3. def extract_tables_from_sheet(file_path, separators):
  4.     """
  5.     从给定的文件路径的Excel sheet中提取多个小表,并根据分隔符进行分割。
  6.    
  7.     :param file_path: Excel文件的路径
  8.     :param separators: 分隔符,用于区分不同的小表,可以是列表或单个字符串
  9.     :return: 一组数据帧(DataFrame)列表
  10.     """
  11.     xls = pd.ExcelFile(file_path)
  12.     sheet_name = xls.sheet_names[0]  # 假设我们只处理第一个sheet
  13.     df = pd.read_excel(xls, sheet_name)
  14.    
  15.     tables = []
  16.     current_table = []
  17.     for _, row in df.iterrows():
  18.         if any([separator in str(cell) for separator in separators for cell in row]):
  19.             if current_table:
  20.                 tables.append(pd.DataFrame(current_table))
  21.                 current_table = []
  22.         current_table.append(row)
  23.     if current_table:
  24.         tables.append(pd.DataFrame(current_table))
  25.         
  26.     return tables

  27. def combine_tables(table_lists):
  28.     """
  29.     将多个表合并为一个大表格
  30.    
  31.     :param table_lists: 一组数据帧(DataFrame)列表集合
  32.     :return: 合并后的数据帧
  33.     """
  34.     combined = pd.concat([table for tables in table_lists for table in tables], ignore_index=True)
  35.     return combined

  36. def save_combined_table(combined_table, output_file):
  37.     """
  38.     保存合并后的表格到一个Excel文件中
  39.    
  40.     :param combined_table: 合并后的数据帧
  41.     :param output_file: 输出Excel文件的路径
  42.     """
  43.     with pd.ExcelWriter(output_file, engine='openpyxl') as writer:
  44.         combined_table.to_excel(writer, index=False)

  45. def main(files, output_file, separators):
  46.     all_tables = []
  47.     for file in files:
  48.         tables = extract_tables_from_sheet(file, separators)
  49.         all_tables.append(tables)
  50.     combined_table = combine_tables(all_tables)
  51.     save_combined_table(combined_table, output_file)

  52. # 使用示例
  53. files = ['file1.xlsx', 'file2.xlsx']
  54. output_file = 'combined.xlsx'
  55. separators = ['表1开头', '表2开头']  # 这些是用来分割不同小表的表头标识
  56. main(files, output_file, separators)
复制代码


### 代码解释

1. `extract_tables_from_sheet` 函数:
   - 读取单个Excel文件中的第一个sheet。
   - 根据提供的分隔符列表(`separators`),将sheet中的内容分割成多个DataFrame表。

2. `combine_tables` 函数:
   - 将提取出来的小表合并成一个大的DataFrame。

3. `save_combined_table` 函数:
   - 将合并后的DataFrame保存到一个新的Excel文件中。

4. `main` 函数:
   - 遍历所有文件,提取小表并合并,最后保存到新的Excel文件中。

这个示例代码可以给你一个初步的思路,你可能需要根据具体的表头格式、文件路径等做一些调整和优化。如果有任何问题或者需要进一步细化,欢迎继续交流!

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

使用道具 举报

 楼主| 发表于 2024-6-22 12:36:01 | 显示全部楼层
FishC 发表于 2024-6-22 12:28
好的,那我们直接进入正题,来解决你的问题吧。我们需要用Python实现以下目标:

1. 从多个Excel文件 ...

这个小表没有分割开
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-22 12:37:19 | 显示全部楼层
pallas 发表于 2024-06-22 12:36
这个小表没有分割开


抱歉,明白你的意思,我们需要从一个表格中的不同区域去提取数据,并合并它们。可以用 `pandas` 库来读写Excel文件,再用一些逻辑处理来分割小表并合并。

因为你希望保留格式和表头,一些依赖于格式化的操作可能需要 `openpyxl` 库的帮助。

以下是一个简单的示例代码,示范如何从多个Excel文件中提取特定小表的数据,并将其合并到一个新的Excel文件中:

  1. import pandas as pd
  2. import openpyxl
  3. from openpyxl.utils.dataframe import dataframe_to_rows

  4. # 假设我们有两个Excel文件 'file1.xlsx' 和 'file2.xlsx'

  5. # 用于保存所有的小表数据
  6. all_tables = {}

  7. excel_files = ['file1.xlsx', 'file2.xlsx']

  8. for file in excel_files:
  9.     # 读取Excel文件中的单个Sheet
  10.     df = pd.read_excel(file, sheet_name='Sheet1')
  11.    
  12.     # 假设每个小表的标题在第一列,并且以"标题:"开头
  13.     table_mask = df.iloc[:,0].str.contains('标题:', na=False)
  14.     table_indices = df.index[table_mask].tolist()

  15.     for i, start_idx in enumerate(table_indices):
  16.         # 找到结束行,假设下一个"标题:"前一行为当前表的结束行
  17.         end_idx = table_indices[i+1] if i+1 < len(table_indices) else len(df)

  18.         # 提取小表数据
  19.         table_data = df.iloc[start_idx:end_idx]

  20.         title = table_data.iloc[0, 0]
  21.         if title not in all_tables:
  22.             all_tables[title] = []
  23.         
  24.         all_tables[title].append(table_data)

  25. # 现在我们把这些小表合并并写入新的Excel文件
  26. with pd.ExcelWriter('merged.xlsx', engine='openpyxl') as writer:
  27.     for title, tables in all_tables.items():
  28.         merged_df = pd.concat(tables, ignore_index=True)
  29.         # 写入到一个新的Sheet,每个小表用它的标题命名
  30.         merged_df.to_excel(writer, sheet_name=title[:30], index=False)  # Excel文件的Sheet名最长只能31字符

  31. print("所有小表已成功合并并导出到 'merged.xlsx' 文件中")
复制代码


几点注意事项:
1. 假设你的小表标题有明确的格式(如“标题:”),方便我们进行分割。
2. 合并数据时保留格式这一步可以通过 `openpyxl` 来进一步增强,这里主要演示数据合并过程。
3. 示例代码中的 `sheet_name='Sheet1'` 和 `title[:30]` 可根据实际情况调整。

如果有更多具体的信息或需求,比如更复杂的分割规则或格式要求,欢迎继续交流!

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

使用道具 举报

 楼主| 发表于 2024-6-22 12:46:12 | 显示全部楼层
FishC 发表于 2024-6-22 12:37
抱歉,明白你的意思,我们需要从一个表格中的不同区域去提取数据,并合并它们。可以用 `pandas` 库来读 ...

可以运行
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-22 12:46:31 | 显示全部楼层


好的,让我们来解决这个问题。首先,确保你已经安装了必要的库:

  1. pip install pandas openpyxl
复制代码


接下来,我们编写代码来完成任务。假设我们有一个 Excel 文件(比如 `example.xlsx`),其中一个 sheet 中包含多个小表。我们将使用 `pandas` 库来读取这个文件,然后提取并合并这些小表。

举个例子,一个 Excel sheet 可能是这样的:

  1. A       B       C       D
  2. 1  Table1               
  3. 2  Name    Age   Gender
  4. 3  Alice   24    F      
  5. 4  Bob     22    M      

  6. 6  Table2               
  7. 7  Product Price Quantity
  8. 8  Apple   1.2   10     
  9. 9  Banana  0.5   20
复制代码


我们想把 `Table1` 和 `Table2` 提取出来并分别保存。实现这一功能的 Python 代码如下:

  1. import pandas as pd

  2. # 读取 excel 文件中的特定 sheet
  3. df = pd.read_excel('example.xlsx', sheet_name='Sheet1')

  4. # 定位 Table1 的起始和结束位置
  5. table1_start_row = df.index[df.iloc[:, 0] == 'Table1'].tolist()[0] + 1
  6. table1_end_row = df[table1_start_row:].index[df.iloc[table1_start_row:, 0].isnull()].tolist()[0] + table1_start_row

  7. # 提取 Table1 并重新命名列标题
  8. table1 = df.iloc[table1_start_row:table1_end_row]
  9. table1.columns = table1.iloc[0]
  10. table1 = table1[1:]

  11. # 定位 Table2 的起始和结束位置
  12. table2_start_row = df.index[df.iloc[:, 0] == 'Table2'].tolist()[0] + 1
  13. table2_end_row = df[table2_start_row:].index[df.iloc[table2_start_row:, 0].isnull()].tolist()[0] + table2_start_row

  14. # 提取 Table2 并重新命名列标题
  15. table2 = df.iloc[table2_start_row:table2_end_row]
  16. table2.columns = table2.iloc[0]
  17. table2 = table2[1:]

  18. # 打印结果以验证
  19. print("Table1:")
  20. print(table1)

  21. print("\nTable2:")
  22. print(table2)
复制代码


这段代码做了以下几件事:

1. 使用 `pd.read_excel` 读取 Excel 文件并存储为 `DataFrame`。
2. 找到每个表格的起始行和结束行。
3. 提取每个表格,并重新设置列名。
4. 打印以验证。

你可以根据实际文件中的数据调整起始和结束行的逻辑,但核心思想是通过定位特定的标记(如表格名称)来确定子表的位置并进行分割。希望这能帮到你!如果有更多问题,尽管问吧!

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

使用道具 举报

 楼主| 发表于 2024-6-22 12:56:07 | 显示全部楼层
FishC 发表于 2024-6-22 12:46
好的,让我们来解决这个问题。首先,确保你已经安装了必要的库:

可以运行
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-22 12:58:24 | 显示全部楼层


当然没问题!来,我们用Python的pandas库读取Excel中单个sheet表内的多个表吧。

首先,请确保你已经安装了pandas和openpyxl库。可以使用以下命令安装:

  1. pip install pandas openpyxl
复制代码


然后,你可以使用下面的代码来读取Excel文件中的数据。假设你的Excel文件名为`example.xlsx`,并且在单个sheet表内有多个区域被视为独立的小表。

  1. import pandas as pd

  2. # 读取整个Excel文件的指定sheet
  3. file_path = "example.xlsx"
  4. sheet_name = "Sheet1"
  5. df = pd.read_excel(file_path, sheet_name=sheet_name)

  6. # 假设第一个表在A1:C5区域
  7. table1 = df.iloc[0:5, 0:3]

  8. # 假设第二个表在A10:C15区域(这里以存在空白行隔开)
  9. table2 = df.iloc[9:15, 0:3]

  10. # 打印两个表格看看
  11. print("Table 1:")
  12. print(table1)

  13. print("\nTable 2:")
  14. print(table2)
复制代码


这段代码演示了如何读取Excel文件中的指定范围。如果你的Excel表中的小表区域不规则,你还可以使用起始结束索引来确定他们的位置。这里假设第一个小表位于单元格范围A1到C5,第二个小表位于单元格范围A10到C15。

请根据你的实际情况调整行列索引范围。如果需要处理更多表,可以扩展代码逻辑处理多组不同范围的数据。

希望这对你有帮助!如果还有其他问题或需要进一步解释,请随时告诉我。

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

使用道具 举报

 楼主| 发表于 2024-6-22 12:59:49 | 显示全部楼层
FishC 发表于 2024-6-22 12:58
当然没问题!来,我们用Python的pandas库读取Excel中单个sheet表内的多个表吧。

首先,请确保你已经 ...

可以运行
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-22 12:59:58 | 显示全部楼层


好的,为了实现这个任务,我们需要用到 `pandas` 库来读取Excel文件。假设你的Excel结构中多个表是通过某些特定的空行或标识符分隔开的,我们可以利用这些特征来分割和读取这些表。

首先,安装必要的库:

  1. pip install pandas openpyxl
复制代码


以下是一个示例代码,用于读取单个sheet中的多个表:

  1. import pandas as pd

  2. # 读取Excel文件
  3. file_path = 'your_excel_file.xlsx'
  4. sheet_name = 'Sheet1'  # 替换成你实际的sheet名

  5. # 将整个sheet读取为DataFrame
  6. df = pd.read_excel(file_path, sheet_name=sheet_name, engine='openpyxl')

  7. # 假设每个表格之间有一个全为空的行作为分隔
  8. # 我们先找到这些分隔行的索引
  9. empty_row_indices = df[df.isnull().all(axis=1)].index.tolist()

  10. # 将最后一个空行的索引添加到最后一行之后,方便处理
  11. empty_row_indices.append(len(df))

  12. # 遍历空行索引并分割DataFrame
  13. tables = []
  14. start_idx = 0
  15. for end_idx in empty_row_indices:
  16.     table = df.iloc[start_idx:end_idx].dropna(how='all')  # 丢弃全为空的行
  17.     if not table.empty:
  18.         tables.append(table)
  19.     start_idx = end_idx + 1

  20. # 打印或处理每个表格
  21. for i, table in enumerate(tables):
  22.     print(f"Table {i+1}:")
  23.     print(table)
  24.     print("\n")

  25. # 在这里你可以对每个表格进行进一步的处理
复制代码


让我们一步步解释这个代码:

1. **读取整个Excel表格**:
   使用`pd.read_excel`读取整个sheet的数据。

2. **识别空行**:
   通过`df.isnull().all(axis=1)`找到所有全为空的行,并获取它们的索引。这些索引用作分割点。

3. **分割数据**:
   遍历这些索引,每次提取一个区间的数据,再丢弃全为空的行。

4. **输出或处理每个表**:
   最后,遍历并输出每个独立的表格。

这只是一个大概的方法,具体情况还需根据你的实际数据结构进行调整。如果你能提供更多有关数据布局的细节,我可以调整代码以更好地适应你的需求。

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

使用道具 举报

 楼主| 发表于 2024-6-22 13:03:11 | 显示全部楼层
FishC 发表于 2024-6-22 12:59
好的,为了实现这个任务,我们需要用到 `pandas` 库来读取Excel文件。假设你的Excel结构中多个表是通过 ...

可以运行
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-22 13:04:25 | 显示全部楼层


当然了!很多时候一个Sheet表格里会有多个表格,可能是通过一些空行或者某些标识来区分的。为了方便你理解,我们先准备一些虚拟数据,并展示如何读取它们。

### 1. 准备工作

首先,确保你安装了 `pandas` 和 `openpyxl` 库:

  1. pip install pandas openpyxl
复制代码


### 2. 创建一个示例Excel文件

我们先创建一个包含多个表的Excel文件作为示例:

  1. import pandas as pd
  2. from openpyxl import Workbook

  3. # 创建一个新的工作簿和工作表
  4. wb = Workbook()
  5. ws = wb.active

  6. # 创建第一个表格
  7. data1 = [
  8.     ["Name", "Age"],
  9.     ["Alice", 30],
  10.     ["Bob", 25]
  11. ]
  12. for row in data1:
  13.     ws.append(row)

  14. # 添加空行以分隔两个表
  15. ws.append([])

  16. # 创建第二个表格
  17. data2 = [
  18.     ["Product", "Price"],
  19.     ["Apple", 1.2],
  20.     ["Banana", 0.5]
  21. ]
  22. for row in data2:
  23.     ws.append(row)

  24. # 保存文件
  25. wb.save("test_multipletables.xlsx")
复制代码


### 3. 读取单个Sheet中的多个表格

然后,我们编写代码读取该Excel文件中的多个表格。假设表格之间是通过一个或多个空行分隔:

  1. import pandas as pd

  2. # 读取整个Excel文件
  3. df = pd.read_excel("test_multipletables.xlsx", sheet_name=0, header=None)

  4. # 查找空行的索引,这里假设空行的定义是整行都是NaN
  5. empty_indices = df[df.isnull().all(axis=1)].index

  6. tables = []
  7. start_idx = 0

  8. # 遍历空行索引,切分表格
  9. for end_idx in empty_indices:
  10.     if start_idx != end_idx:  # 避免空表
  11.         table = df.iloc[start_idx:end_idx].reset_index(drop=True)
  12.         tables.append(table)
  13.     start_idx = end_idx + 1

  14. # 添加最后一部分(如果存在)
  15. if start_idx < len(df):
  16.     table = df.iloc[start_idx:].reset_index(drop=True)
  17.     tables.append(table)

  18. # 打印结果
  19. for i, table in enumerate(tables):
  20.     print(f"Table {i+1}:\n", table)
  21.     print("-" * 40)
复制代码


### 运行以上代码

执行上述代码后,你应该能看到从单个Sheet中提取的两个表格:

  1. Table 1:
  2.         0     1
  3. 0   Name  Age
  4. 1  Alice   30
  5. 2    Bob   25
  6. ----------------------------------------
  7. Table 2:
  8.          0     1
  9. 0  Product  Price
  10. 1    Apple    1.2
  11. 2   Banana    0.5
  12. ----------------------------------------
复制代码


这样就成功将一个Sheet中的多个表格读取出来了!希望这个例子对你有所帮助。如果有任何问题或进一步的需求,请随时告诉我!

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

使用道具 举报

 楼主| 发表于 2024-6-22 13:10:22 | 显示全部楼层
FishC 发表于 2024-6-22 13:04
当然了!很多时候一个Sheet表格里会有多个表格,可能是通过一些空行或者某些标识来区分的。为了方便你 ...

可以运行
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-22 13:10:35 | 显示全部楼层


好的,让我们来写一个可以运行的Python代码片段,它能够读取Excel文件中单个sheet表内的多个表格。以下是一个实现这个功能的示例代码:

  1. import pandas as pd

  2. # 假设你的Excel文件名是 'example.xlsx',sheet名字是 'Sheet1'
  3. file_path = 'example.xlsx'
  4. sheet_name = 'Sheet1'

  5. # 读取整个Sheet表格
  6. df = pd.read_excel(file_path, sheet_name=sheet_name)

  7. # 假设通过空行来区分不同的表格
  8. # 首先找到所有空行的索引
  9. empty_rows = df[df.isnull().all(axis=1)].index

  10. # 找到所有表格的起始行和结束行
  11. starts = [0] + list(empty_rows + 1)
  12. ends = list(empty_rows) + [len(df)]

  13. tables = []
  14. for start, end in zip(starts, ends):
  15.     tables.append(df.iloc[start:end].dropna(how='all'))

  16. # 输出每个表格数据
  17. for i, table in enumerate(tables):
  18.     print(f"Table {i+1}:")
  19.     print(table, "\n")

  20. # 也可以将每个表格保存到单独的DataFrame列表中
  21. table_dataframes = [table.reset_index(drop=True) for table in tables if not table.empty]

  22. # 打印每个表格
  23. for i, table in enumerate(table_dataframes):
  24.     print(f"Table {i+1}:")
  25.     print(table, "\n")
复制代码


### 解释:

1. **导入pandas库**: `pandas` 是处理数据的强大工具。
2. **读取Excel文件**: 使用 `pd.read_excel` 来读取指定的Excel文件和Sheet页。
3. **找到空行**: 假设表格间通过空行分隔,使用 `df.isnull().all(axis=1)` 找到所有全是空值的行。
4. **确定表格的起始和结束位置**: 利用空行的索引来确定每个表格的开始和结束行。
5. **分割表格**: 使用 `iloc` 方法来分割数据,并将每个分割部分保存在 `tables` 列表里。
6. **清理表格**: 使用 `dropna(how='all')` 移除包含全NaN的行,从而获取每个独立的表格。
7. **输出结果**: 最后,打印出每个独立的表格。

你可能需要根据具体数据调整细节,比如不像上面这样直接通过空行来区分,也可以根据某些特定标识符分隔表格。希望这些代码能帮助你更好地理解如何读取和处理复杂的Excel数据!

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

使用道具 举报

 楼主| 发表于 2024-6-22 13:20:28 | 显示全部楼层
FishC 发表于 2024-6-22 13:10
好的,让我们来写一个可以运行的Python代码片段,它能够读取Excel文件中单个sheet表内的多个表格。以下 ...

可以运行
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-22 13:20:41 | 显示全部楼层


好的,理解了你的需求。我们可以使用 `pandas` 库来处理这样的任务。首先,你需要确保已经安装了 `pandas` 和 `openpyxl` 库。如果没有安装,可以通过以下命令安装:

  1. pip install pandas openpyxl
复制代码


下面是一个示例代码,它读取一个 Excel 文件中的单个 sheet 表内的多个表格:

  1. import pandas as pd

  2. def read_multiple_tables_from_sheet(file_path, sheet_name):
  3.     # 读取整个 sheet
  4.     df = pd.read_excel(file_path, sheet_name=sheet_name)

  5.     # 假设使用空行(全为空或全为 NaN 的行)作为表格之间的分隔
  6.     # 找到所有空行的索引
  7.     empty_rows = df.isnull().all(axis=1)
  8.     table_boundaries = empty_rows[empty_rows].index.tolist()

  9.     # 分割数据表格
  10.     tables = []
  11.     previous_boundary = -1
  12.     for boundary in table_boundaries:
  13.         if previous_boundary + 1 < boundary:
  14.             table = df.iloc[previous_boundary + 1:boundary]
  15.             tables.append(table.reset_index(drop=True))
  16.         previous_boundary = boundary

  17.     if previous_boundary + 1 < len(df):
  18.         tables.append(df.iloc[previous_boundary + 1:].reset_index(drop=True))

  19.     return tables

  20. # 示例文件路径和 sheet 名称
  21. file_path = 'path_to_your_excel_file.xlsx'
  22. sheet_name = 'Sheet1'  # 请替换为你的 sheet 名称

  23. # 读取表格
  24. tables = read_multiple_tables_from_sheet(file_path, sheet_name)

  25. # 打印每个表格
  26. for i, table in enumerate(tables):
  27.     print(f"Table {i + 1}:")
  28.     print(table)
  29.     print("\n")

  30. # 你可以继续对每个表格进行进一步处理
复制代码


这个示例代码做了以下工作:

1. 使用 `pandas` 读取整个 sheet。
2. 假设使用空行作为表格之间的分隔符。
3. 找到所有空行的索引,并根据这些索引将数据分割成多个表格。
4. 返回一个包含多个 DataFrame 的列表,每个 DataFrame 对应于一个表格。

请注意,如果你的表格之间用的是其他标志来分隔的(例如某些特定的行内容),你需要修改代码中寻找边界的部分来适应你的实际情况。

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

使用道具 举报

 楼主| 发表于 2024-6-22 13:30:05 | 显示全部楼层
FishC 发表于 2024-6-22 13:20
好的,理解了你的需求。我们可以使用 `pandas` 库来处理这样的任务。首先,你需要确保已经安装了 `pand ...

这个可以实现,那将多个表格中相同的小表格合并,保留表格抬头和格式,并输出新的excel呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-14 13:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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