嗨,我正在尝试使用 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()
我使用上面的代码来查找单元格是否有被击中的值。
请帮忙。
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()
现在可以使用 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