简体   繁体   English

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

[英]Issues using xlsx package to insert data from R to excel

I´m trying to create a new excel workbook from R to save a few small datasets using xlsx package. 我正在尝试从R创建一个新的excel工作簿,以使用xlsx包保存一些小数据集。 For some reason it was working fine, but i´m unable to do it again. 由于某种原因,它工作正常,但我不能再做了。

Code to create a new workbook 用于创建新工作簿的代码

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

I´ve searched for an answer but it seems people are having the same error when importing data from excel. 我搜索了一个答案,但是从excel导入数据时似乎有人犯了同样的错误。 I´ve tried what was recommended but it didn´t work. 我尝试过推荐但不起作用。 Here are some links for future searchers: 以下是未来搜索者的一些链接:

sessionInfo() : 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     

Martin, 马丁,

I believe the issue is that the file you are reading in is not a valid .xlsx file. 我认为问题是您正在读取的文件不是有效的.xlsx文件。 Here is a code example to reproduce your problem. 这是一个重现问题的代码示例。 You can also modify the example to solve the problem. 您还可以修改示例以解决问题。 The example uses an example data set from the web (Speed Camera locations baltimore :-)). 该示例使用来自Web的示例数据集(Speed Camera locations baltimore :-))。

In essence line 16 is the culprit of the error triggered on line 26 that generates the error you see. 本质上,第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

to reproduce the error download the file "rows.csv", when you invoke read.xlsx on line 26 it triggers the error you see. 重现错误下载文件“rows.csv”,当你在第26行调用read.xlsx它会触发你看到的错误。 To fix change line 16 to download "rows.xlsx" and rerun the script below: 要修改更改行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)

Here is the example output: 以下是示例输出:

  1. Load rows.csv... 加载rows.csv ...

    source('test.R') Loading required package: xlsx Loading required package: xlsxjars % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 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 Error in .jcall("RJavaTools", "Ljava/lang/Object;", "invokeMethod", cl, : java.lang.IllegalArgumentException: Your InputStream was neither an OLE2 stream, nor an OOXML stream source('test.R')加载所需的包:xlsx加载所需的包:xlsxjars%总收到%%Xferd平均速度时间时间时间当前Dload上传总花费左速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 / Object; “,”invokeMethod“,cl,:java.lang.IllegalArgumentException:您的InputStream既不是OLE2流,也不是OOXML流

    now we replace rows.csv with rows.xlsx... 现在我们用rows.xlsx替换rows.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) > 

It is possible the problem is with Java, not XLConnect. 问题可能出在Java上,而不是XLConnect。 Be sure you have Java installed by taking the test on the Java site -- it will confirm Java is correctly installed. 确保通过在Java站点上进行测试来安装Java - 它将确认Java已正确安装。 Then make sure R knows the path to find the jre.dll or something like that file name for what is crucial. 然后确保R知道找到jre.dll或类似文件名的路径,这对于什么是至关重要的。

Second, here is the code I have been using for a year, without the error message you got. 其次,这是我一年来使用的代码,没有你得到的错误信息。 If it helps you .... 如果它可以帮助你......

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
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM