У меня есть куча электронных таблиц 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
.
XLConnect
? Вы пробовалиreadxl
илиxlsx
? - person MichaelChirico   schedule 29.10.2015xlsx
приводит к той же ошибке, что и XLConnect, из моих испытаний. Кроме того, для этой конкретной функции я предпочитаю XLConnect, так как он позволяет указать диапазон в форме E19, в отличие от xlsx, который может быть чем-то вродеrowRange = 5:5, colRange = 19:19
. Поскольку я собираюсь сделать это функцией, я хочу, чтобы пользователи могли передавать диапазоны для чтения, а XLConnect сделает это проще. - person John Tarr   schedule 29.10.2015autofitRow
иautofitCol
. - person joran   schedule 29.10.2015