【问题标题】:Unable to read in .xls from R无法从 R 读取 .xls
【发布时间】:2014-11-22 17:35:26
【问题描述】:
  • 文件:它是一个大约有 100 行和 7 列的文件。 XLS 扩展 (MS Excel 97-2003)。
  • 问题:无法通过read.xlsxread.xlsx2 使用R 读取文件。
  • 用于尝试读取文件的代码:

    library(xlsxjars)
    library(rJava)
    library(xlsx) 
    excel <- read.xlsx("File.xls",sheetIndex=1,startRow=1,stringsAsFactor=F)
    
  • 错误提示:

.jcall ("RJavaTools","Ljava/lang/object;","invokeMethod",cl, 中的错误:java.lang.IllegalArgumentException:您的 InputStream 既不是 OLE2 流,也不是 OOXML 流。

PD:作为记录,我确实尝试使用read.csv 读取它,它确实读取了它,但由于它是一个 Excel 文件并且它没有用逗号或点分隔,R 读取它就好像所有内容都在 1 列中一样。也许任何人都可以建议一种通过read.csv阅读它的方法?

【问题讨论】:

  • 调整read.csv中的sep参数或使用read.table
  • 你会使用什么 sep?在 Excel 中,它由列分隔,而不是任何符号...
  • 使用空格 sep = " " 或可能使用制表符 sep = "\t"
  • sep="\t" 解决了!谢谢!!
  • 听起来您实际上并不是 XLS 格式的文件(OOXML 和 BIFF(?) 都不是),而是制表符分隔的文本文件。有一个技巧,即为 excel 可以理解的格式的文件赋予 .xls 扩展名,以便当您通过 GUI 打开它时打开 Excel。尝试在文本编辑器中查看该文件以查看其真实内容(或使用file 命令行实用程序,如果它存在于您的操作系统中)。

标签: r excel csv r-xlsx


【解决方案1】:

您所说的有两件事让我认为您没有处理您认为正在处理的文件类型:

  1. Your InputStream was neither an OLE2 stream, nor an OOXML stream"
    
  2. “我确实尝试使用 read.csv() 读取它,它确实读取了它......”

如果它真的是 MS Excel 97-2003 原生格式的文件,read.csv 根本无法处理它。 read.xlsx 的错误支持这一点。这似乎是一个文本文件,您在read.table 中使用sep="\t" 的评论允许正确读取它,这证实了这一点。你所拥有的是一个制表符分隔的文本文件,它恰好有后缀.xls

应该注意的是,文件的后缀并不能保证该文件是声称的格式。一个更好的指标是在其上运行file shell 命令(如果该命令在您的操作系统上可用)。 GUI 有时使用文件扩展名来确定使用哪个应用程序打开文件。由于 Excel 能够读取制表符分隔的文件(并且因为 Excel 可能未设置为 .tsv 文件的默认应用程序,这将是更传统的文件扩展名),通过使用 .xls 扩展名,该文件将(通常)由 Excel 打开。

总而言之,仅仅因为文件名以.xls 结尾并不意味着它真的是Excel 原生格式文件。

【讨论】:

  • 这比我能给出的解释要好得多。 :) 你教会了我一些东西,而我所做的只是解决眼前的问题。
【解决方案2】:

您可以使用此功能,读取以 2003 .XLS 格式保存的 XML 电子表格

    readExcelXML <- 
    function(filename) {
    library(xml2)
    library(magrittr)
    doc <- read_xml(filename)
    ns <- xml_ns(doc)
    rows <- xml_find_all(doc, paste0(".//ss:Worksheet/ss:Table/ss:Row"), ns = ns)
    values <- lapply(rows, . %>% xml_find_all(".//ss:Cell/ss:Data", ns = ns) %>%                 
    xml_text %>% unlist)

    columnNames <- values[[1]]

    dat <- do.call(rbind.data.frame, c(values[-1], stringsAsFactors = FALSE))
    names(dat) <- columnNames

    dat
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-27
    • 2020-08-28
    • 1970-01-01
    相关资源
    最近更新 更多