如何在R中将具有多个工作表的多个excel文件合并到具有多个工作表的单个excel文件中

时间:2019-09-21 13:46:04

标签: r

我有多个文件名,例如C1.xlsx; C2.xlsx; C3.xlsx; C4.xlsx等,其中每个文件都有多个工作表,例如C_1; C_2; C_3等等,也就是说,所有文件中的工作表名称均相同,而所有文件中的工作表数均相同。 现在,我需要合并所有文件中具有相似工作表名称的所有工作表。此外,每个工作表中的列名都相同。

我正在使用以下代码读取文件夹中的所有excel文件

import os
import shutil
import subprocess

dest = '/path/to/destinationFolder'
source = '/path/to/directory/from/docFiles'

for root, subdirs, files in os.walk(source):
    for file in files:
    path = os.path.join(root, file)
    shutil.move(path, dest)

for filename in os.listdir(dest):
    if filename.endswith('.doc'):
    subprocess.call(['soffice', '--headless', '--convert-to', '--outdir', '/home/allDocxFiles', filename])
    subprocess.call(['rm', 'filename])

我拥有的excel文件如下所示:

library(readxl)

files <- list.files(path = "~/Dropbox/Data/multiple_files", pattern = 
"*.xlsx", full.names = T)

tbl <- sapply(files, read_excel, simplify=FALSE) %>% 
bind_rows(.id = "id")

excel文件中的组合工作表应如下所示:

C1.xlsx (worksheet:C_1)   (worksheet:C_2)   (worksheet:C_3)
A  B  C  D  E               A  B  C  D  E       A  B  C  D  E
1  4  6  8  C_1             2  4  6  1  C_2     1  4  6  8  C_3
3  56 7  8  C_1             2  3  6  8  C_2     2  3  5  6  C_3
2  4  6  1  C_1             7  8  3  4  C_2     3  4  6  7  C_3

C2.xlsx (worksheet:C_1)   (worksheet:C_2)   (worksheet:C_3)
A  B  C  D  E               A  B  C  D  E      A  B  C  D  E
3  7  1  3  C_1             1  4  7  1  C_2    1  9  6  1  C_3
1  6  9  2  C_1             2  3  6  8  C_2    2  3  5  6  C_3
2  4  6  1  C_1             7  1  3  4  C_2    3  4  2  7  C_3

C3.xlsx (worksheet:C_1)   (worksheet:C_2)   (worksheet:C_3)
A  B  C  D  E               A  B  C  D  E      A  B  C  D  E
9  4  6  8  C_1             1  4  6  1  C_2    1  4  1  1  C_3
3  5  7  1  C_1             1  3  6  4  C_2    2  1  5  1  C_3
2  7  6  1  C_1             7  7  3  4  C_2    3  4  6  7  C_3

我正在寻找代码,以首先读取文件夹中的所有excel文件,然后合并工作表

预先感谢

2 个答案:

答案 0 :(得分:1)

openxlsxwritexl将起作用。我认为writexl快一点。 从文档中:

  

将数据帧写入xlsx文件。用(多个)创建一个xlsx   命名工作表,只需将x设置为数据帧的命名列表即可。

以下代码“应该”起作用:

spreadsheets <- purrr::map(files, function(.x){
  .spreadsheet <- purrr::map(1:3, .file = .x, function(.x, .file){
    .sheet <- readxl::read_xlsx(.file, sheet = .x)
  })
})
bound_ss <- purrr::map(1:3, .spreadsheet = spreadsheets, function(.x, .spreadsheet){
    do.call("rbind", purrr::map(.spreadsheet,.ind = .x, function(.x, .ind){
      purrr::pluck(.x, .ind)
      }))
})
# Should be a list of three sheets in the long format you expect
names(bound_ss) <- paste0("Sheet", 1:3)
  writexl::write_xlsx(bound_ss, path = "~/Dropbox/Data/multiple_files/sheet.xlsx")

## Sorting based on a column C1
library(magrittr)
bound_ss %<>% purrr::map(~ dplyr::arrange(.x, C1)) # ascending
bound_ss %<>% purrr::map(~ dplyr::arrange(.x, dplyr::desc(C1))) # descending

答案 1 :(得分:1)

为了订购数据框列表,我使用了以下代码

sorted_bound_ss <- lapply(combined, function(C_1){
 C_1[order(C_1$A),]
})

它起作用了....