为避免“重复”关闭请求:我知道如何读取 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