R 阅读Excel表格,而不是简单的命名范围

R 阅读Excel表格,而不是简单的命名范围,r,excel,import,R,Excel,Import,避免重复关闭请求:我知道如何读取Excel命名范围;下面的代码中给出了示例。这是关于Excel中的真实表格 Excel2007和更高版本具有表格的有用概念:您可以将范围转换为表格,避免排序和重新排列时的麻烦。在Excel范围内创建表时,它会获得德语版本的默认名称Tabelle1,以下示例中为TableName,但您还可以简单地将表的范围命名为TableAsRangeName;如Excel范围名称编辑器中的图标所示,这两个名称的处理方式似乎有所不同 我无法从R中严格地读取这些表。唯一已知的解决方法

避免重复关闭请求:我知道如何读取Excel命名范围;下面的代码中给出了示例。这是关于Excel中的真实表格

Excel2007和更高版本具有表格的有用概念:您可以将范围转换为表格,避免排序和重新排列时的麻烦。在Excel范围内创建表时,它会获得德语版本的默认名称Tabelle1,以下示例中为TableName,但您还可以简单地将表的范围命名为TableAsRangeName;如Excel范围名称编辑器中的图标所示,这两个名称的处理方式似乎有所不同

我无法从R中严格地读取这些表。唯一已知的解决方法是使用CSV中间值,或者将表转换为正常命名范围,这在单元格引用中使用列名时会产生不可逆的副作用;这些转换为A1表示法

下面的示例显示了问题。您的里程数可能因32/64位ODBC驱动程序和32/64位Java的不同组合而有所不同

# Read Excel Tables (not simply named ranges)
# Test Computer: 64 Bit Windows 7, R 32 bit  
# My ODBC drivers are 32 bit
library(RODBC)
# Test file has three ranges
# NonTable Simple named range
# TableName Name of table 
# TableAsRangeName Named Range covering the above table
sampleFile = "ExcelTables.xlsx"
if (!file.exists(sampleFile)){
  download.file("http://www.menne-biomed.de/uni/ExcelTables.xlsx",sampleFile)
  # Or do it manually, if this fails
}
# ODBC
channel = odbcConnectExcel2007(sampleFile)
sqlQuery(channel, "SELECT * from NonTable") # Ok
sqlQuery(channel, "SELECT * from TableName") # Could not find range
sqlQuery(channel, "SELECT * from TableAsRangeName") # Could not find range
close(channel)

# gdata has read.xls, but seems not to support named regions

library(xlsx)
wb = loadWorkbook(sampleFile)
getRanges(wb) # This one fails already with "TableName" does not exist
ws = getSheets(wb)[[1]]
readRange("NonTable",ws) # Invalid range address
readRange("TableName",ws) # Invalid range address
readRange("TableAsRangeName",ws) # Invalid range address

# my machine requires 64 bit for this one; depends on your Java installation
sampleFile = "ExcelTables.xlsx"
library(XLConnect) # requires Java
readNamedRegionFromFile(sampleFile,"NonTable") # OK
readNamedRegionFromFile(sampleFile,"TableName") # "TableName" does not exist
readNamedRegionFromFile(sampleFile,"TableAsRangeName") # NullPointerException

wb <- loadWorkbook(sampleFile)
readNamedRegion(wb,"NonTable") # Ok
readNamedRegion(wb,"TableName") # does not exist
readNamedRegion(wb,"TableAsRangeName") # Null Pointer

表定义存储在XML中是正确的

sampleFile = "ExcelTables.xlsx"
unzip(sampleFile, exdir = 'test')
library(XML)
tData <- xmlParse('test/xl/tables/table1.xml')
tables <- xpathApply(tData, "//*[local-name() = 'table']", xmlAttrs)
[[1]]
            id           name    displayName            ref totalsRowShown 
           "1"    "TableName"    "TableName"        "G1:I4"            "0" 
library(XLConnect)

readWorksheetFromFile(sampleFile, sheet = "ExcelTable", region = tables[[1]]['ref'], header = TRUE)
    Name Age AgeGroup
1  Anton  44        4
2 Bertha  33        3
3  Cäsar  21        2

根据您的情况,您可以在XML文件中搜索适当的数量。

我在XLConnect中添加了一些对Excel表格的初始支持。请在github上查找最新更改,网址为

以下是一个小样本:

require(XLConnect)
sampleFile = "ExcelTables.xlsx"
wb = loadWorkbook(sampleFile)
readTable(wb, sheet = "ExcelTable", table = "TableName")
请注意,Excel表格与工作表相关联。因此,据我所知,可以将多个同名表关联到不同的工作表。因此,readTable中有一个工作表参数。

后面的添加:

readxl::readxl可以读取实际的表,当您想要读取数据帧/文件时,它可能是最简单的解决方案

**在@Jamzy评论之后**
我再次尝试,但无法读取命名范围。然后是假阳性还是现在是假阴性?

我打赌最简单的方法是返回Excel工作簿并创建一个新工作表,其中包含指向命名表单元格的一组简单链接或公式。然后让R读取该工作表。XLConnect尚不支持Excel表格。此外,还不支持基于表公式的命名范围。不过,我将对此进行研究,看看在这方面可以做些什么。谢谢,XLConnect的作者Martin Studer。我昨天在XML中做了一些挖掘,发现表映射到一个额外目录中的范围。请在这里发布,以防你让它工作。链接上的excel文件已损坏。请检查您这边是否正常。以防其他人尝试此操作:您必须使用IFISBLANK。。构造以避免空单元格。我刚刚实现了与您的解决方案类似的东西,并从中添加了一些额外的内容,因为我担心readWorksheetFromFile会在我太大的真实文件上绊倒。一个有趣的博客。过去,您可以通过对基础xml文件进行一些修改来删除excel文件上的密码保护。很抱歉,将此信用证转让给Martin。我给你的答案是+1。@user1609452,你的答案节省了我很多时间。如果您的Excel工作簿有多张工作表怎么办?有没有办法确定表存储在哪个表中?RJava似乎存在一个令人讨厌的64/32位依赖性问题。我已经安装了工具链并定期使用,但无法获得xlconnect构建;尝试了32位和64位R。错误:无法加载共享对象“D:/R/R/library/rJava/libs/i386/rJava.dll”:加载库失败:%1是keine zulässige Win32 Anwendung。明天将检查。这很好,能够刷新并写回/追加到Excel表有多困难?似乎无法使其工作,尝试了writeNamedRegion。请详细说明一下好吗?我在文档中找不到这方面的任何提及。不,我在文档中找不到,只是尝试了一下。另一方面,大多数其他读者不支持实际表的事实也没有记录在案。你试过了吗?还有其他经验吗?