You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 03:35:03