【发布时间】:2013-07-14 07:46:27
【问题描述】:
为避免“重复”关闭请求:我知道如何读取 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
【问题讨论】:
-
我敢打赌,最简单的方法是返回 Excel 工作簿并创建一个新工作表,其中包含一组指向命名表单元格的简单链接(或公式)。然后告诉
R从该工作表中读取。 -
XLConnect 尚不支持 Excel 表格。此外,还不支持基于表格公式的命名范围。不过,我会对此进行调查,看看在这方面可以做些什么。
-
感谢 Martin Studer(XLConnect 的作者)。我昨天在 XML 中进行了一些挖掘,发现表被映射到一个额外目录中的 Ranges。请在此处发布以防万一。
-
给定链接上的 excel 文件已损坏。请检查您这边是否正常。
-
以防万一其他人尝试这样做:您必须使用 IF(ISBLANK.. 构造来避免空单元格。