2013-07-16 14 views
5

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 
+0

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. –

+0

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. –

+0

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. –

risposta

1

Ho aggiunto supporto iniziale per le tabelle Excel in XLConnect. Trova le ultime modifiche su GitHub a https://github.com/miraisolutions/xlconnect

Nel seguente un piccolo campione:

require(XLConnect) 
sampleFile = "ExcelTables.xlsx" 
wb = loadWorkbook(sampleFile) 
readTable(wb, sheet = "ExcelTable", table = "TableName") 

Nota che le tabelle di Excel sono associati a un foglio. Quindi, per quanto posso vedere, è possibile avere più tabelle con lo stesso nome associate a fogli diversi. Per questo motivo è disponibile lo sheet -argomento su readTable.

+0

Sembra che ci sia uno dei brutti problemi di dipendenza 64/32 bit con RJava. Ho installato la toolchain e la uso regolarmente, ma non ho potuto ottenere la build di xlconnect; Ho provato sia l'errore R. a 32 bit sia quello a 64 bit: impossibile caricare l'oggetto condiviso 'D: /R/R/library/rJava/libs/i386/rJava.dll': Errore LoadLibrary:% 1 ist keine zulässige Win32-Anwendung. Controllerà domani. –

+0

Quasi funziona. Riferirà dettagli su github. –

+0

Vedere https://github.com/miraisolutions/xlconnect/issues/21 e https://github.com/miraisolutions/xlconnect/issues/20 –

2

Lei ha ragione che le definizioni di tabella vengono memorizzati in formato XML.

sampleFile = "ExcelTables.xlsx" 
unzip(sampleFile, exdir = 'test') 
library(XML) 
tData <- xmlParse('test/xl/tables/table1.xml') 
tables <- xpathApply(tData, "//*[local-name() = 'table']", xmlAttrs) 
[[1]] 
      id   name displayName   ref totalsRowShown 
      "1" "TableName" "TableName"  "G1:I4"   "0" 
library(XLConnect) 

readWorksheetFromFile(sampleFile, sheet = "ExcelTable", region = tables[[1]]['ref'], header = TRUE) 
    Name Age AgeGroup 
1 Anton 44  4 
2 Bertha 33  3 
3 Cäsar 21  2 

A seconda della situazione, è possibile cercare nei file XML le quantità appropriate.

+0

Avevo appena implementato qualcosa di simile alla tua soluzione, con alcune cose aggiuntive da http://housesofstones.com/blog/2013/06/20/ read-excel-xlsx-worksheets-in-r-on-any-platform/#. UeaP6417IzY perché temevo che readWorksheetFromFile potesse inciampare sul mio file reale troppo grande. –

+0

Un blog interessante. Usato per essere in grado di rimuovere la password protezione su file excel apportando alcune modifiche ai file xml sottostanti – user1609452

+0

Ci scusiamo per il trasferimento del credito a Martin, ti ho dato invece un +1 –

0

aggiunta successiva:

readxl::readxl possono leggere le tabelle "reali" e, probabilmente, è la soluzione meno fastidioso quando si desidera leggere i frame di dati/Tibbles.

** Dopo il commento @Jamzy ** Ho provato di nuovo e non ho potuto leggere gli intervalli denominati. Falso positivo allora o falso negativo adesso ???

+0

potresti per favore elaborare? Non riesco a trovare alcuna menzione di questo nella documentazione. – Jamzy

+0

No, non ho trovato nei documenti, appena provato. D'altra parte, il fatto che la maggior parte degli altri lettori non supportasse tabelle "reali" non è stato nemmeno documentato. Hai provato? Qualche altra esperienza? –

Problemi correlati