Per evitare la richiesta di chiusura "duplicata": so leggere gli intervalli denominati in Excel; esempi sono forniti nel codice qui sotto. Si tratta di tabelle "reali" in Excel.Leggi tabelle di Excel, non semplici intervalli denominati
Excel2007 e versioni successive hanno il concetto utile di tabelle: è possibile convertire intervalli in tabelle ed evitare problemi durante l'ordinamento e la riorganizzazione. Quando si crea una tabella in un intervallo di Excel, viene visualizzato un nome predefinito (Tabelle1
nella versione tedesca, TableName
nell'esempio seguente), ma è anche possibile nominare semplicemente l'intervallo della tabella (TableAsRangeName
); come indicato dalle icone nell'editor dei nomi dell'intervallo di Excel, questi due sembrano essere trattati in modo diverso.
Non sono stato in grado di leggere queste tabelle (in senso stretto) da R. L'unica soluzione nota è l'utilizzo di CSV intermedio o la conversione della tabella in un intervallo denominato normale, che ha effetti collaterali irreversibili quando si utilizzano nomi di colonne in riferimenti di celle; questi sono convertiti in notazione A1.
L'esempio seguente mostra il problema. Si situazione potrebbe essere diversa con diverse combinazioni di driver ODBC 32/64 bit e 32/64 bit 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
La mia scommessa è che il modo più semplice è tornare alla cartella di lavoro di Excel e creare un nuovo foglio che contenga un semplice insieme di collegamenti (o formule) alle celle della tabella nominata. Quindi dì a 'R' di leggere da quel foglio di lavoro. –
XLConnect non supporta ancora le tabelle di Excel. Inoltre, gli intervalli denominati basati sulle formule di tabella non sono ancora supportati. Tuttavia, cercherò questo per vedere cosa si può fare su questo fronte. –
Grazie, Martin Studer (autore di XLConnect). Ieri ho fatto qualche ricerca in XML e ho scoperto che le tabelle sono mappate agli intervalli in una directory extra. Si prega di postare qui nel caso in cui si ottiene per funzionare. –