我正在尝试使用xlrd读取Excel的合并单元格。
我的Excel :(请注意,第一列合并了三行)
A B C
+---+---+----+
1 | 2 | 0 | 30 |
+ +---+----+
2 | | 1 | 20 |
+ +---+----+
3 | | 5 | 52 |
+---+---+----+
我想在本例中将第一列的第三行读为等于2,但它返回''
。您是否知道如何获得合并单元格的值?
我的代码:
all_data = [[]]
excel = xlrd.open_workbook(excel_dir+ excel_file)
sheet_0 = excel.sheet_by_index(0) # Open the first tab
for row_index in range(sheet_0.nrows):
row= ""
for col_index in range(sheet_0.ncols):
value = sheet_0.cell(rowx=row_index,colx=col_index).value
row += "{0} ".format(value)
split_row = row.split()
all_data.append(split_row)
我得到了什么:
'2', '0', '30'
'1', '20'
'5', '52'
我想得到什么:
'2', '0', '30'
'2', '1', '20'
'2', '5', '52'
答案 0 :(得分:9)
我刚试过这个,它似乎适用于你的样本数据:
all_data = []
excel = xlrd.open_workbook(excel_dir+ excel_file)
sheet_0 = excel.sheet_by_index(0) # Open the first tab
prev_row = [None for i in range(sheet_0.ncols)]
for row_index in range(sheet_0.nrows):
row= []
for col_index in range(sheet_0.ncols):
value = sheet_0.cell(rowx=row_index,colx=col_index).value
if len(value) == 0:
value = prev_row[col_index]
row.append(value)
prev_row = row
all_data.append(row)
返回
[['2', '0', '30'], ['2', '1', '20'], ['2', '5', '52']]
它跟踪前一行的值,并在当前行的相应值为空时使用它们。
请注意,上面的代码不会检查给定单元格是否实际上是合并的单元格集的一部分,因此在单元格确实为空的情况下,它可能会复制先前的值。不过,它可能会有所帮助。
其他信息:
我随后找到了一个文档页面,其中讨论了一个merged_cells
属性,可用于确定包含在各种合并单元格范围内的单元格。文档说它是版本0.6.1和#34;中的新版本,但是当我尝试将它与pip
安装的xlrd-0.9.3一起使用时,我收到了错误
NotImplementedError:formatting_info = True尚未实现
我并不是特别倾向于开始追逐不同版本的xlrd来测试merged_cells
功能,但如果上述代码不足以满足您的需求并且遇到您可能会感兴趣与formatting_info=True
一样的错误。
答案 1 :(得分:3)
您也可以尝试使用pandas中提供的fillna方法 https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.fillna.html
excel = pd.read_excel(dir+filename,header=1)
excel[ColName]=excel[ColName].fillna(method='ffill')
这应该用前一个值
替换单元格的值答案 2 :(得分:0)
对于那些正在寻求处理合并单元格的人,OP会询问其方式,而不会覆盖未合并的空单元格。
基于OP的代码以及@gordthompson的答案和@stavinsky的注释提供的其他信息,以下代码将适用于excel文件(xls,xlsx),它将作为数据帧读取excel文件的第一张纸。对于每个合并的单元格,它将按照原始张贴者的要求在该合并的单元格所代表的所有单元格上复制该合并的单元格内容。请注意,只有在打开时通过了'formatting_info'参数,xlrd的merged_cell功能才适用于'xls'文件工作簿。
import pandas as pd
filepath = excel_dir+ excel_file
if excel_file.endswith('xlsx'):
excel = pd.ExcelFile(xlrd.open_workbook(filepath), engine='xlrd')
elif excel_file.endswith('xls'):
excel = pd.ExcelFile(xlrd.open_workbook(filepath, formatting_info=True), engine='xlrd')
else:
print("don't yet know how to handle other excel file formats")
sheet_0 = excel.sheet_by_index(0) # Open the first tab
df = xls.parse(0, header=None) #read the first tab as a datframe
for e in sheet_0.merged_cells:
rl,rh,cl,ch = e
print e
base_value = sheet1.cell_value(rl, cl)
print base_value
df.iloc[rl:rh,cl:ch] = base_value
答案 3 :(得分:0)
我在不存在的情况下尝试了以前的解决方案,但是以下方法对我有用:
sheet = book.sheet_by_index(0)
all_data = []
for row_index in range(sheet.nrows):
row = []
for col_index in range(sheet.ncols):
valor = sheet.cell(row_index,col_index).value
if valor == '':
for crange in sheet.merged_cells:
rlo, rhi, clo, chi = crange
if rlo <= row_index and row_index < rhi and clo <= col_index and col_index < chi:
valor = sheet.cell(rlo, clo).value
break
row.append(valor)
all_data.append(row)
print(all_data)
我希望它将来能为某人服务
答案 4 :(得分:0)
使用XLRD合并的单元格
ExcelFile = pd.read_excel("Excel_File.xlsx")
xl = xlrd.open_workbook("Excel_File.xlsx")
FirstSheet = xl.sheet_by_index(0)
for crange in FirstSheet.merged_cells:
rlo, rhi,clo, chi = crange
for rowx in range(rlo,rhi):
for colx in range(clo,chi):
value = FirstSheet.cell(rowx,colx).value
if len(value) == 0:
ExcelFile.iloc[rowx-1,colx] = FirstSheet.cell(rlo,clo).value
答案 5 :(得分:-1)
openpyxl.worksheet.merged_cell_ranges
这个函数你可以得到像['A1:M1', 'B22:B27']
这样的数组,告诉你要合并的单元格。
openpyxl.worksheet.merged_cells
此功能显示单元格是否已合并