Um "doppelte" schließen Anfrage zu vermeiden: Ich weiß, wie Excel benannte Bereiche lesen; Beispiele finden Sie im folgenden Code. Hier geht es um "echte" Tabellen in Excel.Lesen Sie Excel-Tabellen, nicht einfach benannte Bereiche
Excel2007 und später haben das nützliche Konzept von Tabellen: Sie können Bereiche in Tabellen umwandeln und Ärger beim Sortieren und Umordnen vermeiden. Wenn Sie eine Tabelle in einem Excel-Bereich erstellen, erhält sie einen Standardnamen (Tabelle1
in der deutschen Version, TableName
im folgenden Beispiel), Sie können aber auch einfach den Bereich der Tabelle benennen (TableAsRangeName
); Wie durch die Symbole im Excel-Bereichsnamen-Editor angezeigt, scheinen diese beiden Elemente unterschiedlich behandelt zu werden.
Ich konnte diese Tabellen (im engeren Sinne) nicht von R lesen. Die einzige bekannte Problemumgehung ist die Verwendung von CSV-Zwischenspeicher oder das Konvertieren der Tabelle in einen normalen benannten Bereich, der bei der Verwendung unangenehme irreversible Nebenwirkungen hat Spaltennamen in Zellbezügen; Diese werden in die A1-Notation konvertiert.
Das folgende Beispiel zeigt das Problem. Sie Meilenzahl kann mit verschiedenen Kombinationen von 32/64 Bit ODBC-Treiber und 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
Meine Wette ist, dass der einfachste Weg ist, zurück zur Excel-Arbeitsmappe zu gehen und ein neues Blatt zu erstellen, das einen einfachen Satz von Verknüpfungen (oder Formeln) zu den Zellen der benannten Tabelle enthält. Dann sagen Sie 'R', um von diesem Arbeitsblatt zu lesen. –
XLConnect unterstützt noch keine Excel-Tabellen. Darüber hinaus werden benannte Bereiche basierend auf Tabellenformeln noch nicht unterstützt. Ich werde jedoch darauf eingehen, um zu sehen, was an dieser Front getan werden kann. –
Danke, Martin Studer (Autor von XLConnect). Gestern habe ich etwas in XML gegraben und festgestellt, dass Tabellen in einem extra Verzeichnis Bereichen zugeordnet sind. Bitte posten Sie hier, falls Sie es zur Arbeit bringen. –