如何在Python(openpyxl)中检测和过滤包含删除线和未删除文本的单元格中带有删除线的文本/数字?

问题描述 投票:0回答:2

嗨,我正在尝试使用 openpyxl 使用 python 过滤 xlsx 文件中的删除文本/数字。我能够删除包含删除的文本和数字的单元格。但是,当一个单元格中有两个值时,一个是已敲击的,另一个是未敲击的,我无法做到这一点。我尝试先拆分然后再做,但做不到。 我一直用

cell.font.strikethrough
来检测。

我的代码:

import openpyxl as op
wb=op.load_workbook("Some_Workbook.xlsx")
ws=wb['Sheet1']

for row in ws.iter_rows(max_row=1,max_col=2):
    for cell in row:
        if cell.font.strike:
            print('struck',cell.value)
        else:
            print('unstruck',cell.value)

wb.close()

我使用上面的代码来查找单元格是否有被击中的值。

请帮忙。

python python-3.x excel openpyxl xlwings
2个回答
1
投票

XLWINGS 需要本地安装 Excel,因此意味着操作系统是 Windows 或 MacOS,并不是每个功能都必须在 macOS 上运行(我只能确保这在 win 上运行)。然而,XLWINGS 有一个字符类,允许您操作单元格中的单个字符,以便它可以执行您想要的操作。
首先,如果单元格的所有文本都带有删除线字体,则属性

cell.font.impl.xl.Strikethrough

True,如果细胞是正常细胞和删除线的混合体,则它是None,否则不存在。


下面的代码是显示该文本的删除线检测和删除的示例。该图像显示了使用此示例代码的输入单元格和后续输出。

import xlwings as xw


wb = xw.Book('foo1.xlsx')
ws = wb.sheets('Sheet1')

for cell in ws.range('A1:B3'):
    cell_coord = str(cell.address.replace('$', ''))
    print('Cell: ' + cell_coord + ', Cell value: ' + str(cell.value), end=', ')

    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 True:
            cur_text_value = cell.characters[char_position].text
            if cur_text_value == '':
                break
            else:
                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()
                else:
                    char_position += 1

    else:
        print(', Cell has NO strikethrough font.')

wb.save('foo2.xlsx')
wb.close()


0
投票

现在可以使用 openpyxl 来完成此操作。从版本 3.1.0 开始,您可以将

rich_text=True
传递给
load_workbook
函数以启用富文本解析。

以下代码可让您确定单元格的哪一部分有删除线:

import openpyxl
from openpyxl.cell.rich_text import CellRichText

wb = openpyxl.load_workbook("Some_Workbook.xlsx", rich_text=True)
ws = wb["Sheet1"]

for row in ws.iter_rows(max_row=1, max_col=2):
    for cell in row:
        if type(cell.value) == CellRichText:
            for text in cell.value:
                if text.font.strike:
                    print("struck", text)
                else:
                    print("unstruck", text)
        else:
            print("unstruck", cell.value)

对于您的示例,这将为您提供以下输出:

struck ABCD
unstruck  EFGH
struck 1234
unstruck  5678
© www.soinside.com 2019 - 2024. All rights reserved.