根据指定格式(例如删除线)的单元格消除R中的Excel行?

时间:2019-02-27 17:29:05

标签: r excel openxlsx

当一种特殊的格式表示单元格(例如删除线)时,如何消除R中的Excel行? 我特别想消除第1列的单元格具有删除线格式(“ struckthrough”)的行。结合使用dplyr::join()函数和readxl::read_xlsx(),我还可以只处理第1列中包含删除线值的单元格向量。

看起来tidyxl软件包是行之有效的方法。将@Wimpel的答案应用于this SO question,关于检测删除线样式,到目前为止,我的理解是:

xlfile <- 'PATH TO .XLSX FILE' 
xlin <- xlsx_cells(xlfile)
formats <- tidyxl::xlsx_formats(xlfile)
cells   <- tidyxl::xlsx_cells(xlfile, sheets = 1)
strike <- which( formats$local$font$strike )
strike_cells <- cells[ cells$local_format_id %in% strike, 2 ]
nostrike_cells <- cells[ !cells$local_format_id %in% strike, 2 ]

xl_new <- anti_join(xlin, strike_cells)

但是,我还不知道如何从此处(下面的屏幕截图)到数据帧中没有被排除的单元格。 tidyxl dataframe after anti_join, so sans excluded cells

tidyxl vignette描述了该程序包有助于避免数据帧强制,但是在创建最终数据帧时遇到了麻烦。

也许有人使用tidyxl或其他openxlsx这样的R包有解决方案?

1 个答案:

答案 0 :(得分:0)

以下使用tidyxldplyr进行读取和处理,然后使用openxlsx写入Excel文件。

简而言之,tidyxl函数xlsx_formatsxlsx_cells用于使用删除线格式标识单元格,然后使用dplyr::pull()将其他行捕获为数字矢量(对象nostrike_rows_vector)。然后dplyr::slice()仅捕获nostrike_rows_vector指定的那些行。

library(tidyxl)
library(dplyr)
library(openxlsx)
xlfile <- 'PATH TO .XLSX FILE' 
xlin <- xlsx_cells(xlfile)
formats <- xlsx_formats(xlfile)
cells   <- xlsx_cells(xlfile, sheets = 1)
strike <- which( formats$local$font$strike )
strike_cells <- cells[ cells$local_format_id %in% strike, 2 ]
strike_rows <- inner_join(strike_cells, cells) %>%
    distinct(row) 
nostrike_rows_vector <- anti_join(cells, strike_rows) %>%
    distinct(row) %>%
    # Do not consider header row
    # Remember this code only works if the first row is a header row
    dplyr::filter(row != 1) %>%
    # tidyxl xlsx_formats and xlsx_cells functions treat row 1 as header
    mutate(row = row - 1) %>%
    pull(row)
xlout <- xlin %>% 
           slice(nostrike_rows_vector)
write.xlsx(xlout, "cleaned_excel_file.xlsx")

注释:

  1. 此R代码假定Excel文件具有要保留的标题行(即第1行指定列名)。
  2. 空白的单元格似乎也被视为具有删除线格式的单元格。这对我的用例来说很好,但是我建议进行抽查以确保获得期望的结果。