如何从 R 中的 xlsx 文件中检测“删除线”样式

Posted

技术标签:

【中文标题】如何从 R 中的 xlsx 文件中检测“删除线”样式【英文标题】:How to detect "strikethrough" style from xlsx file in R 【发布时间】:2019-02-06 00:31:26 【问题描述】:

在R中导入excel文件时,我必须检查包含“删除线”格式的数据

我们有什么方法可以检测到它们吗? 欢迎使用 R 和 Python 方法

【问题讨论】:

我现在根本没有时间发布正确的答案,但看起来openpyxl 可能是你最好的选择,如果你可以在 Python 中做到这一点。 如果我能在你有时间 Jarak 时举出你的例子会很有帮助,因为我是 python 的新手。检查了其他帖子中的一种方法: if Cell.font.strikethrough == True: print('YES') ---假设我们在“ Cell ”中有删除线。但我不确定它是否执行检测功能,结果转-'str'对象没有属性'font' 【参考方案1】:

R-解决方案

tidyxl-package 可以帮助你...

示例 test.xlsx,数据位于第一张纸的 A1:A4 上。下面是excel截图:

library(tidyxl)

formats <- xlsx_formats( "temp.xlsx" )
cells <- xlsx_cells( "temp.xlsx" )

strike <- which( formats$local$font$strike )
cells[ cells$local_format_id %in% strike, 2 ]

# A tibble: 2 x 1
#   address
#   <chr>  
# 1 A2     
# 2 A4   

【讨论】:

谢谢你,Wimpel,这个包太棒了,直接解决了我的问题。找出删除线,将它们整行删除。 找不到 'tidyxl' 的点子。你是怎么安装的【参考方案2】:

我在下面展示了一个小示例程序,该程序使用 openpyxl 包过滤掉带有删除线的文本(我在 Python 3.7.0 的版本 2.5.6 上对其进行了测试)。很抱歉这么久才回复您。

import openpyxl as opx
from openpyxl.styles import Font


def ignore_strikethrough(cell):
    if cell.font.strike:
        return False
    else:
        return True


wb = opx.load_workbook('test.xlsx')
ws = wb.active
colA = ws['A']
fColA = filter(ignore_strikethrough, colA)
for i in fColA:
    print("Cell 01 has value 2".format(i.column, i.row, i.value))
    print(i.col_idx)

我在具有默认工作表的新工作簿上对其进行了测试,在 A 列的前五行中使用字母 a、b、c、d、e,其中我对 b 和 d 应用了删除线格式。该程序过滤掉列 A 中对字体应用删除线的单元格,然后打印剩余单元格、行和值。 col_idx 属性返回从 1 开始的数值列值。

【讨论】:

是否可以检查并找到针对单个单词的警示? @VineeshTP 我不确定(我离openpyxl专家还差得很远),但是快速浏览一下文档,我觉得它不像包提供的那样这种粒度级别。无论如何,在示例中使用上述脚本可能是值得的,以防万一它检测到给定单元格中使用删除线。 @Jark:只有当单元格值被完全删除时,我才能识别罢工。我意识到在阅读(wb = opx.load_workbook('test.xlsx')) 时,'openpyxl' 如果包含多种样式(富文本),则会丢失单元格格式。保留格式的任何想法? @VineeshTP 不知道对不起。从library's issue tracker 看来,这似乎超出了库的范围,至少部分原因是没有明确定义的方法来记录单元格各个部分的样式。【参考方案3】:

我在下面找到了一个方法:

'# 假设 1 - 10 的列有值 : A ,第 5 个 A 包含“删除线”

TEST_wb = load_workbook(filename = 'TEST.xlsx')
TEST_wb_s =  TEST_wb.active

for i in range(1, TEST_wb_s.max_row+1):
    ck_range_A = TEST_wb_s['A'+str(i)] 
    if ck_range_A.font.strikethrough == True:
        print('YES')
    else:
        print('NO') 

但是它没有告诉位置(这个例子是行号),当有很多结果时很难知道哪里包含“删除线”,我如何向量化语句的结果?

【讨论】:

是否有可能找到一个字符串包含一个单词的罢工?

以上是关于如何从 R 中的 xlsx 文件中检测“删除线”样式的主要内容,如果未能解决你的问题,请参考以下文章

如何在 R 中下载 .xlsx 文件并将数据加载到数据框中?

如何将R语言中的表格数据输出为Excel文件

如何在R中下载.xlsx文件并将数据加载到数据帧中?

使用write.xlsx将数据框写入R中的excel时如何以粗体打印顶行

为啥必须创建一个中间对象来引用 R 中的 xlsx 文件?

为啥自己的r语言中读不了xlsx文件