• R 脚本读取汇总 Excel 表格数据


    主要用到了 xlsxrJava 包,打开 Excel 文件,读取各表格数据,再写入到汇总表。

    下图为处理前的原始数据表格:

    处理前

    下图为处理后的数据:

    处理后

    代码实现

    安装&加载包的函数实现installed.packages() 函数获取所有已安装的包,用以排除已安装的包。install.packages() 函数安装指定的包。library() 加载引入包。

    loadLibrary <- function(pkgs) {
        uninstalledPkgs <- pkgs[!(pkgs %in% installed.packages()[, "Package"])]
        
        if (length(uninstalledPkgs)) {
            install.packages(uninstalledPkgs)
        }
        
        for (pkg in pkgs) {
            library(pkg, character.only = TRUE, quietly = TRUE)
        }
    }
    
    

    自定义设置。涉及表格文件路径、汇总表名等。

    setwd("/path/to/work/dir")            # 工作目录
    fileName = "summary_sheet_demo.xlsx"  # 处理的表格文件
    summaryName = "汇总"                  # 汇总的 sheet 表名
    summarySheet = FALSE                  # 对象变量、忽略
    startRow = 2                          # 汇总表中操作起始行
    

    设置 CRAN 源。官方默认源可能比较慢,所以选择国内的源很重要。此处选择了清华 CRAN 源,其他的可参考 CRAN Mirrors

    options(repos = "https://mirrors.tuna.tsinghua.edu.cn/CRAN/")
    

    加载依赖包。用到了上述写的安装加载包的函数。

    loadLibrary(c("xlsx", "rJava"))
    

    打开工作表loadWorkbook() 打开指定路径的表格文件,并加载到工作簿对象中。

    wb <- loadWorkbook(fileName)
    

    遍历查询&汇总数据

    # 获取所有表格
    sheets <- getSheets(wb)
    
    # 循环所有表格,找出需要写入的表
    for (sheet in sheets) {
        sheetName <- sheet$getSheetName()
        if (sheetName == summaryName) {
            summarySheet <- sheet
        }
    }
    
    if (summarySheet == FALSE) {
        stop(paste("表:", summaryName, "未找到"))
    }
    
    # 指定Date格式(此处可忽略)
    # options(xlsx.date.format='yyyy/MM/dd')
    
    # 遍历所有表格
    for (sheet in sheets) {
        # 过滤掉需写入的表
        sheetName <- sheet$getSheetName()
        if (sheetName == summaryName) {
            next
        }
        
        # 获取表格【内容行数】
        rowNum <- sheet$getLastRowNum()
        print(paste("表名:", sheetName, "总共:", rowNum, "行,", sep = " "))
        
        # 读取表格内容 参数 colClasses 指定每列的类型(实际是指定处理该列的类/对象)
        data <- read.xlsx2(fileName, sheetName = sheetName, header = FALSE, startRow = 2, colClasses = c("character", 
            "Date", "integer", "integer", rep("numeric", 2), "integer"))
        print(data)
        
        # 将表格内容写入汇总的那张表
        addDataFrame(data, summarySheet, col.names = FALSE, row.names = FALSE, startRow = startRow)
        
        # 累加行数
        startRow <- startRow + rowNum
    }
    

    把对象内容写入文件中保存

    saveWorkbook(wb, fileName)
    

    完整代码

    # 包加载/安装包
    loadLibrary <- function(pkgs) {
        uninstalledPkgs <- pkgs[!(pkgs %in% installed.packages()[, "Package"])]
        
        if (length(uninstalledPkgs)) {
            install.packages(uninstalledPkgs)
        }
        
        for (pkg in pkgs) {
            library(pkg, character.only = TRUE, quietly = TRUE)
        }
    }
    
    # 自定义配置
    setwd("/path/to/work/dir")            # 工作目录
    fileName = "summary_sheet_demo.xlsx"  # 处理的表格文件
    summaryName = "汇总"                  # 汇总的 sheet 表名
    summarySheet = FALSE                  # 对象变量、忽略
    startRow = 2                          # 汇总表中操作起始行
    
    # 设置CRAN
    options(repos = "https://mirrors.tuna.tsinghua.edu.cn/CRAN/")
    
    # 加载依赖包
    loadLibrary(c("xlsx", "rJava"))
    
    # 打开Excel表格
    wb <- loadWorkbook(fileName)
    # 获取所有表格
    sheets <- getSheets(wb)
    
    # 循环所有表格,找出需要写入的表
    for (sheet in sheets) {
        sheetName <- sheet$getSheetName()
        if (sheetName == summaryName) {
            summarySheet <- sheet
        }
    }
    
    if (summarySheet == FALSE) {
        stop(paste("表:", summaryName, "未找到"))
    }
    
    # 指定Date格式(此处可忽略)
    # options(xlsx.date.format='yyyy/MM/dd')
    
    # 遍历所有表格
    for (sheet in sheets) {
        # 过滤掉需写入的表
        sheetName <- sheet$getSheetName()
        if (sheetName == summaryName) {
            next
        }
        
        # 获取表格【内容行数】
        rowNum <- sheet$getLastRowNum()
        print(paste("表名:", sheetName, "总共:", rowNum, "行,", sep = " "))
        
        # 读取表格内容 参数 colClasses 指定每列的类型(实际是指定处理该列的类/对象)
        data <- read.xlsx2(fileName, sheetName = sheetName, header = FALSE, startRow = 2, colClasses = c("character", 
            "Date", "integer", "integer", rep("numeric", 2), "integer"))
        print(data)
        
        # 将表格内容写入汇总的那张表
        addDataFrame(data, summarySheet, col.names = FALSE, row.names = FALSE, startRow = startRow)
        
        # 累加行数
        startRow <- startRow + rowNum
    }
    
    # 最后需要把对象内容写入文件中
    saveWorkbook(wb, fileName)
    

    表格附件

    summary_sheet_demo.xlsx


    原文地址: https://shockerli.net/post/r-script-to-read-summary-excel/
    更多文章请访问我的个人博客: https://shockerli.net

  • 相关阅读:
    通过Xshell连接CentOS虚拟机
    Linux学习笔记
    JAVA学习摘要
    4k 对齐,你准备好了吗?
    图片种子制作方法,利用图片上传附件
    利用京东服务免费打造属于自己的网站
    PE制作实录 —— 补充说明
    PE制作实录 —— 定义我的 PE 工具箱
    浏览器 — 各项基准测试
    Windows 8.1 归档 —— Step 3 软件的选择与安装
  • 原文地址:https://www.cnblogs.com/shockerli/p/r-script-to-read-summary-excel.html
Copyright © 2020-2023  润新知