在R的openxlsx包中使用mergeCells()会导致输出错误。

3
我正在尝试将R中的数据框输出到Excel,但当我使用mergeCells()时,打开生成的xlsx文件时出错。虽然单元格确实合并了,但我的数据“丢失”了。我可以取消合并单元格并找回数据,但我想格式化它,以便输出(例如,我的df的第一列)跨越多个列。
我尝试过在写入工作表之前和之后合并单元格。我还尝试使用writeDataTable()和writeData(),但两者都不起作用。我尝试从不同的列开始写入df(如下所示)。例如,从第2列开始写入df,并合并第1:2列。另一个是先合并第1:2列,然后从第1列开始写入数据。
df <- data.frame(
Category = c("A", "B", "C"),
Type = c("x", "y", "z"),
Number = c("1", "2", "3"), stringsAsFactors = FALSE)

book <- createWorkbook()
sheet <- "Sheet1"
writeData(book, sheet, df, startCol = 2, startRow = 1, colNames = TRUE)
mergeCells(book, sheet, cols = 1:2, rows = 1)
mergeCells(book, sheet, cols = 1:2, rows = 2)
mergeCells(book, sheet, cols = 1:2, rows = 3)
saveWorkbook(book)

或者

mergeCells(book, sheet, cols = 1:2, rows = 1)
mergeCells(book, sheet, cols = 1:2, rows = 2)
mergeCells(book, sheet, cols = 1:2, rows = 3)    
writeDataTable(book, sheet, df, startCol = 1, startRow = 1, colNames = TRUE)
saveWorkbook(book)

保存后打开文件时出现错误,提示“我们发现一些内容存在问题,Excel 已通过删除或修复无法读取的内容来打开该文件。”任何帮助都将不胜感激!

不清楚您想要的最终答案是什么。您正在编写3列。您希望将第1列的格式应用于第1列和第2列。您想查看第1列、第2列和第3列的内容。是这样吗? - Andrew Chisholm
@awchisholm 我想让第一列合并单元格,而第二列和第三列不合并。因此,Excel 输出将把第一列合并到 A:B 单元格中,第二列在 C 单元格中,第三列在 D 单元格中。希望我解释得更清楚了。 - SGarg
1个回答

6
如果我理解你的问题正确的话,你想合并第1列和第2列以生成一个包含df的第一列的合并列。如果是这样,那么你遇到的问题是要合并的最左边的列(第1列)为空。openxlsx::mergeCells() 将继续保持最左边列的合并内容。为了合并第1列和第2列,并且让df[1]的内容在其中,你需要像下面这样将df[1]的内容写在最左边的列上:
library(openxlsx)

df <- data.frame(
  Category = c("A", "B", "C"),
  Type = c("x", "y", "z"),
  Number = c("1", "2", "3"), stringsAsFactors = FALSE)

wb <- createWorkbook() # creates workbook
addWorksheet(wb, "Sheet1") # adds sheet
writeData(wb, 1, df[1], startCol = 1, startRow = 1, colNames = TRUE) # writing content on the left-most column to be merged
writeData(wb, 1, df[2:3], startCol = 3, startRow = 1, colNames = TRUE) # write the rest of the content on the columns that wont be merged
for(i in seq_len(nrow(df) + 1)){ # loop over rows for merging
  mergeCells(wb, 1, cols = 1:2, rows = i)
}
rm(i)
saveWorkbook(wb, "test.xlsx", overwrite = T) # save workbook

@Sgarg 不客气!你离正确答案很近了,加油! - JdeMello
2
谢谢您的回答。我有一个类似的问题,需要合并具有多行的区域。对于这个帖子的未来读者,我想补充说明一下,更普遍地说,mergeCells 会保留左上角单元格的内容。 - Stéphane Laurent

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接