【问题标题】:Copy all sheet of a workbook to another file将工作簿的所有工作表复制到另一个文件
【发布时间】:2021-09-01 21:47:52
【问题描述】:

我想对我的所有 .xlsx 执行以下步骤:

  1. 复制第一张纸

  2. 将复制的工作表粘贴到另一个文件

  3. 将粘贴的表格重命名为文件名

    1. 重复第 1 步并将工作表复制到第 2 步的同一文件中,重复第 3 步

我可以用 R 完成这些步骤吗?我的 .xlsx 包含 img 并且单元格已格式化。

谢谢

【问题讨论】:

  • 看看openxlsx 包。

标签: r


【解决方案1】:

这是基于 RDCOMClient 的另一种方法:

library(RDCOMClient)
xlApp <- COMCreate("Excel.Application")
path_Excel_File1 <- "C:\\...\\File1.xlsx"
path_Excel_File2 <- "C:\\...\\File2.xlsx"
xlWbk1 <- xlApp$Workbooks()$Open(path_Excel_File1)
xlWbk2 <- xlApp$Workbooks()$Open(path_Excel_File2)
nb_Sheets <- xlWbk1$Sheets()$Count()

for(l in 1 : nb_Sheets)
{
  wbSheet <- xlWbk1$Worksheets(l)$Copy(after = xlWbk2$Worksheets(l))
}

xlWbk2$SaveAs("C:\\...\\FileMerged12.xlsx")
xlWbk2$Close()
xlApp$Quit()

【讨论】:

    【解决方案2】:

    您的答案在于使用xlsx 包。

    此链接提供了很好的指导

    http://www.sthda.com/english/wiki/r-xlsx-package-a-quick-start-guide-to-manipulate-excel-files-in-r

    【讨论】:

    • 这个方法不起作用,它会创建一个包含我的文件列表的工作表。
    【解决方案3】:

    使用XLConnect 包(需要Java)。这个答案的动机是by the method in another answer on this site

    file <- "Book1.xlsx"
    
    # install.packages("XLConnect")
    library(XLConnect)
    
    wb <- loadWorkbook(file)    
    sheets <- readWorksheet(wb,getSheets(wb))
    
    for(x in getSheets(wb)){
        path <- paste0(x,".xlsx")
        out <- loadWorkbook(path,create = TRUE)
        createSheet(out,x)
        writeWorksheet(out,sheets[[x]],x)
        saveWorkbook(out)
    }
    

    【讨论】:

    • 我不确定我创建两个答案的过程是否正确。这两个答案的方法(和使用的包)不同,为什么我创建了两个答案。如果正确的方法是将两个版本附加在同一个答案中,请告诉我,我会这样做。
    • 我的工作表包含布局和 img,此脚本不会导入我的所有元素。
    • 我非常怀疑这可以在 R 中完成,因为它是用于数据处理而不是文件处理。我建议您编辑您的问题,详细说明您的工作表包含布局和图像。
    【解决方案4】:

    使用 gdata 包(需要 Perl)。这些文件在此处写入.csv-files。从gdata 我们使用函数sheetNames 获取所有工作表名称并使用read.xls 提取它们。这些文件在工作目录中创建。

    file <- "Book1.xlsx"  ## File to extract from
    
    # install.packages("gdata")
    library(gdata)
    sheetnames <- sheetNames(file)
    
    sheets <- lapply(setNames(sheetnames,sheetnames),read.xls,xls = file)
    
    for(x in sheetnames){
        write.csv(sheets[[x]],paste0(x,".csv"),row.names = FALSE)
    }
    

    【讨论】:

    • 我需要 .xlsx 而不是 .csv
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多