如何在合并的单元格中显示值

时间:2014-05-09 10:30:38

标签: excel python-2.7 openpyxl

我希望使用openpyxl库获取范围从D3到H3的合并单元格的值。 根据我的理解,大多数图书馆从第一个细胞本身读取数据。因此合并的内容存在于其中,但是当我阅读它时,我得到一个无值。

以下是我的代码:

wb = load_workbook(work_directory_path+'/outputs/report_vap.xlsx')
ws = wb.get_sheet_by_name("Summary")
suite_path = ws.cell('D3').value
if not isinstance(suite_path, unicode):
    value=unicode(suite_path)
value=value.encode('utf8')
print "Suite Location is "+value;

输出是: 套房位置为无

D3到H3的单元格中的值是: C:\用户\ XYZ \桌面\ ABC \ C ++ \事件\ comevents

我甚至尝试打印工作表中的所有值,但除整数值外,所有值都返回无。

以下是更改的代码:

wb = load_workbook(work_directory_path+'/outputs/report_vap.xlsx')
ws = wb.get_sheet_by_name("Summary")
for row_index in range (ws.get_highest_row()):
    for col_index in range (ws.get_highest_column()):
        print ws.cell(row=row_index, column=col_index).value
suite_path = ws.cell('A11').value
print suite_path
if not isinstance(suite_path, unicode):
   value=unicode(suite_path)
value=value.encode('utf8')
print "Suite Location is "+value;

输出结果为:

无 没有 没有 没有 没有 没有 没有 没有 没有 没有 没有 没有 没有 无

无 没有 没有 没有 没有 没有 没有 没有 没有 没有 没有 没有 没有 没有 没有 没有 无

无 没有 没有 没有 没有 没有 没有 没有 没有 没有 没有 没有 没有 没有 没有 没有 没有 没有 1 1 没有 没有 没有 没有 没有 没有 9 1106 没有 没有 没有 没有 没有 没有 10 1107 没有 没有 没有 没有 没有 没有 没有 没有 没有 没有 套房位置为无 套房位置为无 12

Excel文件包含以下内容

项目/模块ID项目/模块构建分析语言编译器源文件源文件

1_1 HTMLEdit.vcxproj Success C ++ Microsoft Visual Studio 2010(10.0版)1 1

1_2 HTMLEdit.vcxproj Success C ++ Microsoft Visual Studio 2010(版本10.0)9 1106 总计10 1107

5 个答案:

答案 0 :(得分:10)

一旦唯一的答案不正确(openpyxl中没有更多的cell_from_range函数),我建议另类的方法。我试过,它适用于我的情况:

输入是工作表和单元格。但如果需要,可以很容易地修改它以接受像'A3'这样的字符串单元格表示。

import openpyxl


def getValueWithMergeLookup(sheet, cell):
    idx = cell.coordinate
    for range_ in sheet.merged_cell_ranges:
        merged_cells = list(openpyxl.utils.rows_from_range(range_))
        for row in merged_cells:
            if idx in row:
                # If this is a merged cell,
                # return  the first cell of the merge range
                return sheet.cell(merged_cells[0][0]).value

    return sheet.cell(idx).value

答案 1 :(得分:4)

我是根据 Openpyxl 的最新源代码编写的:

def getMergedCellVal(sheet, cell):
    rng = [s for s in sheet.merged_cells.ranges if cell.coordinate in s]
    return sheet.cell(rng[0].min_row, rng[0].min_col).value if len(rng)!=0 else cell.value

答案 2 :(得分:2)

这是我用于此的函数的近似值:

from openpyxl.cell import get_column_letter
from openpyxl.worksheet import cells_from_range

def getValueWithMergeLookup(sheet, col, row):
    idx = '{0}{1}'.format(get_column_letter(col), row)
    for range_ in sheet.merged_cell_ranges:
        cells = list(cells_from_range(range_))[0]
        if idx in cells:
            # If this is a merged cell, you can look up the value 
            # in the first cell of the merge range
            return sheet.cell(cells[0]).value

    return sheet.cell(row=row, column=col).value

唯一真正冒险的地方是我提取要搜索的范围内的单元格列表。返回一个生成器,所以我将它转换为一个列表(因为in显然不适用于生成器),这会生成一个包含单个列表元素的元组,我使用0索引提取它。

就我的目的而言,这足够快 - 我通过迭代我想要测试的单元格来使用它。如果你想让它更高效,那么反转循环可能是值得的,将合并范围迭代为外循环,所以你只需要进行一次转换。

答案 3 :(得分:1)

from openpyxl import cell as xlcell, worksheet
def within_range(bounds: tuple, cell: xlcell) -> bool:
    column_start, row_start, column_end, row_end = bounds
    row = cell.row
    if row >= row_start and row <= row_end:
        column = cell.column
        if column >= column_start and column <= column_end:
            return True
    return False

def get_value_merged(sheet: worksheet, cell: xlcell) -> any:
    for merged in sheet.merged_cells:
        if within_range(merged.bounds, cell):
            return sheet.cell(merged.min_row, merged.min_col).value
    return cell.value

应对当前的openpyxl版本(2.6.3)

答案 4 :(得分:-1)

from openpyxl import * 
from openpyxl.utils import *

    def getValueWithMergeLookup(sheet, cell):
        if cell == None or sheet == None:
            return None
        for irange in sheet.merged_cell_ranges:
            min_col, min_row, max_col, max_row =range_boundaries(irange)
            if cell.row in range(min_row,max_row+1) and column_index_from_string(cell.column) in range(min_col,max_col+1):
                return sheet.cell(None,min_row,min_col).value
        return cell.value