说起Eecel表,让我想起就是一个Excel文件中的各种sheet,有时候sheet数据的更新为了方便,会有分开sheet存储不同时间段的数据,甚至是分开不同的excel文件,在分析数据的时候,要把这么多分散的数据集中在一张sheet似乎是比较让人烦恼的,所以下面就介绍一下如何用R语言高效实现将Excel表的数据批量合并、更新,希望对大家工作有所帮助。
一、合并多个excel文件的表成为一个sheet
举个例子,我们有两个表格,分别是不同人记录的数据,现在我们需要将4个sheet合并成一个sheet。如果表格数量比较少,我们可以采用复制的方式将数据都整理在一个sheet,但如果表格数量太多,每个表格的数据量也很大的时候,这种方式就非常耗时了,下面就用R语言解决这个问题:
需要合并2个excel文件下的共4个sheet
#设置自己路径,且路径中只能有需要合并的excel文件
setwd("C:************")
#查看路径下文件名字
filenames = list.files()
library(readxl)
library(openxlsx)
data2 = data.frame()
#合并多个Excel文件中的多个表成为一个表
for (i in 1:length(filenames)) {
shtnames = excel_sheets(filenames[i]) # 查询excel文件下各个sheet的名字
data1 = data.frame()
for (j in 1:length(shtnames)) {
data = read.xlsx(filenames[i],sheet = j)
data$shtn = rep(shtnames[j],dim(data)[1]) #匹配数据对应sheet名称
data1 = rbind(data1,data)
}
data2 = rbind(data2,data1)
}
执行完代码后就可以得到合并后的数据,如果需要导出可以使用write.xlsx()函数
二、将多个excel文件合并成一个excel文件
比如我们有下面的两个excel文件,现在需要将四个sheet到整合在一个excel表中,如果是一般的excel用户就会点右键选择移动或者复制的功能操作,同样如果是excel文件数量多的话就难办了,继续用R语言来帮助我们解决:
将4个sheet都放在一个excel文件
#设置自己路径,且路径中只能有需要合并的excel文件
filenames = list.files('C:***********')
load = paste0('C:***********',filenames)
listA = list()
sheet1=c()
a=1
library(readxl)
library(openxlsx)
library(stringr)
for (i in 1:length(load)) {
shtnames = excel_sheets(load[i])
for (j in 1:length(shtnames)) {
listA[[a]] = read.xlsx(load[i],sheet = j)
a = a+1
sheet = paste(str_remove(filenames[i],".xlsx"),shtnames[j],sep = "_") #定义sheet名称
sheet1=c(sheet1,sheet)
}
}
names(listA) = sheet1
write.xlsx(listA,"C:**************hb.xlsx")
最后就可以将四个sheet合并,sheet的名称是(原excel名+原sheet名)的组合,避免sheet名重复出错。
三、将多个excel文件(按照同sheet名)合并
有时候面对要将多个excel表合并,且要按照相同的sheet名合并更新,这个如果不会VBA的excel用户,只能乖乖一个个表格对,sheet名相同的数据就粘在一起,想到就难受了。下面就用R语言来处理这种事情,原本可能要10几分钟,现在就几秒的事情。下面是我们的例子:
将三个excel文件合并,且sheet名一样的表合并为一个sheet
#设置路径,且路径中只能有需要合并的excel文件
filenames = list.files('C:***********')
load = paste0('C:************',filenames)
listA = list()
sheet=c()
a=1
library(readxl)
library(openxlsx)
library(stringr)
for (i in 1:length(load)) {
shtnames = excel_sheets(load[i])
for (j in 1:length(shtnames)) {
listA[[a]] = read.xlsx(load[i],sheet = j)
a = a+1
sheet=c(sheet,shtnames[j])
}
}
names(listA) = sheet
list1=list()
A = unique(sheet)
for (i in 1:length(A)) {
list1[[i]] = as.data.frame(do.call(rbind,listA[names(listA)==A[i]]))
}
names(list1) = A
write.xlsx(list1,"C:************对应表合.xlsx")
上面介绍的几种情况,如果觉得excel处理用麻烦,不仿试试R语言。