|
主要用到了 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:https://cran.r-project.org/mirrors.html。
- 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)
复制代码
表格附件: |
|