XLConnect вызывает сбои в пустых ячейках

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

Не все рабочие листы или ячейки будут заполнены данными, но если ячейка пуста, XLConnect возвращает пустой фрейм данных, что приводит к ошибкам.

Для воспроизведения создайте файл xlsx в рабочем каталоге с именем testFile.xlsx. В Sheet1 введите все, что хотите, в ячейки A1 и B2, затем сохраните и закройте файл. Затем запустите приведенный ниже код.

# Load packages
library(XLConnect)

# Define positions to read
positionsToRead = c('A1', 'B2')

# This will work as A1 and B2 have data
data.frame(sapply(positionsToRead, function(x) readWorksheetFromFile("testFile.xlsx",  sheet='Sheet1', region=x, header=FALSE)))

# Change positions to read
positionsToRead = c('A1', 'B2', 'C3')

# This will fail, as C3 has no data
data.frame(sapply(positionsToRead, function(x) readWorksheetFromFile("testFile.xlsx",  sheet='Sheet1', region=x, header=FALSE)))

Первый вернется:

  A1.Col1 B2.Col1
1   data1   data2

Второй вернется:

Error in data.frame(A1 = list(Col1 = "data1"), B2 = list(Col1 = "data2"),  : 
  arguments imply differing number of rows: 1, 0

Есть ли способ заставить это работать? Я искал и обнаружил, что XLConnect имеет функцию SetMissing, но, похоже, она предназначена для определения таких строк, как blank до NA.


person John Tarr    schedule 28.10.2015    source источник
comment
Есть ли причина быть преданным XLConnect? Вы пробовали readxl или xlsx?   -  person MichaelChirico    schedule 29.10.2015
comment
Я открыт для альтернатив. Однако... readxl не позволяет мне читать определенные ячейки, если только я не пропустил функцию или параметр. xlsx приводит к той же ошибке, что и XLConnect, из моих испытаний. Кроме того, для этой конкретной функции я предпочитаю XLConnect, так как он позволяет указать диапазон в форме E19, в отличие от xlsx, который может быть чем-то вроде rowRange = 5:5, colRange = 19:19. Поскольку я собираюсь сделать это функцией, я хочу, чтобы пользователи могли передавать диапазоны для чтения, а XLConnect сделает это проще.   -  person John Tarr    schedule 29.10.2015
comment
Попробуйте аргументы autofitRow и autofitCol.   -  person joran    schedule 29.10.2015
comment
@joran - Не могу поверить, что потратил часы на то, что оказалось таким простым. Спасибо. Не могли бы вы или кто-то еще написать это как ответ, чтобы я мог пометить его как отвеченный?   -  person John Tarr    schedule 29.10.2015


Ответы (1)


Попробуй это:

sapply(positionsToRead, 
       function(x) readWorksheetFromFile("testFile.xlsx",  
                                         sheet='Sheet1', 
                                         region=x, 
                                         header=FALSE,
                                         autofitRow = FALSE,
                                         autofitCol = FALSE))
person joran    schedule 28.10.2015