我在这个论坛的另一个问题上找到了一段代码,应该删除Excel文件中的删除线文本,但是当我试图使用与我想要它做的对应的版本时,它删除了一些混合字体单元格中的删除线文本,所有完全删除的单元格,但没有删除混合字体单元格中的删除线文本。
如上所述,我尝试了在这个论坛上找到的功能,更改为我想要的用途:
def process_eCRF_file(file_path, outdir):
if "eCRF" not in file_path:
return
wb = xw.Book(file_path)
for ws in wb.sheets:
for cell in ws.used_range:
cell_coord = str(cell.address.replace('$', ''))
print('Cell: ' + cell_coord + ', Cell value: ' + str(cell.value), end=', ')
# check if cell is merged
if cell.merge_cells:
merge_area = cell.merge_area
has_strikethrough = False
for merge_cell in merge_area:
merge_cell_st = merge_cell.font.impl.xl.Strikethrough
if merge_cell_st:
has_strikethrough = True
ws.range(merge_area.address).api.UnMerge()
break
if has_strikethrough:
continue
# check for strikethrough formatting in current cell
st = cell.font.impl.xl.Strikethrough
print('ST value: ' + str(st), end=' ')
if st:
print(', Cell has strikethrough font.')
cell.clear()
elif st is None:
print(', Cell has mixed font.')
num_chars = len(cell.value)
print(cell_coord + ' Text length: ' + str(num_chars) + ' characters.')
print("Individual character font strikethrough?")
char_position = 0
while char_position < num_chars:
cur_text_value = cell.characters[char_position].text
print("'" + cur_text_value + "'", end=' ')
char_is_st_font = cell.characters[char_position].font.impl.xl.Strikethrough
print(char_is_st_font)
if char_is_st_font:
cell.characters[char_position].api.Delete()
num_chars -= 1 # decrease the text length by 1
else:
char_position += 1
else:
print(', Cell has NO strikethrough font.')
wb.save(os.path.join(outdir, 'processed_' + os.path.basename(file_path)))
wb.close()
但是当我使用它时,我得到了这个:
输入Excel tab input
输出Excel tab output
什么可以更改,以便删除删除线文本的其余部分?
1条答案
按热度按时间o3imoua41#
从今天开始回答您以前的评论;
如果一个单元格是受保护的,比如被锁定以进行编辑,而你尝试写或删除,Xlwings将返回错误,说明该单元格有编辑保护。
然而,这似乎可能是你的问题,因为你在后面的评论中的描述将适合这种情况。
基本上,当一个混合字体单元格被发现的代码,然后检查每个字符的字体在所有的文本在细胞(包括空格和回车等)。所以它从位置0的字符开始,然后是位置1,2等等,直到字符串的长度。如果一个非删除线字符被发现
character position
是incremented by 1
,所以在下一次迭代the next character will be checked
。然而,当一个删除线字符被发现时,该字符被立即删除,string length is reduced by 1
。character position is not incremented
作为下一个要检查的字符现在占据了被删除字符的位置。例如,代码检查字符串中的第30个字符,并确定它是删除线,因此删除该字符。如果由于某种原因该字符没有删除,在下一次迭代中,代码再次检查同一个字符,因为它仍然在字符位置30。然后代码将在每次迭代中继续检查并[尝试]删除相同位置的相同字符。在某个点上,循环将结束,因为字符串长度仍然每次减少1,最终将下降到30。在该点上,代码将移动到下一个单元格。
所以这会复制你所看到的,相同的字符被输出,而单元格中没有任何内容被删除。但是如前所述,如果Xlwings试图在受保护的单元格上删除,它会返回一个Traceback错误,声明如下:
如果有受保护的单元格并且没有删除线字体,则不会有错误,因为代码不会尝试修改这些单元格。
-----------其他详细信息----------
我只是补充说,如果这是你的问题,你想禁用保护的处理工作表;
若要在执行字体检查之前移除工作表上的保护,请在工作表打开后添加以下行;
并且一旦所有单元格都已被检查并且根据需要被更新,则将保护放回表上;