避免"重复"关闭请求:我知道如何读取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
Run Code Online (Sandbox Code Playgroud)
我在XLConnect中添加了对 Excel 表的一些初步支持。请在 github 上查找最新更改:https://github.com/miraisolutions/xlconnect
下面是一个小样本:
require(XLConnect)
sampleFile = "ExcelTables.xlsx"
wb = loadWorkbook(sampleFile)
readTable(wb, sheet = "ExcelTable", table = "TableName")
Run Code Online (Sandbox Code Playgroud)
请注意,Excel 表格与工作表相关联。据我所知,可以将多个具有相同名称的表关联到不同的工作表。由于这个原因,有一个sheet-argument readTable。