R读取Excel 2007版本(及以上)文件

从本地读取的文档时,除了用read.csvread.table读取.csv或者.txt文件以外,还不可避免的碰到大量需要从.xlsx格式的文件中读取数据的情况,将其转换格式为.csv或者.txt当然是一种方法,曲径通幽的存入数据库,再用R调用数据库内容亦可,但是最直接的方式无非还是直接读取。下面是几种常见读取方式的比较,至于最终选择哪种读取方式,见仁见智。

xlsx

我们先随机生成一个文件,将它写入demo.xlsx文件中。我们将用到xlsx包中的write.xlsx()函数。

1
2
3
4
5
6
7
8
9
10
11
12
library(xlsx)
A = sample(LETTERS, 1000, replace = T)
B = rnorm(1000)
C = paste(sample(LETTERS, 1000, replace = T),
sample(LETTERS, 1000, replace = T),
sample(LETTERS, 1000, replace = T),
sep = "")
D = rpois(1000, .2)
df <- data.frame(A, B, C, D)
write.xlsx(df, "demo.xlsx", sheetName = "demo", row.names = F)

这个包的依赖包包括rJavaxslxjars,在使用本包之前必须保证Java或jdk已经安装好、环境变量也已设置好。
xlsx提供两种读取的函数:read.xlsx()read.xlsx2(),前者可直接读取,并自动判断数据类型;后者读取速度更快,但是需要手动补充每列的数据类型。

1
system.time(read.xlsx("demo.xlsx", sheetIndex = 1))
##    user  system elapsed 
##    6.83    0.07    4.37
1
2
system.time(read.xlsx2("demo.xlsx", sheetIndex = 1,
colClasses = rep(c("numeric","character"),2)))
##    user  system elapsed 
##    0.66    0.04    0.22

可以看出第二种读取方式比第一种要快很多。

XLConnect

此包同样基于java:

1
2
3
4
library(XLConnect)
wb <- loadWorkbook("demo.xlsx")
system.time(readWorksheet(wb, sheet = "demo", header = T))
##    user  system elapsed 
##    0.36    0.03    0.14

xlsx包的第二个读取函数相比,速度更快。
xlsx包里有read.xlsx()write.xlsx()一对函数,同样的,XLConnect包里也有与readWorksheet()对应的writeWorksheet()函数。


补充于 12/7/2015:
此函数无法自动将excel中的公式转换为数值。
如果一个excel文件中含有公式,则会报错。


gdata

这个包是基于Perl语言的。Linux和Mac系统自带Perl但是Windows系统需要自行安装。如果R无法自动获取Perl编译器,则需要手动指定编译器的位置。

1
2
3
4
library(gdata)
perl_int <- "D:/Programming Tools/Perl64/bin/perl5.20.2.exe"
system.time(read.xls("demo.xlsx", sheet = 1, header = TRUE, perl = perl_int))
##    user  system elapsed 
##    0.00    0.00    1.92

同样也是很快速的读取方法。

其它包

  • 32位系统中,可以使用RODBC包的odbcConnectExcel()函数来读取数据。但是这个函数只能用于32位系统,64位无法使用。
  • xlsReadWrite包中的read.xls()函数可用于读取.xls格式的文件,但无法读取.xlsx文件。

Reference

Read Excel files from R