xlrd处理Excel,包括合并单元格

import xlrd


def get_data_by_sheet_name(file_path, sheet_name):
    tecs_excel_content = xlrd.open_workbook(file_path)
    table = tecs_excel_content.sheet_by_name(sheet_name)
    merged_cells = get_merged_cells(table.merged_cells)
    return get_sheet_data(table, merged_cells)


def parse_cell(cell_contents, cell_type):
    if cell_type == xlrd.XL_CELL_NUMBER:
        # GH5394 - Excel 'numbers' are always floats
        val = int(cell_contents)
        if val == cell_contents:
            cell_contents = str(val)
        else:
            cell_contents = str(cell_contents)
    elif cell_type == xlrd.XL_CELL_BOOLEAN:
        cell_contents = str(bool(cell_contents))
    return cell_contents


def get_merged_cells(merged_cells):
    all_cells = []
    for item in merged_cells:
        for i in range(item[0], item[1]):
            for j in range(item[2], item[3]):
                all_cells.append((i, j))
    return all_cells


def get_sheet_data(table, merged_cells):
    row_n = table.nrows
    sheet_data = []
    if row_n < 1:
        return sheet_data
    col_title = table.row_values(0)
    for i in range(1, row_n):
        if not table.cell_value(i, 0) and (i, 0) in merged_cells:
            for j, col_name in enumerate(col_title):
                cell_v = parse_cell(table.cell_value(i, j),
                                    table.cell_type(i, j))
                if sheet_data and ((i, j) not in merged_cells or cell_v):
                    last_value = sheet_data[-1][col_name]
                    if isinstance(last_value, list):
                        sheet_data[-1][col_name].append(cell_v)
                    else:
                        sheet_data[-1][col_name] = [last_value, cell_v]
        else:
            row_values = [parse_cell(value, type)
                          for value, type in
                          zip(table.row_values(i), table.row_types(i))]
            row_data = dict(zip(col_title, row_values))
            sheet_data.append(row_data)
    return sheet_data

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pchaoda

感谢支持~~~~~~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值