为了避免"重复"的关闭请求:我知道如何读取Excel中的名称范围; 代码下面给出了示例。这与Excel中的“真实”表有关。
Excel2007及更高版本具有有用的表格概念:可以将范围转换为表格,并在排序和重新排列时避免麻烦。当您在Excel范围中创建表格时,它会获得默认名称(德语版中的
我无法从R中读取这些表格(严格意义上)。唯一已知的解决方法是使用CSV中间件,或将表格转换为普通的命名范围,这会在使用单元格引用中的列名时产生令人讨厌的不可逆副作用; 这些被转换为A1表示法。
下面的示例显示了问题。使用不同的32/64位ODBC驱动程序和32/64位Java可能会导致不同的结果。
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
R
从该工作表中读取。 - Carl Witthoft