读取包含多个表格的 excel 表格,表格的标题具有非白色背景单元格颜色

Posted

技术标签:

【中文标题】读取包含多个表格的 excel 表格,表格的标题具有非白色背景单元格颜色【英文标题】:read excel sheet containing multiple tables, tables that have headers with a non white background cell color 【发布时间】:2020-01-19 02:47:56 【问题描述】:

我有一个 excelsheet,同一张表上有多个表格。 这些表具有不同的列号和不同的行号。 不过好在表头有背景色,表格内容是白色背景。

我想知道是否可以使用 xlrd 或其他一些包将这些表中的每一个作为单独的数据框读取。

现在想到的方法很长,可能并不理想。

例如:

import xlrd
book = xlrd.open_workbook("some.xls", formatting_info=True)
sheets = book.sheet_names()
for index, sh in enumerate(sheets):
    sheet = book.sheet_by_index(index)
    rows, cols = sheet.nrows, sheet.ncols
    for row in range(rows):
         for col in range(cols):
             xfx = sheet.cell_xf_index(row, col)
             xf = book.xf_list[xfx]
             bgx = xf.background.pattern_colour_index
             if bgx != 64:
                 Header_row = rownum

然后遍历这个 Header_row 并获取所有列值并将它们作为数据框列名。 然后继续解析第一列的行,直到遇到空白单元格或只有一个或两个非空单元格的行。

如您所见,这有点冗长,可能不是最佳方式。

感谢您在如何快速将所有故事提取为单独的数据框方面的帮助。

【问题讨论】:

尝试使用 pandas,在这里找到类似问题的答案:***.com/q/34184841/10003985 ***.com/a/17063653/5919632 【参考方案1】:

我认为你的方法是正确的。只是把它放在一些函数中以提高清晰度。

大概是这样的:

import xlrd
# from typing import Dict

book = xlrd.open_workbook("some.xls", formatting_info=True)

def is_header(sheet, row, col, exclude_color=64):
    xf_index = sheet.cell_xf_index(row, col)
    bg_color = book.xf_list[xf_index].background.pattern_colour_index
    return bg_color != 64

def parse_sheet(sheet):
    """Parse a sheet and retrieve data as dataframe"""
    column_headers = dict()  # type: Dict[int, str]

    for row in range(sheet.nrows):
        # We skip rows if first cell is not a header and has no value
        # TODO: Remove if that skips line 13 as well
        if not is_header(sheet, row, 0) and not sheet.cell_value(row, 0):
            column_headers.clear()
            continue

        # Otherwise, we will populate the list of headers for column
        # And we will parse other data
        c_headers = [c for c in range(sheet.ncols) if is_header(sheet, row, c)]
        if c_headers:
            for col in c_headers:
                column_headers[col] = sheet.cell_value(row, col)

        else:
            for col in range(sheet.ncols):
                value = sheet.cell_value(row, col)
                # TODO: Add data in the dataframe and use column headers

for index in range(book.sheet_names()):
    parse_sheet(book.sheet_by_index(index))

【讨论】:

以上是关于读取包含多个表格的 excel 表格,表格的标题具有非白色背景单元格颜色的主要内容,如果未能解决你的问题,请参考以下文章

从excel表格读取数据用Java代码实现批量上传写入数据库

如何将一张包含多个表格的 Excel 文件拆分为单独的数据框?

怎么把一个包含多个表格的excel文件转换成一个PDF文件?

C#WPF应用程序怎样读取excel表格数据?

Qt怎么把QTableWidget表格中的数据读取出来

Qt怎么把QTableWidget表格中的数据读取出来