【问题标题】:Read Excel file into R with XLConnect package from URL使用 XLConnect 包从 URL 将 Excel 文件读入 R
【发布时间】:2026-01-23 13:20:03
【问题描述】:

有很多关于如何使用 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”中发现不可读的内容。

以下是我的系统的详细信息:

计算机:64 位戴尔运行 操作系统:Windows 7 专业版 R 版本:R-3.1.0

任何帮助将不胜感激。

【问题讨论】:

  • 我认为你需要先下载文件。
  • 我尝试了 download.file(fname, destfile="test.xls") 并收到一条消息说它已下载但是当我尝试在 Excel 中打开它以检查 Exel 说“..在“test.xls”中发现不可读的内容。这很奇怪,因为我可以通过将 URL 粘贴到浏览器中直接打开它。
  • 是的,我也试过了。不知道发生了什么。
  • 问题似乎出在实际的 Excel 文件上,而不是您的代码上 - 快速的 Google 搜索会发现其他人有类似的 Java 错误消息,其中包含已损坏的 Office 文件或过时的 Java。我知道它不如以编程方式进行,但您可以复制数据并放入 CSV 文件吗? cran.r-project.org 说:“第一条建议是尽可能避免这样做!如果您可以访问 Excel,请以制表符分隔或逗号分隔的形式从 Excel 导出您想要的数据,并使用 read .delim 或 read.csv 将其导入 R。"
  • 感谢您的回复。在这种情况下,复制粘贴到 CSV 文件是不切实际的,因为我的主要目标之一是自动收集和分析这个每日时间序列。每天手动操作只是没有效率。

标签: java r excel


【解决方案1】:

您可以使用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 的解决方案或示例。再次感谢您的回复。
    • 你在使用 Mac 吗?
    • 不,我使用的是运行 Windows 7 Professional 的 64 位戴尔
    【解决方案3】:

    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)
    

    或使用您最初建议的网址:

    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)
    

    【讨论】:

    • Martin Studer:感谢您的回复。即使使用您的代码(上图)我也没有任何成功。它返回以下错误:“错误:FileNotFoundException(Java):找不到文件'file5140448e1d6.xls' - 如果文件不存在,您可以指定自动创建文件。”我真的不明白如何解释该错误消息,因此它可能与我的系统有关(我假设您已成功阅读我的 URL)。所以也许是时候为这个特定的应用程序放弃 XLConnect 并尝试其他东西了。
    • @MikeTP : 也许你应该试试download.file(url = "https://www.misoenergy.org/Library/Repository/Market%20Reports/20140610_sr_nd_is.xls", destfile = tmp, mode = "wb") 添加mode 对我有用。
    【解决方案4】:
    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)
    

    【讨论】: