设为首页收藏本站

EPS数据狗论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1658|回复: 0

[其他] R 脚本读取汇总 Excel 表格数据

[复制链接]

35

主题

369

金钱

516

积分

初级用户

发表于 2019-7-1 16:21:36 | 显示全部楼层 |阅读模式

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

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

下图为处理后的数据:
2.png

代码实现
安装&加载包的函数实现。installed.packages() 函数获取所有已安装的包,用以排除已安装的包。install.packages() 函数安装指定的包。library() 加载引入包。
  1. loadLibrary <- function(pkgs) {
  2.     uninstalledPkgs <- pkgs[!(pkgs %in% installed.packages()[, "Package"])]
  3.    
  4.     if (length(uninstalledPkgs)) {
  5.         install.packages(uninstalledPkgs)
  6.     }
  7.    
  8.     for (pkg in pkgs) {
  9.         library(pkg, character.only = TRUE, quietly = TRUE)
  10.     }
  11. }
复制代码


自定义设置。涉及表格文件路径、汇总表名等。
  1. setwd("/path/to/work/dir")            # 工作目录
  2. fileName = "summary_sheet_demo.xlsx"  # 处理的表格文件
  3. summaryName = "汇总"                  # 汇总的 sheet 表名
  4. summarySheet = FALSE                  # 对象变量、忽略
  5. startRow = 2                          # 汇总表中操作起始行
复制代码

设置 CRAN 源。官方默认源可能比较慢,所以选择国内的源很重要。此处选择了清华 CRAN 源,其他的可参考 CRAN Mirrors:https://cran.r-project.org/mirrors.html。
  1. options(repos = "https://mirrors.tuna.tsinghua.edu.cn/CRAN/")
复制代码

加载依赖包。用到了上述写的安装加载包的函数。
  1. loadLibrary(c("xlsx", "rJava"))
复制代码

打开工作表。loadWorkbook() 打开指定路径的表格文件,并加载到工作簿对象中。
  1. wb <- loadWorkbook(fileName)
复制代码

遍历查询&汇总数据。
  1. # 获取所有表格
  2. sheets <- getSheets(wb)

  3. # 循环所有表格,找出需要写入的表
  4. for (sheet in sheets) {
  5.     sheetName <- sheet$getSheetName()
  6.     if (sheetName == summaryName) {
  7.         summarySheet <- sheet
  8.     }
  9. }

  10. if (summarySheet == FALSE) {
  11.     stop(paste("表:", summaryName, "未找到"))
  12. }

  13. # 指定Date格式(此处可忽略)
  14. # options(xlsx.date.format='yyyy/MM/dd')

  15. # 遍历所有表格
  16. for (sheet in sheets) {
  17.     # 过滤掉需写入的表
  18.     sheetName <- sheet$getSheetName()
  19.     if (sheetName == summaryName) {
  20.         next
  21.     }
  22.    
  23.     # 获取表格【内容行数】
  24.     rowNum <- sheet$getLastRowNum()
  25.     print(paste("表名:", sheetName, "总共:", rowNum, "行,", sep = " "))
  26.    
  27.     # 读取表格内容 参数 colClasses 指定每列的类型(实际是指定处理该列的类/对象)
  28.     data <- read.xlsx2(fileName, sheetName = sheetName, header = FALSE, startRow = 2, colClasses = c("character",
  29.         "Date", "integer", "integer", rep("numeric", 2), "integer"))
  30.     print(data)
  31.    
  32.     # 将表格内容写入汇总的那张表
  33.     addDataFrame(data, summarySheet, col.names = FALSE, row.names = FALSE, startRow = startRow)
  34.    
  35.     # 累加行数
  36.     startRow <- startRow + rowNum
  37. }
复制代码


把对象内容写入文件中保存。
  1. saveWorkbook(wb, fileName)
复制代码



完整代码
  1. # 包加载/安装包
  2. loadLibrary <- function(pkgs) {
  3.     uninstalledPkgs <- pkgs[!(pkgs %in% installed.packages()[, "Package"])]
  4.    
  5.     if (length(uninstalledPkgs)) {
  6.         install.packages(uninstalledPkgs)
  7.     }
  8.    
  9.     for (pkg in pkgs) {
  10.         library(pkg, character.only = TRUE, quietly = TRUE)
  11.     }
  12. }

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

  19. # 设置CRAN
  20. options(repos = "https://mirrors.tuna.tsinghua.edu.cn/CRAN/")

  21. # 加载依赖包
  22. loadLibrary(c("xlsx", "rJava"))

  23. # 打开Excel表格
  24. wb <- loadWorkbook(fileName)
  25. # 获取所有表格
  26. sheets <- getSheets(wb)

  27. # 循环所有表格,找出需要写入的表
  28. for (sheet in sheets) {
  29.     sheetName <- sheet$getSheetName()
  30.     if (sheetName == summaryName) {
  31.         summarySheet <- sheet
  32.     }
  33. }

  34. if (summarySheet == FALSE) {
  35.     stop(paste("表:", summaryName, "未找到"))
  36. }

  37. # 指定Date格式(此处可忽略)
  38. # options(xlsx.date.format='yyyy/MM/dd')

  39. # 遍历所有表格
  40. for (sheet in sheets) {
  41.     # 过滤掉需写入的表
  42.     sheetName <- sheet$getSheetName()
  43.     if (sheetName == summaryName) {
  44.         next
  45.     }
  46.    
  47.     # 获取表格【内容行数】
  48.     rowNum <- sheet$getLastRowNum()
  49.     print(paste("表名:", sheetName, "总共:", rowNum, "行,", sep = " "))
  50.    
  51.     # 读取表格内容 参数 colClasses 指定每列的类型(实际是指定处理该列的类/对象)
  52.     data <- read.xlsx2(fileName, sheetName = sheetName, header = FALSE, startRow = 2, colClasses = c("character",
  53.         "Date", "integer", "integer", rep("numeric", 2), "integer"))
  54.     print(data)
  55.    
  56.     # 将表格内容写入汇总的那张表
  57.     addDataFrame(data, summarySheet, col.names = FALSE, row.names = FALSE, startRow = startRow)
  58.    
  59.     # 累加行数
  60.     startRow <- startRow + rowNum
  61. }

  62. # 最后需要把对象内容写入文件中
  63. saveWorkbook(wb, fileName)
复制代码


表格附件:

表格附件.xlsx.zip

10.31 KB, 下载次数: 0, 下载积分: 贡献 -1

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

客服中心
关闭
在线时间:
周一~周五
8:30-17:30
QQ群:
653541906
联系电话:
010-85786021-8017
在线咨询
客服中心

意见反馈|网站地图|手机版|小黑屋|EPS数据狗论坛 ( 京ICP备09019565号-3 )   

Powered by BFIT! X3.4

© 2008-2028 BFIT Inc.

快速回复 返回顶部 返回列表