我希望使用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
答案 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