匯入 Excel 檔案

有幾個 R 包可以讀取 excel 檔案,每個檔案使用不同的語言或資源,如下表所示:

R 包 用途
XLSX Java
XLconnect Java
openxlsx C++
readxl C++
RODBC ODBC
GDATA Perl

對於使用 Java 或 ODBC 的軟體包,瞭解系統的詳細資訊非常重要,因為根據你的 R 版本和作業系統,可能存在相容性問題。例如,如果你使用的是 R 64 位,那麼你還必須使用 Java 64 位來使用 xlsxXLconnect

下面提供了使用每個包讀取 excel 檔案的一些示例。請注意,許多軟體包具有相同或非常相似的函式名稱。因此,明確說明包,如 package::function 是很有用的。openxlsx 包需要事先安裝 RTools。

使用 xlsx 包讀取 excel 檔案

library(xlsx)

要匯入工作表的索引或名稱。

xlsx::read.xlsx("Book1.xlsx", sheetIndex=1)

xlsx::read.xlsx("Book1.xlsx", sheetName="Sheet1")

使用 XLconnect 包讀取 Excel 檔案

library(XLConnect)
wb <- XLConnect::loadWorkbook("Book1.xlsx")

# Either, if Book1.xlsx has a sheet called "Sheet1":
sheet1 <- XLConnect::readWorksheet(wb, "Sheet1")
# Or, more generally, just get the first sheet in Book1.xlsx:
sheet1 <- XLConnect::readWorksheet(wb, getSheets(wb)[1])

XLConnect 自動匯入 Book1.xlsx 中嵌入的預定義 Excel 單元格樣式。當你希望格式化工作簿物件並匯出格式完美的 Excel 文件時,這非常有用。首先,你需要在 Book1.xlsx 中建立所需的單元格格式並儲存它們,例如 myHeadermyBodymyPcts。然後,在 R 中載入工作簿後(見上文):

Headerstyle <- XLConnect::getCellStyle(wb, "myHeader")
Bodystyle <- XLConnect::getCellStyle(wb, "myBody")
Pctsstyle <- XLConnect::getCellStyle(wb, "myPcts")

單元格樣式現在儲存在 R 環境中。要將單元格樣式指定給資料的某些範圍,你需要定義範圍,然後指定樣式:

Headerrange <- expand.grid(row = 1, col = 1:8)
Bodyrange <- expand.grid(row = 2:6, col = c(1:5, 8))
Pctrange <- expand.grid(row = 2:6, col = c(6, 7))

XLConnect::setCellStyle(wb, sheet = "sheet1", row = Headerrange$row,
             col = Headerrange$col, cellstyle = Headerstyle)
XLConnect::setCellStyle(wb, sheet = "sheet1", row = Bodyrange$row,
             col = Bodyrange$col, cellstyle = Bodystyle)
XLConnect::setCellStyle(wb, sheet = "sheet1", row = Pctrange$row,
             col = Pctrange$col, cellstyle = Pctsstyle)

請注意,XLConnect 很容易,但格式化可能會變得非常慢。openxlsx 提供了更快,但更麻煩的格式化選項。

使用 openxlsx 包讀取 excel 檔案

可以使用包 openxlsx 匯入 Excel 檔案

library(openxlsx)

openxlsx::read.xlsx("spreadsheet1.xlsx", colNames=TRUE, rowNames=TRUE)

#colNames: If TRUE, the first row of data will be used as column names.
#rowNames: If TRUE, first column of data will be used as row names.

可以通過在 sheet 引數中提供其位置來選擇應該讀入 R 的工作表:

openxlsx::read.xlsx("spreadsheet1.xlsx", sheet = 1)

或者通過宣告其名稱:

openxlsx::read.xlsx("spreadsheet1.xlsx", sheet = "Sheet1")

此外,openxlsx 可以檢測讀取表中的日期列。為了允許自動檢測日期,應將引數 detectDates 設定為 TRUE

openxlsx::read.xlsx("spreadsheet1.xlsx", sheet = "Sheet1", detectDates= TRUE)

使用 readxl 包讀取 excel 檔案

可以使用 readxl 軟體包將 Excel 檔案作為資料框匯入 R

library(readxl)

它可以讀取 .xls.xlsx 檔案。

readxl::read_excel("spreadsheet1.xls")
readxl::read_excel("spreadsheet2.xlsx")

要匯入的工作表可以通過編號或名稱指定。

readxl::read_excel("spreadsheet.xls", sheet = 1)
readxl::read_excel("spreadsheet.xls", sheet = "summary")

引數 col_names = TRUE 將第一行設定為列名。

 readxl::read_excel("spreadsheet.xls", sheet = 1, col_names = TRUE)

引數 col_types 可用於將資料中的列型別指定為向量。

readxl::read_excel("spreadsheet.xls", sheet = 1, col_names = TRUE,
                   col_types = c("text", "date", "numeric", "numeric"))

使用 RODBC 包讀取 excel 檔案

可以使用與 Windows 的 Access 資料庫引擎(ACE)(以前稱為 JET)連線的 ODBC Excel 驅動程式讀取 Excel 檔案。使用 RODBC 包,R 可以連線到此驅動程式並直接查詢工作簿。假設工作表在第一行中維護列標題,並在相似型別的有組織列中維護資料。注意: 此方法僅限於 Windows / PC 計算機,因為 JET / ACE 安裝了 .dll 檔案,而在其他作業系統上不可用。

library(RODBC)

xlconn <- odbcDriverConnect('Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};
                             DBQ=C:\\Path\\To\\Workbook.xlsx')

df <- sqlQuery(xlconn, "SELECT * FROM [SheetName$]")
close(xlconn)

使用此方法連線 SQL 引擎,可以查詢 Excel 工作表,類似於資料庫表,包括 JOINUNION 操作。語法遵循 JET / ACE SQL 方言。注意: 只有資料訪問 DML 語句,特別是 SELECT 可以在工作簿上執行,被認為是不可更新的查詢。

joindf <-  sqlQuery(xlconn, "SELECT t1.*, t2.* FROM [Sheet1$] t1
                             INNER JOIN [Sheet2$] t2
                             ON t1.[ID] = t2.[ID]")

uniondf <-  sqlQuery(xlconn, "SELECT * FROM [Sheet1$]
                              UNION  
                              SELECT * FROM [Sheet2$]")

甚至可以從指向當前工作簿的同一 ODBC 通道查詢其他工作簿:

otherwkbkdf <- sqlQuery(xlconn, "SELECT * FROM 
                                 [Excel 12.0 Xml;HDR=Yes;
                                 Database=C:\\Path\\To\\Other\\Workbook.xlsx].[Sheet1$];")

使用 gdata 包讀取 excel 檔案

這裡的例子