如何在R中合并含图片的Excel文件并保留图片输出?
在R中合并含图片的Excel文件并保留图片位置的可行方案
当然可行,但常规依赖readxl/writexl仅读取单元格数值的方法无法保留图片——因为Excel中的图片属于独立的形状对象,不会被导入到DataFrame中。下面提供两种可实现需求的方案,结合你的场景选择:
方案一:使用openxlsx操作工作簿对象(推荐)
openxlsx可以直接读取Excel工作簿的完整结构(包括图片、形状),并支持复制图片到新工作簿的对应位置。
步骤1:安装并加载依赖包
install.packages("openxlsx") library(openxlsx)
步骤2:读取原Excel工作簿并合并数据
# 加载两个源工作簿 wb1 <- loadWorkbook("Book1.xlsx") wb2 <- loadWorkbook("Book2.xlsx") # 读取表格数据并合并(列名相同直接行合并) df1 <- read.xlsx(wb1, sheet = 1) df2 <- read.xlsx(wb2, sheet = 1) merged_df <- rbind(df1, df2)
步骤3:创建合并工作簿并写入数据
wb_merged <- createWorkbook() addWorksheet(wb_merged, "合并结果") writeData(wb_merged, sheet = "合并结果", x = merged_df)
步骤4:复制原工作簿中的图片到对应位置
需要根据原图片的行位置,对第二个文件的图片做行偏移(因为第一个文件的数据占了前nrow(df1)行):
# 获取第一个文件的图片信息 shapes1 <- getShapes(wb1, sheet = 1) # 复制第一个文件的图片到合并工作簿 for (shape in shapes1) { insertImage(wb_merged, sheet = "合并结果", file = shape$path, startRow = shape$startRow, startCol = shape$startCol, height = shape$height, width = shape$width) } # 获取第二个文件的图片信息并偏移行号 row_offset <- nrow(df1) shapes2 <- getShapes(wb2, sheet = 1) for (shape in shapes2) { insertImage(wb_merged, sheet = "合并结果", file = shape$path, startRow = shape$startRow + row_offset, startCol = shape$startCol, height = shape$height, width = shape$width) }
步骤5:保存合并后的Excel文件
saveWorkbook(wb_merged, "合并结果.xlsx", overwrite = TRUE)
方案二:使用officer处理精细的Excel对象
如果你的图片是嵌入在单元格内(如批注图片、单元格关联图片),officer可以更精准地读取和控制Excel中的所有形状元素:
install.packages(c("officer", "readxl")) library(officer) library(readxl) # 读取数据 df1 <- read_excel("Book1.xlsx") df2 <- read_excel("Book2.xlsx") merged_df <- rbind(df1, df2) # 创建新的Excel文档 doc <- read_xlsx("Book1.xlsx") %>% body_add_table(merged_df, style = "table_template") # 复制Book1的图片 wb1 <- read_xlsx("Book1.xlsx", read_formulas = FALSE) shapes1 <- wb1$shapes for (shape in shapes1) { doc <- body_add_img(doc, src = shape$content, style = shape$style) } # 复制Book2的图片并偏移位置 wb2 <- read_xlsx("Book2.xlsx", read_formulas = FALSE) shapes2 <- wb2$shapes row_offset <- nrow(df1) for (shape in shapes2) { # 调整shape的位置参数(需根据实际情况修改坐标) shape$top <- shape$top + row_offset * 15 # 假设每行高度15磅 doc <- body_add_img(doc, src = shape$content, style = shape$style) } # 保存文档 print(doc, target = "合并结果.xlsx")
关键注意事项
- 确保原Excel中的图片是嵌入而非链接形式,否则会因路径失效导致图片无法复制
- 若两个文件的图片位置存在重叠,需手动调整偏移参数
openxlsx的getShapes会自动提取图片的临时路径,无需手动保存图片
你当前使用的常规代码(仅处理数据)示例:
library(readxl) library(writexl) df1 <- read_excel("Book1.xlsx") df2 <- read_excel("Book2.xlsx") merged_df <- rbind(df1, df2) write_xlsx(merged_df, "Merged.xlsx")
该代码仅读取了单元格的数值数据,完全未处理Excel中的图片对象,因此合并后的文件无图片显示。
内容的提问来源于stack exchange,提问作者Mr Pool
相关产品推荐
相关产品推荐

