1

当特定类型的格式表征单元格(例如,删除线)时,如何消除 R 中的 Excel 行?我特别想消除第 1 列中的单元格具有删除线格式(“删除线”)的行。将dplyr::join()函数与 结合使用readxl::read_xlsx(),我还可以仅使用第 1 列中包含删除线值的单元格向量。

看起来tidyxl包裹是要走的路。将@Wimpel 的答案应用于这个 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)

但是,我还不知道如何从那里(下面的屏幕截图)到没有排除单元格的数据框。 anti_join 之后的 tidyxl 数据帧,因此没有排除单元格

tidyxl 插图描述了包有助于避免数据帧强制,但我在创建最终数据帧时遇到了麻烦。

也许有人有使用tidyxl或其他 R 包的解决方案,例如openxlsx

4

1 回答 1

1

以下用于读取+处理然后tidyxl用于写入Excel文件。 dplyropenxlsx

简而言之,tidyxl函数xlsx_formatsxlsx_cells用于识别具有删除线格式的单元格,然后将其他行捕获为带有dplyr::pull()(object 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. 空白单元格似乎也被视为带有删除线格式的单元格。这对我的用例来说很好,但我建议进行抽查以确保获得预期的结果。
于 2019-02-27T18:30:25.940 回答