使用XLConnect包从URL读取Excel文件到R中

3

有很多关于如何使用XLConnect包将Microsoft Excel文件读入R的好例子,但我找不到任何直接从URL读取Excel文件的示例。下面的可重现示例返回“FileNotFoundException (Java)”。但是,我知道该文件存在,因为我可以通过将URL粘贴到浏览器中直接访问它。

fname <- "https://www.misoenergy.org/Library/Repository/Market%20Reports/20140610_sr_nd_is.xls"
sheet <- c("Sheet1")
data  <- readWorksheetFromFile(fname, sheet, header=TRUE, startRow=11, startCol=2, endCol=13)

尽管 URL 前缀为 "https:",但它是一个公共文件,不需要用户名或密码。
我尝试使用 download.file(fname, destfile="test.xls") 下载该文件,并收到消息称已下载完成。但当我尝试在 Excel 中打开它以检查是否成功时,弹出一个 Excel 弹出框,内容为“..在'test.xls'中发现无法读取的内容”。
以下是我系统的具体信息:
计算机型号:Dell 64位运行设备 操作系统:Windows 7 专业版 R 版本:R-3.1.0
如有帮助,将不胜感激。

我认为你需要先下载文件。 - rrs
我尝试使用download.file(fname, destfile="test.xls")下载文件,收到了一个消息说已经下载完成,但是当我尝试在Excel中打开它以检查时,Excel会显示“..在'test.xls'中发现无法读取的内容”。这很奇怪,因为我可以直接将URL粘贴到浏览器中打开它。 - MikeTP
是的,我也试过了。不确定出了什么问题。 - rrs
似乎问题出在实际的Excel文件上,而不是你的代码——快速的谷歌搜索可以找到其他人遇到了类似的Java错误信息,这些错误可能是由于损坏的Office文件或过时的Java引起的。我知道这不如编程方式好,但你能否只是复制数据并将其放入CSV文件中呢?cran.r-project.org说:“第一条建议是尽可能避免这样做!如果你可以访问Excel,则从Excel中以制表符分隔或逗号分隔的形式导出所需的数据,并使用read.delim或read.csv将其导入R。” - Meaghan Fitzgerald
感谢您的回复。在这种情况下,将内容复制粘贴到CSV文件中并不切实际,因为我的主要目标之一是自动化收集和分析每日时间序列。每天手动完成这项任务根本不高效。 - MikeTP
使用download.file()下载文件时没有任何问题。在Excel 2010中打开...尝试使用XLConnect访问时会显示错误:"Error: IOException (Java): Cannot remove block[ 2555904 ]; out of range[ 0 - 161 ]"。因此,关于下载和在Excel中打开的部分,我猜测这似乎与您的本地(PC)设置有关。关于XLConnect错误:我将其转换为.xlsx,并通过“openxlsx”包访问数据。在这种情况下,我手动进行了转换,可以通过例如从R内部调用的vbs脚本自动运行,该脚本将扩展名从.xls更改为.xlsx。 - GWD
4个回答

2
您可以使用RCurl来下载文件:
library(RCurl)
library(XLConnect)
appURL <- "https://www.misoenergy.org/Library/Repository/Market%20Reports/20140610_sr_nd_is.xls"
f = CFILE("exfile.xls", mode="wb")
curlPerform(url = appURL, writedata = f@ref, ssl.verifypeer = FALSE)
close(f)
out <- readWorksheetFromFile(file = "exfile.xls", sheet = "Sheet1", header = TRUE
                      , startRow = 11, startCol = 2, endCol = 15, endRow = 35)
> head(out)
Col1 EEI Col3 IESO MHEB Col6 PJM SOCO SWPP TVA WAUE Col12 Other Total
1 Hour  1 272   NA  768 1671   NA 148  200  -52 198  280    NA   700  4185
2 Hour  2 272   NA  769 1743   NA 598  200  -29 190  267    NA   706  4716
3 Hour  3 272   NA  769 1752   NA 598  200  -28 194  267    NA   710  4734
4 Hour  4 272   NA  769 1740   NA 598  200  -26 189  266    NA   714  4722
5 Hour  5 272   NA  769 1753   NA 554  200  -27 189  270    NA   713  4693
6 Hour  6 602   NA  769 1682   NA 218  200  -32 223  286    NA   714  4662

2

两件事情:

  1. 尝试使用不同的包 - 我知道 gdata 包中的 read.xls 函数支持 URL。

  2. 尝试加载公开可用的 xls 文件,以确保不是特定网站的问题。

例如,您可以尝试:

library("gdata")
site <- "http://www.econ.yale.edu/~shiller/data/chapt26.xls"
data  <- read.xls(site, header=FALSE, skip=8)
head(data)

谢谢您的回复。您的示例在使用您的数据时完美运行,但是当我尝试修改它以读取我的数据时,出现了不同的错误。尽管我的数据具有“https:”URL前缀,但我怀疑“https:”URL前缀是问题的一部分。 XLConnect文档建议它可以容纳“https:”,因此我正在寻找一个解决方案或示例,利用XLConnect。再次感谢您的回复。 - MikeTP
你有没有使用Mac电脑? - Steve S
不,我使用的是运行Windows 7专业版的64位Dell电脑。 - MikeTP

2

XLConnect不支持直接从URL导入。您需要先使用例如download.file将文件下载到本地计算机:

require(XLConnect)
tmp = tempfile(fileext = ".xls")
download.file(url = "http://www.econ.yale.edu/~shiller/data/chapt26.xls", destfile = tmp)
readWorksheetFromFile(file = tmp, sheet = "Data", header = FALSE, startRow = 9, endRow = 151)

或者使用您最初提供的URL:
require(XLConnect)
tmp = tempfile(fileext = ".xls")
download.file(url = "https://www.misoenergy.org/Library/Repository/Market%20Reports/20140610_sr_nd_is.xls", destfile = tmp, method = "curl")
readWorksheetFromFile(file = tmp, sheet = "Sheet1", header = TRUE, startRow = 11, startCol = 2, endCol = 13)

1
Martin Studer:感谢您的回复。即使使用您的代码(如上所示),我也没有成功。它返回以下错误:“Error: FileNotFoundException (Java):无法找到文件' file5140448e1d6.xls ' - 如果不存在,您可以指定自动创建文件。”我真的不明白如何解释该错误消息,因此可能与我的系统有关(我假设您已成功读取我的URL)。因此,也许是时候放弃XLConnect特定的应用程序,并尝试其他东西了。 - MikeTP
@MikeTP:也许你应该尝试一下 download.file(url = "https://www.misoenergy.org/Library/Repository/Market%20Reports/20140610_sr_nd_is.xls", destfile = tmp, mode = "wb") 对我来说,添加 mode 就解决了问题。 - Tamas Ferenci

1
library(relenium)
library(XML)
library(RCurl)

firefox=firefoxClass$new()
url="https://www.misoenergy.org/Library/Repository/Market%20Reports/20140610_sr_nd_is.xls"
url=sprintf(url)
firefox$get(url)

这将在R中打开一个Firefox实例并要求您下载文件,然后您可以在下一行代码中打开该文件。我不知道有任何R工具可以从HTTPS打开Excel电子表格。
然后,您可以在保存文件时设置延迟,然后从下载文件夹中读取工作表:
Sys.sleep(10)
sheet <- c("Sheet1")
data  <- readWorksheetFromFile(path, sheet, header=TRUE, startRow=11, startCol=2, endCol=13)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接