Извлечение ссылок из листа Excel с помощью R-пакета 'openxlsx'

Я работаю с листом Excel, в котором некоторые столбцы содержат гиперссылки, представленные в виде текста, который полностью отличается от фактического адреса, на который указывают гиперссылки. Я хочу использовать некоторый код R для изменения и подмножества листа Excel, но сохранить гиперссылки. Я думаю, что могу сделать это, извлекая эти гиперссылки в виде индексированного вектора символов, а затем повторно вводя их в новый документ Excel с помощью функций makeHyperlinkString() и writeFormula(). Но я не могу понять, как получить вектор самих ссылок.

В случае, если это имеет значение, я намерен выполнить все изменения и подмножества в версии data.frame листа Excel, а не в объекте книги.


person Slavatron    schedule 25.05.2018    source источник
comment
С openxlsx вы сможете loadWorkbook и использовать writeData для записи в определенные листы / ячейки, а затем saveWorkbook без изменения каких-либо других ячеек / листов.   -  person IceCreamToucan    schedule 25.05.2018


Ответы (1)


О, теперь я думаю, что понял твою проблему. Я думал, что есть только обычные гиперссылки, а не гиперссылки на Excel.

Я думаю, это может помочь вам получить вектор гиперссылок, хотя это немного беспорядочно.

library(openxlsx)
pathtofile =  "path to .xlsx file"

df1 <- read.xlsx(xlsxFile = pathtofile, 
                 sheet = 1, skipEmptyRows = FALSE, 
                 colNames = F, rowNames = F,
                startRow = 1)

## Sheet or Tabelle
Sheet = "Sheet" ## Or "Tabelle"

## Get Names of rows from Hyperlink column
rowIndex <- sub(x = df1[,1], pattern = paste0("(#'",Sheet,"\\d'!)"), replacement = "")

## Get the Sheet, where Hyperlinks are saved
SheetName <- regmatches(df1[,1], regexpr(text = df1[,1], pattern = paste0("(",Sheet,"\\d)")))
## Extract only the Sheet number
SheetIndex <- as.numeric(sub(x = SheetName, pattern = Sheet, replacement = ""))

## Get the row Indexes as numeric
RowIndexNum <- as.numeric(regmatches(rowIndex, regexpr(text = rowIndex, pattern = "\\d")))
## Get the column name as character
RowIndexName <- sub(x = rowIndex, pattern = "\\d", "")
## Create uppercase Letters
myLetters <- toupper(letters[1:26])
## Convert Row Name (character) to numeric (based on alphabetical order)
RowIndexNameNum <- match(RowIndexName, myLetters)

## If Hyperlinks only in 1 Sheet or several sheets
if (length(unique(SheetIndex)) == 1) {
  dfLinks <- read.xlsx(xlsxFile = pathtofile,
                       sheet = unique(SheetIndex), 
                       skipEmptyRows = FALSE, 
                       colNames = F, rowNames = F, 
                       rows = RowIndexNum[1]:tail(RowIndexNum,1),
                       cols = unique(RowIndexNameNum),
                       startRow = 1
                       );
} else {
  dfLinks <- data.frame()
  for (i in unique(SheetIndex)){
    dfTmp <- read.xlsx(xlsxFile = pathtofile,
              sheet = i, 
              skipEmptyRows = FALSE, 
              colNames = F, rowNames = F, 
              rows = RowIndexNum[1]:tail(RowIndexNum,1),
              cols = unique(RowIndexNameNum),
              startRow = 1)
    dfLinks <- rbind(dfLinks, dfTmp)
  }
}

dfLinks

Вот как выглядит мой файл Excel:

введите описание изображения здесь

person SeGa    schedule 25.05.2018
comment
Нет, когда я это делаю, data.frame содержит отображаемый текст, а не адрес, на который указывают ссылки. - person Slavatron; 25.05.2018
comment
Я отредактировал свой ответ, так как думаю, что неправильно понял вопрос. И, может быть, я все еще люблю .. :) - person SeGa; 28.05.2018