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

R中SQL Server数据UTF-8转换后write.xlsx仅写入最后一行的解决方法

解决SQL Server数据拉取后的编码转换与数据框结构保留问题

问题场景

从SQL Server拉取数据到R数据框时遇到编码错误:

Error in stri_length(newStrs) : 
  invalid UTF-8 byte sequence detected; try calling stri_enc_toutf8()

使用sapply(data, iconv, to = "UTF-8")转码后,数据结构变为矩阵,导致openxlsx::write.xlsx()写入Excel时仅保留最后一条记录。

解决方案

方法1:用lapply转码后还原数据框结构

sapply会自动简化结果为矩阵,改用lapply返回列表,再转换为数据框,同时跳过非字符列避免无效转码:

# 对数据框的字符列进行编码转换,保留数据框结构
data <- as.data.frame(lapply(data, function(col) {
  if (is.character(col)) {
    iconv(col, to = "UTF-8")
  } else {
    col
  }
}), stringsAsFactors = FALSE)

方法2:连接数据库时直接指定编码(从源头避免问题)

使用odbc包建立连接时,通过encoding参数指定UTF-8,拉取的数据直接是正确编码的data.frame:

library(DBI)
library(odbc)

# 建立带编码指定的数据库连接
con <- dbConnect(odbc(),
                 Driver = "SQL Server",
                 Server = "你的服务器地址",
                 Database = "你的数据库名",
                 UID = "用户名",
                 PWD = "密码",
                 encoding = "UTF-8")

# 拉取数据
data <- dbGetQuery(con, "SELECT * FROM 目标表名")
dbDisconnect(con)

方法3:用dplyr简洁处理字符列

借助dplyr的mutate_if,仅对字符列执行转码,自动保留数据框结构:

library(dplyr)

data <- data %>%
  mutate_if(is.character, ~iconv(., to = "UTF-8"))

验证与写入

转码完成后,通过class(data)确认结构为data.frame,再执行写入:

library(openxlsx)
write.xlsx(x = data, file = "输出文件.xlsx")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 13:40:54