[R]如何使用R讀取Excel檔案

很多資料會使用excel檔案儲存,
這邊介紹如何使用R讀取主要三種常用的excel附檔名。

  1. csv
  2. xlsx
  3. xls

1.csv

csv是最簡單的,不需要install任何package,read.csv

d <- read.csv("file.csv", stringsAsFactors = FALSE) 

假如很不幸,上面的程式碼讀取後你碰到長得像這樣的錯誤訊息

Error in type.convert(data[[i]], as.is = as.is[i], dec = dec, numerals = numerals,  : invalid multibyte string at '<e8><8a><b1>?<ae>'

那就是碰上了編碼錯誤
這時候別緊張,只要加上fileEncoding這個參數就好,

d <- read.csv(paste0("file.csv"), stringsAsFactors = FALSE, fileEncoding = "UTF-8") 

問題應該就可以被解決了。

2.xlsx

讀取xlsx檔案時依據情況,有兩個套件我會使用,

這兩個套件都可以儲存多個sheet,
對儲存格做顏色、合併、篩選等等一般可以做的事都可以用程式碼去做。

(1)openxlsx

讀檔

library(openxlsx)

# 可以使用sheet參數選擇要的sheet,預設是第一個sheet
d <- read.xlsx("file.xlsx", sheet = sheetName)

寫檔

library(openxlsx)

### 整個xlsx只有一張sheet寫檔可以簡單的使用write.xlsx就好
write.xlsx(d, file = "file.xlsx")


### 有多個sheet要寫入檔案,或是要調整sheet的style
wb <- createWorkbook()

# 增加sheet
addWorksheet(wb, "sheetName")

# 設定欄位寬度
setColWidths(wb, sheet, cols = c(1:4), widths = c(rep(25, 3), 30))

# 增加style
headerStyle <- createStyle(fgFill = "yellow", border = "TopBottomLeftRight", halign = "center", textDecoration = "bold", fontSize = 12)

addStyle(wb, sheet = sheet, headerStyle, row = 1, cols = 4, gridExpand = TRUE, stack = TRUE)

# 加上filter
addFilter(wb, 1, row = 1, cols = 1:ncol(d))

# 寫檔
writeData(wb, sheet = sheet, d)

# 存檔
saveWorkbook(wb, "file.xlsx", overwrite = TRUE)

(2)XLConnect

至於XLConnect我是在想要使用資料驗證(data validation)裡的「清單」功能時想要克服的。

一開始想要直接使用openxlsx的dataValidation function,
但一直失敗,且找到這裡說明 list 這個功能無法發揮,
所以我想到先儲存一個 template,將我需要的資料驗證清單做好,
再使用 loadworkbook 的方法就可以保留 excel 裡原本的樣式。

原本是直接使用 openxlsx 這個 library 的 loadWorkbook,
但在調整顏色時一直會有 error 無法解決,
在改用 XLConnect 這個 library 後就成功使用我想要的cells style與保留資料驗證清單了。

另外一個碰到的狀況是我也是要使用一份 template 的樣式,
使用openxlsx和XLConnect的loadWorkbook時都遇到像這樣的錯誤

Error in substring(x[ind], so, eo) : 
  invalid multibyte string at '<e6><96><b0>蝝唳<98><ab><94>"/>'

看起來像是編碼上的錯誤,但這份檔案上完全沒有中文,
後來我甚至存一份空白的excel檔案都還是會有錯誤。

我將其他可以使用 loadWorkbook 這個 function 的 xlsx 丟進 Notepad++ 看,
發現可以讀的檔案是Macintosh(CR)

Macintosh(CR).PNG

不能讀的檔案是Unix(LF)

Unix(LF).PNG

但是,將 template 儲存成 Macintosh(CR) 後,
openxlsx的 loadWorkbook function 還是有同樣的 error,
而 XLConnect 的錯誤則解除了。

程式碼範例,

library(XLConnect)

# 讀取template
wb <- loadWorkbook("file.xlsx")

# d是要儲存的dataframe,getSheets(wb)是sheet的名稱
writeWorksheet(wb, d, getSheets(wb), startRow = 7, startCol = 1, header = FALSE)

# 設style
cs <- createCellStyle(wb)
# 邊框
setBorder(cs, side = c("all"), type = XLC$"BORDER.THIN", color = c(XLC$"COLOR.BLACK"))
setCellStyle(wb, sheet = getSheets(wb), row = 7:(7+nrow(d)), col = 1, cellstyle = cs)

# 存檔
saveWorkbook(wb, file = "savefile.xlsx")

3.xls

xls用的是readxl套件,是R界有名的ggplot2作者Hadley Wickham所寫。

下載完後只要一行指令就好,

library(readxl)
saleslead <- read_excel(paste0(PATH, "2018 sales lead report (for TM only).xls"), sheet = "Raw Data")

但要注意的是屬性問題

其他更多 library 的 function 都可以去CRAN找哦!