使用xlsx包从R插入数据到excel的问题

我正在尝试从R创build一个新的Excel工作簿来使用xlsx包保存一些小的数据集。 出于某种原因,它工作正常,但我无法再做。

代码来创build一个新的工作簿

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 

我已经search了一个答案,但似乎人们从Excel中导入数据时有相同的错误。 我尝试了什么build议,但没有工作。 以下是未来search者的一些链接:

  • http://r.789695.n4.nabble.com/Read-shortcuts-of-MS-Excel-files-through-R-td4677020.html
  • http://r.789695.n4.nabble.com/Problem-with-xlsx-package-td3298470.html

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 

马丁,

我相信问题是您正在阅读的文件不是有效的.xlsx文件。 这里是一个代码示例来重现您的问题。 您也可以修改示例来解决问题。 该示例使用来自Web的示例数据集(Speed Camera locations baltimore :-))。

本质上,第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”,当你调用26行read.xlsx它会触发你看到的错误。 要修复更改行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. 加载rows.csv …

    source('test.R')加载所需软件包:xlsx加载所需软件包:xlsxjars%总计%接收%Xferd平均速度时间时间时间当前加载上载总花费左速度0 0 0 0 0 0 0 0 – : – – – : – : – – : – : – 0 0 0 0 0 0 0 0 0 – : – : – – : – : – – : – : – – 0100 9294 100 9294 0 0 33870 0 – : – : – – : – : – – : – : – 33796 .jcall错误(“RJavaTools”,“Ljava / lang / “,”invokeMethod“,cl,:java.lang.IllegalArgumentException:您的InputStream既不是OLE2stream,也不是OOXMLstream

    现在我们用rows.xlsxreplacerows.csv …

 > 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/BE 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) > 

这可能是Java的问题,而不是XLConnect。 确保您已经通过在Java网站上进行testing来安装Java – 它将确认Java已正确安装。 然后确保R知道findjre.dll的path或者类似于那个文件名的东西,这是至关重要的。

其次,这是我一年来使用的代码,没有你得到的错误信息。 如果它可以帮助你…

 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 }