7

「重複した」クローズ リクエストを回避するには: Excel の名前付き範囲の読み方を知っています。以下のコードに例を示します。これは、Excel の「実際の」テーブルに関するものです。

Excel 2007 以降には、テーブルの便利な概念があります。範囲をテーブルに変換し、並べ替えや再配置の手間を省くことができます。Excel の範囲内にテーブルを作成すると、既定の名前 (次の例でTabelle1はドイツ語版TableName) が付けられますが、テーブルの範囲に単純に名前を付けることもできます ( TableAsRangeName)。Excel の範囲名エディターのアイコンで示されているように、これら 2 つは異なる方法で扱われているようです。

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
4

3 に答える 3

4

XLConnectに Excel テーブルの初期サポートを追加しました。https://github.com/miraisolutions/xlconnectの github で最新の変更を見つけてください。

以下に小さなサンプルを示します。

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

Excel テーブルはシートに関連付けられていることに注意してください。私が見る限り、同じ名前の複数のテーブルが異なるシートに関連付けられている可能性があります。このため、 にはsheet- 引数がありreadTableます。

于 2013-07-17T20:04:32.383 に答える
3

テーブル定義が 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

状況に応じて、適切な数量を XML ファイルで検索できます。

于 2013-07-17T09:31:14.093 に答える