readxl :: read_xls返回“ libxls错误:无法打开文件”

时间:2019-12-06 17:51:18

标签: r excel macos xls readxl

我有多个.xls(〜100MB)文件,我想从中将多个工作表(来自每个工作表)作为数据帧加载到R中。我尝试了各种功能,例如xlsx::xlsx2XLConnect::readWorksheetFromFile,这两个功能始终运行很长时间(> 15分钟),并且从未完成,因此我不得不强制退出RStudio才能继续工作。

我也尝试过gdata::read.xls,它确实完成了,但是每张纸要花费3分钟以上的时间,并且不能一次提取多张纸(这对加快我的工作流程非常有帮助),就像{{1 }}可以。

执行这些函数所花的时间(而且我甚至不确定如果让它们运行更长的时间,前两个函数是否会完成)对于我的管道来说太长了,我需要一次处理多个文件。有没有办法让它们更快地完成/完成?

在一些地方,我看到了使用功能XLConnect::loadWorkbook的建议,该功能似乎被广泛推荐用于此任务,并且每张纸应该更快。但是,这给了我一个错误:

readxl::read_xls

我还进行了一些基本测试,以确保文件存在并且格式正确:

> # Minimal reproducible example:
> setwd("/Users/USER/Desktop")
> library(readxl)
> data <- read_xls(path="test_file.xls")
Error: 
  filepath: /Users/USER/Desktop/test_file.xls
  libxls error: Unable to open file

上面使用的> # Testing existence & format of the file > file.exists("test_file.xls") [1] TRUE > format_from_ext("test_file.xls") [1] "xls" > format_from_signature("test_file.xls") [1] "xls" 可用here。 任何建议都会使第一个功能运行得更快,或者使test_file.xls完全运行-谢谢!

更新:

似乎有些用户可以使用read_xls功能打开上面的文件,而另一些用户不能使用最新版本的readxl::read_xls,{ {1}}和Rissue has been posted on the readxl GitHub并且尚未解决。

7 个答案:

答案 0 :(得分:2)

我下载了您的数据集并以这种方式读取每个excel工作表(例如,工作表“总体”和“区域”):

install.packages("readxl")
library(readxl)
library(data.table)

dt_overall <- as.data.table(read_excel("test_file.xls", sheet = "Overall"))
area_sheet <- as.data.table(read_excel("test_file.xls", sheet = "Area"))

最后,我得到这样的数据(例如,“区域”表的数据集的一部分):

enter image description here

同样,您可以使用read_xls函数代替read_excel

我检查了一下,它也可以正常工作甚至更快一点,因为read_excelread_xls包中read_xlsxreadxl函数的包装。

此外,您可以使用excel_sheets包中的readxl函数来读取Excel文件的所有工作表。

更新

使用microbenchmark软件包对以下软件包/功能进行基准测试:gdata::read.xlsXLConnect::readWorksheetFromFilereadxl::read_excel

但是XLConnect是基于Java的解决方案,因此需要大量RAM。

enter image description here

答案 1 :(得分:0)

我将提出不同的工作流程。如果您恰好安装了LibreOffice,则可以通过编程将excel文件转换为csv。我有Linux,所以我用bash来做,但是我确信它可以在macOS中实现。

因此,打开一个终端,并导航至包含您的excel文件的文件夹,然后在终端中运行:

for i in *.xls
    do soffice --headless --convert-to csv "$i" 
done

现在在 R 中,您可以使用data.table::fread来循环读取文件:

方案1:文件的结构不同

如果文件的结构不同,则您不想将它们rbind在一起。您可以在 R 中运行:

files <- dir("path/to/files", pattern = ".csv")
all_files <- list()
for (i in 1:length(files)){
  fileName <- gsub("(^.*/)(.*)(.csv$)", "\\2", files[i])
  all_files[[fileName]] <- fread(files[i])
}

如果要将列表中的命名元素提取到全局环境中,以便可以将其转换为对象,则可以使用list2env

list2env(all_files, envir = .GlobalEnv)

请注意两件事:首先,在gsub调用中,斜线的方向。其次,如果list2env与列表中的命名元素具有相同的名称,则它们可能会覆盖全局环境中的对象。

方案2:文件的结构相同

在这种情况下,您可能想一起rbind一起使用它们。您可以在 R 中运行:

files <- dir("path/to/files", pattern = ".csv")
joined <- list()
for (i in 1:length(files)){
  joined <- rbindlist(joined, fread(files[i]), fill = TRUE)
}

答案 2 :(得分:0)

我看到了类似的错误,想分享一个短期解决方案。

library(readxl)
download.file("https://mjwebster.github.io/DataJ/spreadsheets/MLBpayrolls.xls", "MLBPayrolls.xls")
MLBpayrolls <- read_excel("MLBpayrolls.xls", sheet = "MLB Payrolls", na = "n/a")

收益(在我教室中的某些系统上,但在其他系统上不是):

错误:文件路径:MLBPayrolls.xls libxls错误:无法打开文件

临时解决方案是将xls文件的URL粘贴到Firefox中,然后通过浏览器下载。完成此操作后,我们可以正确运行read_excel行。

今天,在带有R 3.6.2和R Studio 1.2.5033的Windows 10上发生了这种情况。

答案 3 :(得分:0)

我发现下载后无法立即用read_xl打开文件,但是如果我在Excel中打开文件,将其保存并再次关闭,则read_xl可以毫无问题地打开它。

我建议的处理数百个文件的解决方法是建立一个小的C#命令行实用程序,该实用程序可以打开,保存和关闭Excel文件。下面是源代码,可以使用Visual Studio Community Edition编译该实用程序。

using System.IO;
using Excel = Microsoft.Office.Interop.Excel;

namespace resaver
{
  class Program
  {
    static void Main(string[] args)
    {
      string srcFile = Path.GetFullPath(args[0]);
      Excel.Application excelApplication = new Excel.Application();
      excelApplication.Application.DisplayAlerts = false;
      Excel.Workbook srcworkBook = excelApplication.Workbooks.Open(srcFile);
      srcworkBook.Save();
      srcworkBook.Close();
      excelApplication.Quit();
    }
  }
}

编译后,可以使用以下命令从R中调用该实用程序system2()

答案 4 :(得分:0)

在我的系统上,我必须使用path.expand

R> file = "~/blah.xls"
R> read_xls(file)

Error: 
  filepath: ~/Dropbox/signal/aud/rba/balsheet/data/a03.xls
  libxls error: Unable to open file

R> read_xls(path.expand(file)) # fixed

答案 5 :(得分:0)

保存文件即可轻松解决问题。

我之前也发现了这个问题,但是我从您的讨论中得到了答案。

我使用read_excel()打开这些文件。

答案 6 :(得分:0)

如果你已经从网上下载了.xls数据,即使你是在Excel中打开它,它也会首先打开一个提示,询问你是否信任来源,看下面的截图,我猜这是R (read_xls) 也无法打开它的原因,因为它被认为是不安全的。将其另存为 .xlsx 文件,然后使用 read_xlsx()read_excel()enter image description here