Openpyxl: TypeError - 将几列串联成每行一个单元格
Openpyxl: TypeError - Concatenation of several columns into one cell per row
我是 openpyxl 的新手,无法弄清楚我的错误是什么原因。我希望你能看到问题并告诉我要更改的内容!
我想做的事情:
我想连接每行 F 列到 M 列的单元格,并将连接后的值放入 E 列,如下所示。
(行并不总是从 F 列到 M 列填满,因为每行都是不同类型的信号。但我还没有为此添加 if 子句。这只是关于结构的信息。)
输入:
A B C D E F G H .. M
....... E1 90 2A .. 26
....... 0 80 F8 ..
输出:
A B C D E F G H .. M
....... E1902A..26
....... 080F8..
到目前为止我做了什么(代码):
theFile = openpyxl.load_workbook('T013.xlsx')
allSheetNames = theFile.sheetnames
print("All sheet names {} " .format(theFile.sheetnames))
sheet = theFile.active
#loop to concatenate
for i,row in enumerate(sheet.rows,1):
for column in range(6,13): #column F-M
sRow=str(i)
Ecell = sheet['E' + sRow]
ref = sheet["F:M"] #range of cells
for cell in range(ref):
values = str(cell.value) #collect data
Ecell.value = ''.join(values) # write values
我得到了哪种错误(完整的回溯):
C:\Users\..\Desktop\Practical Part\CAN Python>python ConcatenateHEX.py
All sheet names ['T013']
Traceback (most recent call last):
File "ConcatenateBIN.py", line 38, in <module>
for cell in range(ref):
TypeError: 'tuple' object cannot be interpreted as an integer
我已经尝试更改 'ref' 变量,但错误总是一样!
你能支持我吗?非常感谢!
编辑(2/10/2020):
此外,我想将该函数用于太多而无法写下的所有行。因此我想出了这个改变:
def concat_f_to_m():
for row_value in range(1, sheet.max_row+1):
values=[]
del values[:]
for row in sheet.iter_rows(min_col=6, max_col=14, min_row=row_value, max_row=row_value):
for cell in row:
if cell.value != None:
values.append(str(cell.value))
else:
del values[:]
break
#print(values)
sheet[f'E{row_value}'].value= ''.join(values)
concat_f_to_m()
我无法克服第 1 行到第 xyz 行的所有值都打印在 row_value 单元格中的问题(例如 row_value=13,第 1 行到第 13 行的所有值都连接在E13 单元格)。因此,我想遍历 row_value 以遍历所有行,但不知何故这是行不通的。您能否提示我如何通过在特定行加入值列表来连接所有行?谢谢!
使用 openpyxl
,我创建了一个小函数,可以一次为一行执行您想要的操作:
import openpyxl
theFile = openpyxl.load_workbook('T013.xlsx')
allSheetNames = theFile.sheetnames
print("All sheet names: {}" .format(theFile.sheetnames))
sheet = theFile.active
def concat_f_to_m(row_value):
values=[]
del values[:]
for row in sheet.iter_rows(min_col=6, max_col=13, min_row=row_value, max_row=row_value):
for cell in row:
if cell.value == None:
pass
else:
values.append(str(cell.value))
sheet[f'E{row_value}'].value= ''.join(values)
concat_f_to_m(1)
concat_f_to_m(2)
theFile.save('T013.xlsx')
输出:
我是 openpyxl 的新手,无法弄清楚我的错误是什么原因。我希望你能看到问题并告诉我要更改的内容!
我想做的事情: 我想连接每行 F 列到 M 列的单元格,并将连接后的值放入 E 列,如下所示。 (行并不总是从 F 列到 M 列填满,因为每行都是不同类型的信号。但我还没有为此添加 if 子句。这只是关于结构的信息。)
输入:
A B C D E F G H .. M
....... E1 90 2A .. 26
....... 0 80 F8 ..
输出:
A B C D E F G H .. M
....... E1902A..26
....... 080F8..
到目前为止我做了什么(代码):
theFile = openpyxl.load_workbook('T013.xlsx')
allSheetNames = theFile.sheetnames
print("All sheet names {} " .format(theFile.sheetnames))
sheet = theFile.active
#loop to concatenate
for i,row in enumerate(sheet.rows,1):
for column in range(6,13): #column F-M
sRow=str(i)
Ecell = sheet['E' + sRow]
ref = sheet["F:M"] #range of cells
for cell in range(ref):
values = str(cell.value) #collect data
Ecell.value = ''.join(values) # write values
我得到了哪种错误(完整的回溯):
C:\Users\..\Desktop\Practical Part\CAN Python>python ConcatenateHEX.py
All sheet names ['T013']
Traceback (most recent call last):
File "ConcatenateBIN.py", line 38, in <module>
for cell in range(ref):
TypeError: 'tuple' object cannot be interpreted as an integer
我已经尝试更改 'ref' 变量,但错误总是一样! 你能支持我吗?非常感谢!
编辑(2/10/2020): 此外,我想将该函数用于太多而无法写下的所有行。因此我想出了这个改变:
def concat_f_to_m():
for row_value in range(1, sheet.max_row+1):
values=[]
del values[:]
for row in sheet.iter_rows(min_col=6, max_col=14, min_row=row_value, max_row=row_value):
for cell in row:
if cell.value != None:
values.append(str(cell.value))
else:
del values[:]
break
#print(values)
sheet[f'E{row_value}'].value= ''.join(values)
concat_f_to_m()
我无法克服第 1 行到第 xyz 行的所有值都打印在 row_value 单元格中的问题(例如 row_value=13,第 1 行到第 13 行的所有值都连接在E13 单元格)。因此,我想遍历 row_value 以遍历所有行,但不知何故这是行不通的。您能否提示我如何通过在特定行加入值列表来连接所有行?谢谢!
使用 openpyxl
,我创建了一个小函数,可以一次为一行执行您想要的操作:
import openpyxl
theFile = openpyxl.load_workbook('T013.xlsx')
allSheetNames = theFile.sheetnames
print("All sheet names: {}" .format(theFile.sheetnames))
sheet = theFile.active
def concat_f_to_m(row_value):
values=[]
del values[:]
for row in sheet.iter_rows(min_col=6, max_col=13, min_row=row_value, max_row=row_value):
for cell in row:
if cell.value == None:
pass
else:
values.append(str(cell.value))
sheet[f'E{row_value}'].value= ''.join(values)
concat_f_to_m(1)
concat_f_to_m(2)
theFile.save('T013.xlsx')
输出: