Проблемы с использованием пакета xlsx для вставки данных из R в Excel

Я пытаюсь создать новую книгу Excel из R, чтобы сохранить несколько небольших наборов данных с помощью пакета xlsx. По какой-то причине он работал нормально, но я не могу сделать это снова.

Код для создания новой книги

library("xlsx")
library("xlsxjars")
library("rJava")

file <- "marca_imei.xlsx"
wb <- loadWorkbook(file)

# The error:
# Error in .jcall("RJavaTools", "Ljava/lang/Object;", "invokeMethod", cl,  : 
#  java.lang.IllegalArgumentException: Your InputStream was neither an OLE2 stream, nor an OOXML stream

Я искал ответ, но, похоже, у людей возникает такая же ошибка при импорте данных из Excel. Я попробовал то, что было рекомендовано, но это не сработало. Вот несколько ссылок для будущих искателей:

sessionInfo():

locale:
[1] LC_COLLATE=Spanish_Spain.1252  LC_CTYPE=Spanish_Spain.1252    LC_MONETARY=Spanish_Spain.1252
[4] LC_NUMERIC=C                   LC_TIME=Spanish_Spain.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] xlsx_0.5.5             xlsxjars_0.6.0         RJDBC_0.2-3            rJava_0.9-6           
 [5] DBI_0.2-7              slidifyLibraries_0.3.1 slidify_0.4            knitr_1.5             
 [9] devtools_1.4.1         scales_0.2.3           ggplot2_0.9.3.1        data.table_1.8.11     
[13] reshape2_1.2.2        

loaded via a namespace (and not attached):
 [1] colorspace_1.2-4   dichromat_2.0-0    digest_0.6.4       evaluate_0.5.1     formatR_0.10      
 [6] grid_3.0.2         gtable_0.1.2       httr_0.2           labeling_0.2       markdown_0.6.3    
[11] MASS_7.3-29        memoise_0.1        munsell_0.4.2      parallel_3.0.2     plyr_1.8          
[16] proto_0.3-10       RColorBrewer_1.0-5 RCurl_1.95-4.1     stringr_0.6.2      tools_3.0.2       
[21] whisker_0.3-2      yaml_2.1.10     

person marbel    schedule 27.02.2014    source источник
comment
Ни в коем случае не ответ, но я предпочитаю пакет XLConnect.   -  person stanekam    schedule 27.02.2014
comment
Что ж, спасибо за комментарий. Пакет посмотрю.   -  person marbel    schedule 27.02.2014
comment
Чтобы исключить проблему с файлом xlsx, не могли бы вы попробовать wb <- createWorkbook()? Если вы получаете сообщение об ошибке, это указывает на проблему с вашей установкой.   -  person flodel    schedule 28.02.2014
comment
Это сработало. Спасибо за попытку в любом случае. > wb <- createWorkbook() > wb [1] "Java-Object{Name: /xl/workbook.xml - Content Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml}"   -  person marbel    schedule 28.02.2014
comment
В итоге я использовал пакет XLConnect, он отлично работает и очень хорошо документирован.   -  person marbel    schedule 10.10.2014


Ответы (2)


Мартин,

Я считаю, что проблема в том, что файл, который вы читаете, не является допустимым файлом .xlsx. Вот пример кода для воспроизведения вашей проблемы. Вы также можете изменить пример, чтобы решить проблему. В примере используется примерный набор данных из Интернета (расположение камеры контроля скорости в Балтиморе :-)).

По сути, строка 16 является виновником ошибки, вызванной в строке 26, которая генерирует ошибку, которую вы видите.

Error in .jcall("RJavaTools", "Ljava/lang/Object;", "invokeMethod", cl,  : 
`java.lang.IllegalArgumentException: Your InputStream was neither an OLE2 stream, nor an OOXML stream

чтобы воспроизвести ошибку, загрузите файл «rows.csv», когда вы вызываете read.xlsx в строке 26, это вызывает ошибку, которую вы видите. Чтобы исправить строку 16, загрузите «rows.xlsx» и перезапустите скрипт ниже:

#!/usr/bin/env Rscript

# Ensure Clean Setup...
# Unload packages
if (require(xlsx)) {
        detach("package:xlsx", unload=TRUE)
}
if (require(xlsxjars)) {
        detach("package:xlsxjars", unload=TRUE)
}
# Delete Environment...
rm(list = ls())

# Delete directory
if (file.exists("data")) {
        unlink("./data", recursive = TRUE)
}

# OK - we should be in a base state setup test...

if (!require(xlsx)) {
        install.packages("xlsx")
}

if (!file.exists("data")) {
        dir.create("data")
}

# Download the file as a CSV file (Deliberate mistake) not a XLSX file
# This causes the error seen when read.xlsx is invoked...
# To fix replace rows.csv with rows.xlsx

if (!file.exists("data/cameras.xlsx")) {
        fileUrl <- "https://data.baltimorecity.gov/api/views/dz54-2aru/rows.csv?accessType=DOWNLOAD"
        download.file(fileUrl, destfile = "./data/cameras.xlsx", method = "curl")
}

list.files("./data")

# Now we check the file exists and read in the data...
# read.xlsx will throw the java error as the file downloaded is not a valid excel file...

if (!file.exists(".data/cameraData.xlsx")) {
        cameraData.xlsx <- read.xlsx("./data/cameras.xlsx", sheetIndex=1, header = TRUE)
}

head(cameraData.xlsx)

Вот пример вывода:

  1. #P6# <блочная цитата> #P7# #P8#

> source('test.R', echo=TRUE)

> #!/usr/bin/env Rscript
> 
> # Ensure Clean Setup...
> # Unload packages
> if (require(xlsx)) {
+         detach("package:xlsx", unload=TRUE)
+ }

> if (require(xlsxjars)) {
+         detach("package:xlsxjars", unload=TRUE)
+ }

> # Delete Environment...
> rm(list = ls())

> # Delete directory
> if (file.exists("data")) {
+         unlink("./data", recursive = TRUE)
+ }

> # OK - we should be in a base state setup test...
> 
> if (!require(xlsx)) {
+         install.packages("xlsx")
+ }
Loading required package: xlsx
Loading required package: xlsxjars

> if (!file.exists("data")) {
+         dir.create("data")
+ }

> # Download the file as a CSV file (Deliberate mistake) not a XLSX file
> # This causes the error seen when read.xlsx is invoked...
> # To fix replac .... [TRUNCATED] 
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0100  9923  100  9923    0     0  48559      0 --:--:-- --:--:-- --:--:-- 48642

> list.files("./data")
[1] "cameras.xlsx"

> # Now we check the file exists and read in the data...
> # read.xlsx will throw the java error as the file downloaded is not a valid excel file...
> .... [TRUNCATED] 

> head(cameraData.xlsx)
                         address direction      street  crossStreet               intersection                      Location.1
1       S CATON AVE & BENSON AVE       N/B   Caton Ave   Benson Ave     Caton Ave & Benson Ave (39.2693779962, -76.6688185297)
2       S CATON AVE & BENSON AVE       S/B   Caton Ave   Benson Ave     Caton Ave & Benson Ave (39.2693157898, -76.6689698176)
3 WILKENS AVE & PINE HEIGHTS AVE       E/B Wilkens Ave Pine Heights Wilkens Ave & Pine Heights  (39.2720252302, -76.676960806)
4        THE ALAMEDA & E 33RD ST       S/B The Alameda      33rd St     The Alameda  & 33rd St (39.3285013141, -76.5953545714)
5        E 33RD ST & THE ALAMEDA       E/B      E 33rd  The Alameda      E 33rd  & The Alameda (39.3283410623, -76.5953594625)
6        ERDMAN AVE & N MACON ST       E/B      Erdman     Macon St         Erdman  & Macon St (39.3068045671, -76.5593167803)
> 

person Technophobe01    schedule 08.01.2015

Возможно проблема в Java, а не в XLConnect. Убедитесь, что у вас установлена ​​Java, пройдя тест на сайте Java — он подтвердит, что Java установлена ​​правильно. Затем убедитесь, что R знает путь, по которому можно найти файл jre.dll или что-то вроде этого имени файла для того, что имеет решающее значение.

Во-вторых, вот код, который я использую в течение года, без сообщения об ошибке, которое вы получили. Если вам это поможет....

read.xls <- function(filename, sheetnumber=1, sheetname=NULL, forceConversion=TRUE, startCol=0,  stringsAsFactors=TRUE) {
wb <- loadWorkbook(filename)
if (is.null(sheetname)) sheetname = getSheets(wb)[sheetnumber]
df <- readWorksheet(wb, sheet=sheetname, forceConversion=forceConversion, startCol=startCol)
if (stringsAsFactors) {
ischar <- sapply(df, class) == "character"
for (i in 1:length(df)) {
if (ischar[i]) df[,i] <- factor(df[,i])
}
}
df
}
person lawyeR    schedule 27.02.2014
comment
Спасибо за ответ, я попробую это. Однако ошибка возникает при использовании xlsx. - person marbel; 28.02.2014
comment
Я попытался прочитать файл Excel и получил это: > read.xls("1_imei.xslx") Error in loadWorkbook(filename) : Cannot find 1_imei.xslx Called from: top level Browse[1]> c - person marbel; 28.02.2014
comment
вот в чем проблема: wb <- loadWorkbook(filename) - person marbel; 28.02.2014