跳转到帖子
  • 游客您好,欢迎来到黑客世界论坛!您可以在这里进行注册。

    赤队小组-代号1949(原CHT攻防小组)在这个瞬息万变的网络时代,我们保持初心,创造最好的社区来共同交流网络技术。您可以在论坛获取黑客攻防技巧与知识,您也可以加入我们的Telegram交流群 共同实时探讨交流。论坛禁止各种广告,请注册用户查看我们的使用与隐私策略,谢谢您的配合。小组成员可以获取论坛隐藏内容!

    TheHackerWorld官方

  • 0

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


HACK1949

问题

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

5fe7eb0874622.png

主要用到了 xlsx 和 rJava 包,打开 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)
链接帖子
意见的链接
分享到其他网站

这个问题有0个答案

推荐的帖子

此问题没有答案

黑客攻防讨论组

黑客攻防讨论组

    You don't have permission to chat.
    • 最近浏览   0位会员

      • 没有会员查看此页面。
    ×
    ×
    • 创建新的...