如何修改此函数以删除excel文件中的所有删除线文本?

ehxuflar  于 2023-04-13  发布在  其他
关注(0)|答案(1)|浏览(174)

我在这个论坛的另一个问题上找到了一段代码,应该删除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
什么可以更改,以便删除删除线文本的其余部分?

o3imoua4

o3imoua41#

从今天开始回答您以前的评论;
如果一个单元格是受保护的,比如被锁定以进行编辑,而你尝试写或删除,Xlwings将返回错误,说明该单元格有编辑保护。
然而,这似乎可能是你的问题,因为你在后面的评论中的描述将适合这种情况。
基本上,当一个混合字体单元格被发现的代码,然后检查每个字符的字体在所有的文本在细胞(包括空格和回车等)。所以它从位置0的字符开始,然后是位置1,2等等,直到字符串的长度。如果一个非删除线字符被发现character positionincremented by 1,所以在下一次迭代the next character will be checked。然而,当一个删除线字符被发现时,该字符被立即删除,string length is reduced by 1character position is not incremented作为下一个要检查的字符现在占据了被删除字符的位置。
例如,代码检查字符串中的第30个字符,并确定它是删除线,因此删除该字符。如果由于某种原因该字符没有删除,在下一次迭代中,代码再次检查同一个字符,因为它仍然在字符位置30。然后代码将在每次迭代中继续检查并[尝试]删除相同位置的相同字符。在某个点上,循环将结束,因为字符串长度仍然每次减少1,最终将下降到30。在该点上,代码将移动到下一个单元格。
所以这会复制你所看到的,相同的字符被输出,而单元格中没有任何内容被删除。但是如前所述,如果Xlwings试图在受保护的单元格上删除,它会返回一个Traceback错误,声明如下:

Traceback (most recent call last):
...
"The cell or chart you're trying to change is on a protected sheet.\n\nTo make changes, click Unprotect Sheet in the Review tab (you might need a password).",

如果有受保护的单元格并且没有删除线字体,则不会有错误,因为代码不会尝试修改这些单元格。
-----------其他详细信息----------
我只是补充说,如果这是你的问题,你想禁用保护的处理工作表;
若要在执行字体检查之前移除工作表上的保护,请在工作表打开后添加以下行;

ws.api.Unprotect(Password='password')

并且一旦所有单元格都已被检查并且根据需要被更新,则将保护放回表上;

ws.api.Protect(Password='password')

相关问题