鱼C论坛

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

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

[复制链接]
发表于 2024-6-22 13:32:24 | 显示全部楼层
pallas 发表于 2024-06-22 13:30
这个可以实现,那将多个表格中相同的小表格合并,保留 ...


好的,这个任务确实稍微复杂一些,但也是可以实现的。我们需要逐步完成以下几步:

1. 读取Excel文件中的所有小表格。
2. 合并这些小表格,保留表头(表格第一行)。
3. 将合并后的结果保存到一个新的Excel文件中。

下面是一个示例代码,实现上述步骤:
import pandas as pd

def read_excel_sheets(file_path, sheet_name):
    """
    读取 Excel 单个 sheet 中的多个表格,并返回这些表格的列表。
    """
    # 读取整个 sheet
    df = pd.read_excel(file_path, sheet_name=sheet_name)

    # 假设空白行分隔表格
    split_indices = df[df.isnull().all(axis=1)].index.tolist()
    split_indices = [-1] + split_indices + [len(df)]

    tables = []
    for i in range(len(split_indices) - 1):
        start_idx = split_indices[i] + 1
        end_idx = split_indices[i+1]
        table = df.iloc[start_idx:end_idx].reset_index(drop=True)
        if not table.empty:
            tables.append(table)
    
    return tables

def merge_tables(tables):
    """
    合并多个表格,保留表格抬头和格式。
    """
    merged_table = pd.concat(tables, ignore_index=True)
    return merged_table

def save_to_excel(df, output_path):
    """
    将 DataFrame 保存到 Excel 文件。
    """
    df.to_excel(output_path, index=False)

# 示例用法
file_path = 'your_excel_file.xlsx'
sheet_name = 'Sheet1'
output_path = 'merged_output.xlsx'

# 读取 Excel 中的表格
tables = read_excel_sheets(file_path, sheet_name)

# 合并表格
merged_table = merge_tables(tables)

# 保存到新的 Excel 文件
save_to_excel(merged_table, output_path)

print(f'已将合并后的表格保存到 {output_path}')

在这个示例中,我们做了以下事情:

1. 使用 `read_excel_sheets` 函数来读取单个 sheet 中的多个表格。这个函数假设空白行分隔了不同的表格,因此它会查找空白行的索引来分割表格。
2. 使用 `merge_tables` 函数来合并这些表格。这里我们只是简单地使用 `pd.concat` 来合并它们。
3. 使用 `save_to_excel` 函数将合并后的表格保存到一个新的 Excel 文件中。

请根据你的实际情况调整这个代码,比如如何识别表格边界,以及处理表格中的特殊格式。希望这个示例对你有帮助!

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

使用道具 举报

 楼主| 发表于 2024-6-22 13:39:05 | 显示全部楼层
FishC 发表于 2024-6-22 13:32
好的,这个任务确实稍微复杂一些,但也是可以实现的。我们需要逐步完成以下几步:

1. 读取Excel文件 ...

是合并多个excel表中的相同的小表格,且保留格式,共用表格抬头
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-22 13:39:20 | 显示全部楼层
pallas 发表于 2024-06-22 13:39
是合并多个excel表中的相同的小表格,且保留格式,共 ...


好的,我明白了,你是说需要从多个Excel文件中提取相同的小表格,然后合并成一个大的表格,并保留最上面的表格抬头和格式。

为了完成这个任务,我们可以使用 `pandas` 库来处理数据部分,使用 `openpyxl` 或 `xlsxwriter` 来处理格式部分。总体流程如下:

1. 读取多个 Excel 文件中的相同小表格。
2. 合并这些小表格。
3. 保留表格抬头和格式,并输出到新的 Excel 文件。

代码示例如下:

首先,确保你已经安装了所需的库:
pip install pandas openpyxl xlsxwriter

然后,你可以使用如下代码:
import pandas as pd
from openpyxl import load_workbook
from openpyxl.utils.dataframe import dataframe_to_rows
from openpyxl.styles import Font

def read_and_concat_sheets(file_list, sheet_name, start_row, end_row):
    all_data = []

    for file in file_list:
        try:
            # 使用 pandas 读取 Excel 文件的特定 sheet
            df = pd.read_excel(file, sheet_name=sheet_name, header=None)
            
            # 提取指定行的小表格
            small_table = df.iloc[start_row:end_row]
            all_data.append(small_table)
        except Exception as e:
            print(f"Error reading {file}: {e}")

    # 合并所有小表格
    merged_df = pd.concat(all_data, ignore_index=True)
    
    return merged_df

def save_to_excel_with_format(df, output_file, header):
    with pd.ExcelWriter(output_file, engine='openpyxl') as writer:
        df.to_excel(writer, index=False, header=False, startrow=1)
        
        workbook = writer.book
        sheet = writer.sheets['Sheet1']

        # 写入表格的抬头
        for col_num, value in enumerate(header):
            cell = sheet.cell(row=1, column=col_num + 1)
            cell.value = value
            
            # 设置粗体格式
            cell.font = Font(bold=True)

if __name__ == "__main__":
    file_list = ["file1.xlsx", "file2.xlsx", "file3.xlsx"]  # 这儿替换成你的文件列表
    sheet_name = "Sheet1"  # 替换成你的 sheet 名字
    start_row = 1  # 从第2行开始
    end_row = 5  # 到第5行结束(不包含第5行)

    header = ["Column1", "Column2", "Column3"]  # 替换成你的表头

    merged_df = read_and_concat_sheets(file_list, sheet_name, start_row, end_row)
    save_to_excel_with_format(merged_df, "merged_output.xlsx", header)

    print("合并完成,并已保存到 merged_output.xlsx")

在这个例子中:

1. `read_and_concat_sheets` 函数读取多个文件的特定 sheet,并提取指定行的小表格,然后合并所有小表格。
2. `save_to_excel_with_format` 函数将合并后的 DataFrame 保存到新的 Excel 文件中,并保留表头格式。

注意:根据你的实际情况,你可能需要调整 `start_row` 和 `end_row` 的值,以及表头 (`header`) 的内容。

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

使用道具 举报

 楼主| 发表于 2024-6-22 13:43:06 | 显示全部楼层
FishC 发表于 2024-6-22 13:39
好的,我明白了,你是说需要从多个Excel文件中提取相同的小表格,然后合并成一个大的表格,并保留最上 ...

那如果是是合并多个excel表中的所有相同的小表格,且保留格式,共用表格抬头,然后输出新的excel表呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-22 13:46:26 | 显示全部楼层
pallas 发表于 2024-06-22 13:43
那如果是是合并多个excel表中的所有相同的小表格,且 ...


明白了,你这是要实现一个Excel表格的大合并工程啊!不过没问题,Python可以搞定。这里我会用 `openpyxl` 和 `pandas` 两个库来完成这个任务。

### 准备工作:
1. 安装需要的库:
  
pip install pandas openpyxl

### 实现步骤:
1. 读取多个 Excel 文件,并提取相同的小表格。
2. 合并提取出的表格,确保保留表头和格式。
3. 输出到新的 Excel 文件中。

示例代码如下:
import pandas as pd
from openpyxl import load_workbook

# 假设你有多个excel文件,我们将其文件名存入一个列表
excel_files = ["file1.xlsx", "file2.xlsx", "file3.xlsx"]  
sheet_name = "Sheet1"  # 假设每个文件都有一个叫 'Sheet1' 的sheet

# 用于存储合并后的数据框
merged_df = pd.DataFrame()

for file in excel_files:
    # 读取每个文件中的特定sheet
    xls = pd.ExcelFile(file)
    
    # 读取特定的sheet中的表格
    df = pd.read_excel(xls, sheet_name=sheet_name)
    
    # 将数据追加到merged_df中
    merged_df = pd.concat([merged_df, df], ignore_index=True)

# 假设你希望保存的表格文件名为 "merged_output.xlsx"
output_file = "merged_output.xlsx"

# 将合并后的数据框保存到excel文件中
with pd.ExcelWriter(output_file, engine='openpyxl') as writer:
    merged_df.to_excel(writer, sheet_name='MergedSheet', index=False)

print("合并完成,新文件已保存为", output_file)

### 解释代码中的关键步骤:
1. **读取多个 Excel 文件**: 我们将所有的文件名存入 `excel_files` 列表中,然后我们遍历每个文件来读取它们。
2. **提取特定 Sheet 中的数据**: 在每个文件中,我们使用 Pandas 的 `pd.read_excel` 来读取特定的 sheet,并将其转换为 DataFrame。
3. **合并数据**: 使用 `pd.concat` 方法,将每次读取的小表格数据添加到合并后的 DataFrame `merged_df` 中。
4. **保存合并后的结果**: 最后,我们将 `merged_df` 保存为一个新的 Excel 文件。

### 进阶:
- 如果需要保留格式,可以使用 `openpyxl` 更精细地控制格式。
- 如果小表格在不同文件中的位置不一致,需要更复杂的逻辑,比如在特定单元格内寻找特定标题等。

希望这能帮到你,如果有其他问题,随时告诉我!

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

使用道具 举报

 楼主| 发表于 2024-6-22 13:46:38 | 显示全部楼层
FishC 发表于 2024-6-22 13:39
好的,我明白了,你是说需要从多个Excel文件中提取相同的小表格,然后合并成一个大的表格,并保留最上 ...

这一个相同的小表并没有合并,而且没有保留格式
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-22 13:48:57 | 显示全部楼层
pallas 发表于 2024-06-22 13:46
这一个相同的小表并没有合并,而且没有保留格式


明白了,你想要的是保留格式的合并,并且需要在新的Excel文件中生成一个合并后的表格。实现这个需求可以使用 `pandas` 和 `openpyxl` 库来处理数据和保持格式。

### 安装所需库
确保你已经安装了所需的库,可以使用 `pip` 指令进行安装:
pip install pandas openpyxl

### 步骤说明
1. **读取多个Excel文件**: 使用 pandas 读取多个Excel文件中的指定小表。
2. **合并数据**: 将这些小表格合并成一个DataFrame,同时保留格式。
3. **写入新Excel文件**: 使用 openpyxl 保留格式并产生合并后的Excel文件。

### 示例代码
以下是一个示例代码,你可以根据自己需求进行调整:
import pandas as pd
from openpyxl import load_workbook
from openpyxl.utils.dataframe import dataframe_to_rows
from openpyxl.styles import NamedStyle

# 这里假设你有多个Excel文件的路径
excel_files = ['file1.xlsx', 'file2.xlsx', 'file3.xlsx']
sheet_name = 'Sheet1' # 指定 sheet 名字,如果每个文件 sheet 名字不同,你可以放在字典里对应传入

# 存储所有读取的小表格
frames = []

# 加载格式
def copy_style(origin, target):
    for row_origin, row_target in zip(origin.iter_rows(), target.iter_rows()):
        for cell_origin, cell_target in zip(row_origin, row_target):
            cell_target._style = cell_origin._style

for file in excel_files:
    wb = load_workbook(filename=file)
    ws = wb[sheet_name]
    
    # 第一行作为表头
    data = ws.values
    columns = next(data)[0:] 

    df = pd.DataFrame(data, columns=columns)
    frames.append((df, ws))

# 合并 DataFrames
combined_df = pd.concat([frame[0] for frame in frames], ignore_index=True)

# 写入新的 excel 文件
new_wb = load_workbook(filename=file)
new_ws = new_wb.create_sheet(title="Combined_Sheet")
for r_idx, row in enumerate(dataframe_to_rows(combined_df, index=False, header=True), 1):
    for c_idx, value in enumerate(row, 1):
        new_ws.cell(row=r_idx, column=c_idx, value=value)

# 复制格式
copy_style(frames[0][1], new_ws)

new_wb.save("combined_output.xlsx")

print("合并成功并保存在 combined_output.xlsx 中啦!")

### 说明
1. **读取并解析**: 用 `pandas.read_excel` 读取数据,用 `load_workbook` 读取格式。
2. **合并数据**:利用 `pd.concat` 把数据合并到一起。
3. **保留格式**:通过 `copy_style` 函数将第一个小表的格式应用到合并后的数据上。

这样一来,你既实现了合并多个Excel文件中的相同小表,还保留了格式。希望这能让你的工作轻松一些!如果还有什么问题,尽管问~

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

使用道具 举报

 楼主| 发表于 2024-6-22 13:52:44 | 显示全部楼层
FishC 发表于 2024-6-22 13:48
明白了,你想要的是保留格式的合并,并且需要在新的Excel文件中生成一个合并后的表格。实现这个需求可 ...

Traceback (most recent call last):
  File "D:\PyCharm\excel_merge\excel_merge\.venv\Lib\site-packages\extract.py", line 29, in <module>
    wb = load_workbook(filename=file)
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\anaconda3\Lib\site-packages\openpyxl\reader\excel.py", line 317, in load_workbook
    reader.read()
  File "D:\anaconda3\Lib\site-packages\openpyxl\reader\excel.py", line 278, in read
    self.read_workbook()
  File "D:\anaconda3\Lib\site-packages\openpyxl\reader\excel.py", line 148, in read_workbook
    wb_part = _find_workbook_part(self.package)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\anaconda3\Lib\site-packages\openpyxl\reader\excel.py", line 113, in _find_workbook_part
    raise IOError("File contains no valid workbook part")
OSError: File contains no valid workbook part
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-22 13:53:02 | 显示全部楼层
pallas 发表于 2024-06-22 13:52
Traceback (most recent call last):
  File "D:\PyC ...


看起来你遇到了一个问题:`openpyxl`在读取Excel文件时报错了。这种情况通常是因为文件不是一个有效的Excel文件,可能是因为文件损坏或文件格式不对。我们可以先检查几个方面:

1. **确保文件完整且有效**:确认你的Excel文件能够正常打开,并且没有损坏。
2. **文件路径是否正确**:确保代码中提供的文件路径是正确的。

此外,如果你的Excel文件是较新的 `.xlsx` 格式,那么 `openpyxl` 应该能处理这些文件。如果你的文件是较旧的 Excel 格式(如 `.xls`),那么你需要用 `xlrd` 库来处理它们。

假设你的Excel文件都是有效且路径正确的 `.xlsx` 文件,下面是一个简化的示例,这个示例将多个Excel文件中的某个Sheet合并到一个新的Excel文件中的一个Sheet中,同时保留格式。

注意:使用 `openpyxl` 保留格式会比较复杂,因为 `openpyxl` 并没有直接提供复制单元格格式的功能。如果需要完整保留格式,可以考虑使用 `xlwings` 或者 `pandas` 与 `xlsxwriter` 配合。

### 使用 `openpyxl` 示例 (不完全保留格式)
from openpyxl import load_workbook, Workbook
import os

def merge_excel_files(file_list, sheet_name, output_file):
    new_wb = Workbook()
    new_ws = new_wb.active
    new_ws.title = sheet_name

    for file in file_list:
        print(f"Processing {file}...")
        wb = load_workbook(filename=file)
        if sheet_name in wb.sheetnames:
            ws = wb[sheet_name]
            
            for row in ws.iter_rows(values_only=True):
                new_ws.append(row)
    
    new_wb.save(output_file)
    print(f"New file saved as {output_file}")

# Example usage:
file_list = ['file1.xlsx', 'file2.xlsx', 'file3.xlsx']
output_file = 'merged.xlsx'
merge_excel_files(file_list, 'Sheet1', output_file)

### 使用 `xlwings` 示例 (完全保留格式)
import xlwings as xw
import os

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 = ['file1.xlsx', 'file2.xlsx', 'file3.xlsx']
output_file = 'merged.xlsx'
merge_excel_files(file_list, 'Sheet1', output_file)

这样你就可以逐个文件读取它们的相应Sheet,并把内容合并到最终的Excel文件的一个Sheet中,且保留格式。如果有更多的处理需求,`xlwings` 会提供更强大和灵活的功能。

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

使用道具 举报

 楼主| 发表于 2024-6-22 14:06:47 | 显示全部楼层
FishC 发表于 2024-6-22 13:53
看起来你遇到了一个问题:`openpyxl`在读取Excel文件时报错了。这种情况通常是因为文件不是一个有效的E ...

Traceback (most recent call last):
  File "D:\anaconda3\Lib\site-packages\xlwings\_xlwindows.py", line 719, in __call__
    return Book(xl=self.xl(name_or_index))
                   ^^^^^^^^^^^^^^^^^^^^^^
  File "D:\anaconda3\Lib\site-packages\xlwings\_xlwindows.py", line 223, in __call__
    v = self._inner(*args, **kwargs)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\anaconda3\Lib\site-packages\win32com\client\dynamic.py", line 226, in __call__
    self._oleobj_.Invoke(*allArgs), self._olerepr_.defaultDispatchName, None
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pywintypes.com_error: (-2147352567, '发生意外。', (0, None, None, None, 0, -2147352565), None)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "D:\anaconda3\Lib\site-packages\xlwings\main.py", line 5017, in open
    impl = self.impl(name)
           ^^^^^^^^^^^^^^^
  File "D:\anaconda3\Lib\site-packages\xlwings\_xlwindows.py", line 721, in __call__
    raise KeyError(name_or_index)
KeyError: '2.周督促会-业务一部(6月14日).xlsx'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "D:\PyCharm\excel_merge\excel_merge\.venv\Lib\site-packages\extract.py", line 43, in <module>
    merge_excel_files(file_list, 'Sheet1', output_file)
  File "D:\PyCharm\excel_merge\excel_merge\.venv\Lib\site-packages\extract.py", line 16, in merge_excel_files
    wb = xw.Book(file)
         ^^^^^^^^^^^^^
  File "D:\anaconda3\Lib\site-packages\xlwings\main.py", line 911, in __init__
    impl = app.books.open(
           ^^^^^^^^^^^^^^^
  File "D:\anaconda3\Lib\site-packages\xlwings\main.py", line 5024, in open
    impl = self.impl.open(
           ^^^^^^^^^^^^^^^
  File "D:\anaconda3\Lib\site-packages\xlwings\_xlwindows.py", line 752, in open
    xl=self.xl.Open(
       ^^^^^^^^^^^^^
  File "D:\anaconda3\Lib\site-packages\xlwings\_xlwindows.py", line 109, in __call__
    v = self.__method(*args, **kwargs)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "<COMObject <unknown>>", line 5, in Open
pywintypes.com_error: (-2147352567, '发生意外。', (0, 'Microsoft Excel', 'Excel 无法打开文件“2.周督促会-业务一部(6月14日).xlsx”,因为文件格式或文件扩展名无效。请确定文件未损坏,并且文件扩展名与文件的格式匹配。', 'xlmain11.chm', 0, -2146827284), None)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-22 14:07:00 | 显示全部楼层
pallas 发表于 2024-06-22 14:06
Traceback (most recent call last):
  File "D:\ana ...


看起来你在尝试使用`xlwings`打开一个Excel文件时遇到了`pywintypes.com_error`。这个错误通常表示Excel无法打开你的文件,原因可能有以下几种:

1. **文件名或路径问题**:文件名或路径中含有特殊字符,或路径不正确。
2. **文件损坏**:文件本身已经损坏或不是一个有效的Excel文件。
3. **文件扩展名不匹配**:文件的扩展名与其实际内容格式不匹配。

我们可以先来检查这些问题,并尝试以下解决方法:

### 检查文件名和路径

首先,确保文件路径和名称是正确的,并且不包含特殊字符。你可以用一些简单的测试代码来验证:
import os

file_path = r'D:\path\to\your\file\2.周督促会-业务一部(6月14日).xlsx'

if os.path.exists(file_path):
    print("文件存在")
else:
    print("文件不存在")

### 使用`openpyxl`库进行读取

尽管你报错时提及了`xlwings`库,我们也可以使用另一个更常用的库 `openpyxl`。首先尝试读取文件并确认文件是否有效:
from openpyxl import load_workbook

try:
    # 尝试加载工作簿
    workbook = load_workbook(filename=file_path)
    print("成功读取工作簿")
except Exception as e:
    print(f"读取文件时出错: {e}")

### 使用`xlwings`读取并处理文件

如果你确认文件存在且没有问题,再使用 `xlwings` 进行读取:
import xlwings as xw

file_path = r'D:\path\to\your\file\2.周督促会-业务一部(6月14日).xlsx'

try:
    app = xw.App(visible=False)
    wb = xw.Book(file_path)
    print("成功打开工作簿")
    # 进行后续操作...

    wb.close()
    app.quit()
except Exception as e:
    print(f"使用 xlwings 打开文件时出错: {e}")

### 小结

首先确认文件和路径的问题,然后尝试用'openpyxl'检查文件,如果顺利,再使用`xlwings`进行进一步的操作。这样一步一步排查,可以更有效地找到问题所在。希望这些方法可以帮到你!如果有任何进一步的问题,请随时提问。

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

使用道具 举报

 楼主| 发表于 2024-6-22 14:10:51 | 显示全部楼层
FishC 发表于 2024-6-22 14:07
看起来你在尝试使用`xlwings`打开一个Excel文件时遇到了`pywintypes.com_error`。这个错误通常表示Exce ...

openpyxl读取显示读取出错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-22 14:11:05 | 显示全部楼层
pallas 发表于 2024-06-22 14:10
openpyxl读取显示读取出错


了解了,你在尝试使用`openpyxl`读取一个Excel文件时遇到了一些困难。具体来说,错误信息指出"File contains no valid workbook part"以及文件格式或扩展名无效。这通常是因为文件可能已损坏、格式不匹配,或者文件并非真实的Excel文件。

不过,我们可以换个思路来解决你的问题,首先确保你正在处理的是一个有效的Excel文件,然后再尝试读取其中的多个表格。

假设你的Excel文件中确实包含多个表格(例如,每个表格之间有一定的空行或者其他标记),我们可以使用`pandas`库来处理这个问题。`pandas`支持读取Excel文件,并且相对来说处理起来会更灵活一些。

### 步骤:

1. **安装必要的库**:
  
pip install pandas openpyxl

2. **编写代码**:
    使用`pandas`读取Excel文件中的数据,然后根据特定的条件(如空行)将其拆分成多个表格。
import pandas as pd

def read_multiple_tables_from_sheet(file, sheet_name):
    # 读取整个sheet
    df = pd.read_excel(file, sheet_name=sheet_name)

    # 假设表格之间有空行分隔
    tables = []
    current_table = []

    for _, 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

# 使用方法
file = '你的文件路径.xlsx'
sheet_name = 'Sheet1'
tables = read_multiple_tables_from_sheet(file, sheet_name)

# 检查结果
for i, table in enumerate(tables):
    print(f"Table {i + 1}")
    print(table)

### 解释

- 我们使用`pandas.read_excel`来读取整个工作表。
- 然后,我们遍历每一行:如果发现整行都是空值,则认为找到一个表格的结束。
- 每找到一个完整的表格,就将其加入到`tables`列表中。
  
这样,你可以从单个工作表中提取出多个表格,希望这能帮助你处理你的需求。

如果你依然遇到问题,建议你检查下文件的完整性和格式,确保它是一个有效的Excel文件,并且符合预期的格式。

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

使用道具 举报

 楼主| 发表于 2024-6-22 14:13:09 | 显示全部楼层
FishC 发表于 2024-6-22 14:11
了解了,你在尝试使用`openpyxl`读取一个Excel文件时遇到了一些困难。具体来说,错误信息指出"File con ...

这个能运行,但之前的代码不能运行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-22 14:14:21 | 显示全部楼层
pallas 发表于 2024-06-22 14:13
这个能运行,但之前的代码不能运行


明白了,这里我们来解决你的问题:如何用`openpyxl`读取单个sheet表内的多个表格。

假设你有一个Excel文件,其中的一个sheet表(例如“Sheet1”)包含多个表格。表格之间可能有一些空行或空列,可以使用这些空行或空列来分隔各个表格。我们可以通过识别这些空行或空列来读取每个单独的表格。

以下是示例代码,展示如何用`openpyxl`读取单个sheet表内的多个表格:
import openpyxl

def read_excel(file_name, sheet_name):
    # 打开工作簿和指定的sheet
    wb = openpyxl.load_workbook(file_name)
    sheet = wb[sheet_name]

    data = []
    table = []

    # 遍历每一行
    for row in sheet.iter_rows(values_only=True):
        if not row or all(cell is None for cell in row):  # 如果这一行是空的
            if table:  # 如果当前收集到的表格非空
                data.append(table)  # 保存这个表格
                table = []  # 开始一个新的表格
        else:
            table.append(row)  # 添加行到当前表格

    if table:  # 确保最后一个表格不会丢失
        data.append(table)

    return data

file_name = 'your_excel_file.xlsx'
sheet_name = 'Sheet1'

tables = read_excel(file_name, sheet_name)
for i, table in enumerate(tables):
    print(f"Table {i + 1}:")
    for row in table:
        print(row)

### 主要步骤讲解:
1. **打开工作簿和指定的sheet**:
   - 使用`openpyxl.load_workbook`打开Excel文件,然后选择你想要读取的sheet。

2. **遍历每一行**:
   - 使用`iter_rows`方法遍历sheet中的每一行。`values_only=True`表示我们只需要行中每个单元格的值,而不是单元格对象。
  
3. **检查空行**:
   - 如果一行是空的(即`None`或者全是`None`),我们认为这是表格之间的分隔。如果当前收集到的表格非空,我们保存这个表格并开始新的表格。
  
4. **保存最后一个表格**:
   - 确保遍历完所有行后,最后一个表格没有丢失。

运行上述代码,它会打印出在单个sheet中找到的所有表格。希望这个能够帮助到你!如果你还有其他的错误或者需要进一步的帮助,请告诉我!

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

使用道具 举报

 楼主| 发表于 2024-6-22 14:17:31 | 显示全部楼层
FishC 发表于 2024-6-22 14:14
明白了,这里我们来解决你的问题:如何用`openpyxl`读取单个sheet表内的多个表格。

假设你有一个Exc ...

单独打开excel表没问题,但打开多个excel表时只能打开一个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-22 14:17:42 | 显示全部楼层
pallas 发表于 2024-06-22 14:17
单独打开excel表没问题,但打开多个excel表时只能打开 ...


多谢你的耐心,我们继续解决你的问题。

如果你尝试同时打开多个Excel文件,但发现只能打开一个文件,可能是由于代码中的逻辑或者实现方式存在问题。接下来我会为你提供一个示例代码,展示如何使用`openpyxl`读取单个Excel中多个sheet表格,并且确保可以同时打开多个Excel文件。

首先我们需要安装`openpyxl`库,可以通过pip命令来安装:
pip install openpyxl

然后我们来看一个示例代码:
import openpyxl

# 示例函数,读取单个 Excel 文件的所有 sheet 名称并打印
def read_excel_sheets(file_path):
    print(f"Reading file: {file_path}")
    workbook = openpyxl.load_workbook(file_path)
    sheet_names = workbook.sheetnames

    for sheet_name in sheet_names:
        print(f"Sheet name: {sheet_name}")
        sheet = workbook[sheet_name]

        # 输出表数据,假设数据从第一行第一列开始
        for row in sheet.iter_rows(min_row=1, max_col=sheet.max_column, max_row=sheet.max_row):
            print([cell.value for cell in row])

if __name__ == "__main__":
    file_paths = ["path/to/first_excel.xlsx", "path/to/second_excel.xlsx"]  # 替换为你的文件路径列表

    for file_path in file_paths:
        read_excel_sheets(file_path)

在这个示例中,我们定义了一个函数 `read_excel_sheets` 来读取单个 Excel 文件中的所有 sheet,并将其数据打印出来。然后在主程序中,通过遍历 `file_paths` 列表来一次性处理多个 Excel 文件。

请注意:
1. 确保 `file_paths` 列表中的文件路径是正确的。
2. 文件路径可以是绝对路径或相对路径。

希望这个示例能帮助你解决读取多个 Excel 文件的问题。如果你需要进一步的帮助或有其他问题,请随时告诉我!

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

使用道具 举报

 楼主| 发表于 2024-6-22 14:23:24 | 显示全部楼层
FishC 发表于 2024-6-22 14:17
多谢你的耐心,我们继续解决你的问题。

如果你尝试同时打开多个Excel文件,但发现只能打开一个文件 ...

只打得开一个excel
Traceback (most recent call last):
  File "D:\PyCharm\excel_merge\excel_merge\.venv\Lib\site-packages\extract.py", line 117, in <module>
    read_excel_sheets(file_path)
  File "D:\PyCharm\excel_merge\excel_merge\.venv\Lib\site-packages\extract.py", line 101, in read_excel_sheets
    workbook = openpyxl.load_workbook(file_path)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\anaconda3\Lib\site-packages\openpyxl\reader\excel.py", line 317, in load_workbook
    reader.read()
  File "D:\anaconda3\Lib\site-packages\openpyxl\reader\excel.py", line 278, in read
    self.read_workbook()
  File "D:\anaconda3\Lib\site-packages\openpyxl\reader\excel.py", line 148, in read_workbook
    wb_part = _find_workbook_part(self.package)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\anaconda3\Lib\site-packages\openpyxl\reader\excel.py", line 113, in _find_workbook_part
    raise IOError("File contains no valid workbook part")
OSError: File contains no valid workbook part
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-22 14:23:40 | 显示全部楼层
pallas 发表于 2024-06-22 14:23
只打得开一个excel
Traceback (most recent call las ...


好的,看来你的问题是关于一个异常:`OSError: File contains no valid workbook part`。这个错误通常意味着你尝试打开的文件不是一个有效的Excel文件,可能是文件损坏,或者你不小心传入了错误的文件路径。

让我们一步步地调试并解决这个问题。以下是一些建议和解决方案:

### 1. 确认文件路径是否正确
确保你正在读取的文件路径是正确的。例如,如果你在Windows上运行代码,请注意使用反斜杠(`\\`)或者raw字符串(在字符串前加一个`r`)。
import openpyxl

def read_excel_sheets(file_path):
    try:
        workbook = openpyxl.load_workbook(file_path)
        print("Workbook loaded successfully!")
    except IOError as e:
        print(f"Error opening file: {e}")

file_path = r"D:\Path\To\Your\Excel.xlsx"
read_excel_sheets(file_path)

### 2. 检查文件类型
确保你的文件确实是一个Excel文件(`.xlsx` 或 `.xlsm`),而不是其他文件类型。如果不确定,试着手动打开文件,看看能否正常打开。

### 3. 更新openpyxl版本
有时候库的某些版本会有bug,试着更新到最新版本的`openpyxl`:
pip install --upgrade openpyxl

### 4. 批量处理多个文件
如果你需要打开多个Excel文件,并且要确保每个文件都能成功打开,可以进行遍历处理并加以异常处理。

这里给出一个例子,批量读取多个Excel文件:
import openpyxl
import glob

def read_excel_sheets(file_path):
    try:
        workbook = openpyxl.load_workbook(file_path)
        print(f"Workbook '{file_path}' loaded successfully!")
    except IOError as e:
        print(f"Error opening file '{file_path}': {e}")

# 假设所有Excel文件都放在某个目录下
directory_path = r"D:\Path\To\Your\Directory"
excel_files = glob.glob(directory_path + "/*.xlsx")

for file_path in excel_files:
    read_excel_sheets(file_path)

这个脚本会遍历指定目录下的所有`.xlsx`文件,并尝试读取它们。如果文件无效或打不开,会打印相应的错误信息。

### 5. 处理单个sheet中的多个表格
如果你的Excel文件确实可以加载,但你面对的是在一个sheet中有多个表格的情况,你可能需要额外处理。这通常涉及解析数据,依据某些空行、空列来分割不同的表格:
import openpyxl

def read_excel_sheets(file_path):
    try:
        workbook = openpyxl.load_workbook(file_path)
        sheet = workbook.active
        data = []

        for row in sheet.iter_rows(values_only=True):
            if all(cell is None for cell in row):
                # 遇到全空行,可以视为表格之间的分隔
                if data:
                    print("New table:")
                    for line in data:
                        print(line)
                    data = []
            else:
                data.append(row)

        # 打印最后一个表格
        if data:
            print("New table:")
            for line in data:
                print(line)

    except IOError as e:
        print(f"Error opening file '{file_path}': {e}")

file_path = r"D:\Path\To\Your\Excel.xlsx"
read_excel_sheets(file_path)

希望这些方法可以帮助你解决问题,如果还有其他需要,欢迎继续交流!

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

使用道具 举报

发表于 2024-6-22 14:55:28 | 显示全部楼层
Excel中有一个表格对象叫“超级表”,超级表可起名并且识别,读取的话如果只在Windows环境下运用,那用xlwings好了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-15 21:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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