我如何获得合并单元格中的值?
我想要使用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;
输出是:Suite Location是None
单元格中D3到H3的值是:c:\ users \ xyz \ desktop \ abc \ c ++ \ events \ comevents
我甚至尝试打印表格中的所有值,但除了整数值之外,所有值都返回None。
以下是更改后的代码:
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项目/模块构build分析语言编译器源文件源文件
1_1 HTMLEdit.vcxproj成功C ++ Microsoft Visual Studio 2010(版本10.0)1 1
1_2 HTMLEdit.vcxproj成功C ++ Microsoft Visual Studio 2010(版本10.0)9 1106总计10 1107
只要唯一的答案是不正确的(openpyxl没有更多的cells_from_range函数),我build议替代方法。 我试过了,它适用于我的情况:
input是工作表和单元格。 但是,如果您需要,可以很容易地修改它以接受string单元格表示,如“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
下面是我使用的函数的一个近似值:
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
唯一真正危险的地方就是我提取范围内的单元格列表来search。 这将返回一个生成器,所以我把它转换成一个列表(因为in
不能在生成器上工作,显然),这产生了一个包含单个列表元素的元组,我使用0索引提取。
对于我的目的,这是足够快的 – 我通过迭代我想testing的单元格来使用它。 如果你想使这个更高性能,可能是值得反转循环,迭代合并范围作为你的外循环,所以你只需要做一次转换。
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