我正在尝试在R中打开一个.xlsb文件并不断收到类似的错误。
有关如何解决此问题而不必下载数据并将其保存在其他格式中的任何建议?
read.xlsx(paste(OutputLocation,FileName, sep=""), sheetName = "Master Data")
错误消息: .jcall中的错误(“RJavaTools”,“Ljava / lang / Object;”,“invokeMethod”,cl,: org.apache.poi.xssf.XLSBUnsupportedException:.XLSB不支持二进制工作簿
rigDataWB<-loadWorkbook(paste(OutputLocation,FileName, sep=""))
错误消息: 错误:XLSBUnsupportedException(Java):不支持.XLSB二进制工作簿
请注意:
我无法安装Perl库。
我正在运行64位R.
参考: http://www.milanor.net/blog/?p=779
我的数据来自: http://phx.corporate-ir.net/phoenix.zhtml?c=79687&p=irol-reportsother
答案 0 :(得分:8)
使用RODBC
包:
library(RODBC)
wb <- "D:\\Data\\Masked Data.xlsb" # Give the file name
con2 <- odbcConnectExcel2007(wb)
data <- sqlFetch(con2, "Sheet1$") # Provide name of sheet
nrow(data)
答案 1 :(得分:5)
一种方法是使用ODBC:
require(RODBC)
if (any(grepl("*.xlsb", odbcDataSources(), fixed = TRUE))) {
download.file(url = "http://phx.corporate-ir.net/External.File?item=UGFyZW50SUQ9NTcwMjI1fENoaWxkSUQ9MjcxMjIxfFR5cGU9MQ==&t=1",
destfile = file.path(tempdir(), "test.xlsb"),
mode = "wb")
conn <- odbcConnectExcel2007( file.path(tempdir(), "test.xlsb"))
df <- sqlFetch(conn, sub("'(.*)\\$'", "\\1", sqlTables(conn)$TABLE_NAME)[4]) # read 4th sheet in the table name list
head(df, 10)
# F1 F2 F3 F4 F5 F6
# 1 <NA> <NA> <NA> <NA> <NA> NA
# 2 <NA> <NA> <NA> <NA> <NA> NA
# 3 <NA> <NA> <NA> <NA> <NA> NA
# 4 <NA> <NA> <NA> <NA> <NA> NA
# 5 Baker Hughes Gulf of Mexico Oil / Gas Split <NA> <NA> <NA> <NA> NA
# 6 <NA> <NA> <NA> <NA> <NA> NA
# 7 <NA> US Offshore Total\nGoM Gas\nGoM Oil \nGoM NA
# 8 1/7/00 127 123 116 7 NA
# 9 1/14/00 125 121 116 5 NA
# 10 1/21/00 125 121 116 5 NA
close(conn)
}
答案 2 :(得分:1)
如果在R中尝试连接到.xlsb
时遇到以下错误:
[RODBC] ERROR: state IM002, code 0, message [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified
然后,您可能缺少安装Microsoft的AccessDatabaseEngine_X64.exe
的机会。我今天遇到了这个问题,安装完该文件后,我再也没有错误消息了。
答案 3 :(得分:0)
readxlsb
程序包可以将Excel二进制(.xlsb)文件读入R。这是从程序包小插图中获取的一些信息:
read_xlsb(path, sheet, range, col_names, col_types, na, trim_ws, skip, ...)
工作表:
名称或要读取的图纸索引。第一张工作表的索引是1。如果工作表名称嵌入在range参数中,或者如果range是一个命名范围,则表示该参数被忽略
范围:
范围可以指定为
- 命名范围。命名范围不区分大小写
- 在工作表中!A1表示法
- 在工作表中!R1C1表示法
- 作为cellranger :: cell_limits对象
col_names
- TRUE:第一行用于列名。空单元格将导致列名称的格式为“ column.i”
- FALSE:列名将为“ column.i”
- 字符向量:包含列名称的向量。
col_types
可以从电子表格中隐含或高级指定。指定类型时,选项为
- “逻辑”(或“布尔”),“数字”(或“双精度”),“整数”,“日期”和“字符串”(或“字符”)
- 使用“跳过”(或“忽略”)跳过一列
na
被解释为NA的字符串。这不会影响列的隐含数据类型。
trim_ws
是否应该从字符串中修剪开头和结尾的空格?
跳过
在读取数据之前要跳过的行数。
library(readxlsb)
res = read_xlsb(path = system.file("extdata", "TestBook.xlsb", package = "readxlsb"),
range = "PORTFOLIO",
debug = TRUE)
ls(res$env)
#> [1] "content" "named_ranges" "sheets" "stream"
res$env$named_ranges
#> name range sheet_idx first_column first_row
#> 1 INFO_RELEASE FirstSheet!$A$11 0 1 11
#> 2 OUTLOOK 'My SecondTab'!$A$1:$C$13 1 1 1
#> 3 PORTFOLIO FirstSheet!$A$3:$C$9 0 1 3
#> 4 SAVED_DATETIME FirstSheet!$C$13 0 3 13
#> 5 TITLE FirstSheet!$A$1 0 1 1
#> last_column last_row
#> 1 1 11
#> 2 3 13
#> 3 3 9
#> 4 3 13
#> 5 1 1
由reprex package(v0.3.0)于2020-07-07创建
答案 4 :(得分:0)
试试
xl.read.file(file_path, h=T, top.left.cell = "A1") from library(excel.link)