Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 如何获得合并单元格中的值?_Excel_Python 2.7_Openpyxl - Fatal编程技术网

Excel 如何获得合并单元格中的值?

Excel 如何获得合并单元格中的值?,excel,python-2.7,openpyxl,Excel,Python 2.7,Openpyxl,我想使用openpyxl库获取合并单元格的值,该单元格的范围从D3到H3。 据我所知,大多数库从第一个单元本身读取数据。因此,合并的内容存在于其中,但当我阅读它时,我得到一个无值 以下是我的代码: wb=load\u工作簿(工作目录路径+'/outputs/report\u vap.xlsx') ws=wb。按名称获取工作表(“摘要”) suite_path=ws.cell('D3')。值 如果不是isinstance(套件路径,unicode): 值=unicode(套件路径) value=v

我想使用openpyxl库获取合并单元格的值,该单元格的范围从D3到H3。 据我所知,大多数库从第一个单元本身读取数据。因此,合并的内容存在于其中,但当我阅读它时,我得到一个无值

以下是我的代码:

wb=load\u工作簿(工作目录路径+'/outputs/report\u vap.xlsx')
ws=wb。按名称获取工作表(“摘要”)
suite_path=ws.cell('D3')。值
如果不是isinstance(套件路径,unicode):
值=unicode(套件路径)
value=value.encode('utf8')
打印“套件位置为”+值;
输出为:

套件位置为无
D3至H3单元格中的值为:

c:\users\xyz\desktop\abc\c++\events\comevents
我甚至尝试打印工作表中的所有值,但除整数值外,所有值均未返回任何值

以下是更改后的代码:

wb=load\u工作簿(工作目录路径+'/outputs/report\u vap.xlsx')
ws=wb。按名称获取工作表(“摘要”)
对于范围内的行索引(ws.get\u highest\u row()):
对于范围内的列索引(ws.get\u highest\u column()):
打印ws.cell(行=行索引,列=列索引).value
suite_path=ws.cell('A11')。值
打印套件路径
如果不是isinstance(套件路径,unicode):
值=unicode(套件路径)
value=value.encode('utf8')
打印“套件位置为”+值;
输出为:

无
没有一个
没有一个
没有一个
没有一个
没有一个
没有一个
没有一个
没有一个
没有一个
没有一个
没有一个
没有一个
没有一个
没有一个
没有一个
没有一个
没有一个
没有一个
没有一个
没有一个
没有一个
没有一个
没有一个
没有一个
没有一个
没有一个
没有一个
没有一个
没有一个
没有一个
没有一个
没有一个
没有一个
没有一个
没有一个
没有一个
没有一个
没有一个
没有一个
没有一个
没有一个
没有一个
没有一个
没有一个
没有一个
没有一个
没有一个
没有一个
没有一个
没有一个
没有一个
没有一个
1.
1.
没有一个
没有一个
没有一个
没有一个
没有一个
没有一个
9
1106
没有一个
没有一个
没有一个
没有一个
没有一个
没有一个
10
1107
没有一个
没有一个
没有一个
没有一个
没有一个
没有一个
没有一个
没有一个
没有一个
没有一个
套房位置为零
套房位置为零
12
Excel文件包含以下内容:

Project/module ID Project/module Build分析语言编译器源文件源文件
1Y1 HMDELITIT.VCXPROJ成功C++微软Visual Studio 2010(版本10)1 1
1x2 HTMLIDIT.VCXPROJ成功C++微软Visual Studio 2010(版本10)9 1106
总数101107

以下是我用于此操作的函数的近似值:

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
唯一一个真正危险的地方是我提取了要搜索的范围内的单元格列表。这将返回一个生成器,因此我将其强制转换为一个列表(因为中的
显然对生成器不起作用),它将生成一个包含单个列表元素的元组,我使用0索引提取该元组


出于我的目的,这已经足够快了——我通过迭代我想要测试的单元来使用它。如果您想使这一点更具性能,可能值得反转循环,将合并范围作为外部循环进行迭代,因此您只需进行一次转换

只要唯一的答案不正确(openpyxl中的_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
从openpyxl导入单元格作为xlcell,工作表
def在_范围内(边界:元组,单元格:xlcell)->bool:
列开始、行开始、列结束、行结束=边界
行=cell.row
如果行>=行开始,行=列开始,列任意:
对于合并在sheet.merged_单元格中的:
如果在_范围内(merged.bounds,单元格):
返回表.cell(merged.min\u行,merged.min\u列).value
返回单元格.value

对于当前的openpyxl版本(2.6.3),应该这样做。

我是根据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

如果无法访问原始文件,很难说得太多,但如果在任何地方使用超链接,可能会出现问题。openpyxl将删除除左上角单元格以外的合并区域中的所有单元格。很高兴看到有人能够使用API!:-)它是为了简单而开发的:
如果idx在sheet.merged_单元格中,则可以快速检查单元格是否已合并。我考虑过这一点,但是merged_cells属性会迭代所有合并的范围,提取单个单元格坐标,然后将它们合并在一起,这让我觉得相当昂贵。我基本上是从库中窃取了,嗯,重新调整了代码的用途,只是我只对每个合并范围进行了一次分解。是的,这是一个稍微不同的要求:想知道一个单元格是否已被合并。如果需要获取合并范围的“leader”,那么以某种方式将其与范围一起存储可能是有意义的。仍在等待更多关于该规范含义的信息。非常感谢您,您是championWork的完美之作,但从2.5版开始,merged_cell_ranges已被弃用,不过,请参阅,直到现在还没有发现替代品是如何工作的。
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
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