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

openxlsx2写入Excel异常:自动转DataFrame,如何按原表格格式写入?

问题描述

在R中通过以下代码生成带边际和的双向表格:

t <- table(df[["Sex"]], df[["C or Better"]], useNA = "ifany")
colnames(t)[is.na(colnames(t))] <- "Blank"
CountsBySex  <- addmargins(t, c(1,2))

生成的表格打印格式正常:

> t
   
    C-, D or F Other Pass Blank
  F       1967   737 3169   106
  M       1555   480 2452    71

但使用openxlsx2::wb_add_data()写入Excel时:

wb <- openxlsx2::wb_add_data(wb, sheet = cs, CountsBySex, 
                               start_col = 1,  start_row = writeRow)

Excel中内容被转为长格式的DataFrame:

Var1       Var2  Freq
1     F C-, D or F  1967
2     M C-, D or F  1555
3   Sum C-, D or F  3522
4     F      Other   737
5     M      Other   480
6   Sum      Other  1217
7     F       Pass  3169
8     M       Pass  2452
9   Sum       Pass  5621
10    F      Blank   106
11    M      Blank    71
12  Sum      Blank   177
13    F        Sum  5979
14    M        Sum  4558
15  Sum        Sum 10537

openxlsx2会自动将表格转为长格式DataFrame写入,而openxlsx可保留原表格格式,需修改语法让openxlsx2按原格式写入Excel。

解决办法

openxlsx2的wb_add_data()对table类对象的处理逻辑和openxlsx不同,需要手动将表格转换为宽格式的DataFrame,再写入Excel。具体修改步骤:

  1. 将CountsBySex转换为保留行列名的宽格式DataFrame:
# 转换为宽格式DataFrame,保留原表格列结构与数值
CountsBySex_df <- as.data.frame.matrix(CountsBySex)
# 添加行标签列(对应原表格的行名)
CountsBySex_df <- cbind(Row = rownames(CountsBySex_df), CountsBySex_df)
# 重置DataFrame行名,避免写入Excel时多出默认行号
rownames(CountsBySex_df) <- NULL
  1. 使用转换后的DataFrame写入Excel:
wb <- openxlsx2::wb_add_data(wb, sheet = cs, CountsBySex_df, 
                               start_col = 1, start_row = writeRow)

原理说明

  • as.data.frame.matrix()会直接将table对象转换为宽格式DataFrame,完全保留原表格的列结构和数值,同时保留行名。
  • 手动添加Row列是为了把原表格的行标签(F、M、Sum)作为单独一列写入Excel,最终效果和原表格打印格式完全一致。

内容的提问来源于stack exchange,提问作者Thomas Philips

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 02:43:24