Shiny中DT Buttons导出Excel时如何保留德语数字格式?
解决Shiny中DT导出Excel时德语数字格式的问题
我完全懂你碰到的这个糟心情况——把数字转成德语格式(逗号当小数分隔符、点做千分位)后,Shiny界面显示得好好的,但导出Excel时,像34,21这种没千分位的数字会被错误识别成3.421,可带千分位的67.809,97却完全正常。核心问题确实是你转成字符型的数据,Excel解析时把德语的格式规则搞反了:把逗号当成了千分位分隔符,点当成了小数分隔符。
你提到想用language.decimal选项配合JavaScript解决,这个思路方向是对的,不过更精准的做法是在DT的导出配置里指定数字格式的解析规则,让Excel导出时能正确识别德语格式的数字。下面给你两种靠谱的方案:
方案一:利用导出选项的JS回调处理数据
在excel扩展的配置里,通过exportOptions.format.body编写JS函数,把德语格式的字符串转成Excel能正确识别的数值格式:
DTa <- DT::datatable( DTa, extensions = c("Buttons"), options = list( paging = FALSE, searching = FALSE, dom = 'Bfrtip', buttons = list( list( extend = 'excel', text = "Save ", title = 'KRB', exportOptions = list( format = list( body = JS( "function(data, row, column, node) { // 处理德语格式数字:去掉千分位的点,把小数逗号换成点 if (typeof data === 'string' && data.match(/^[0-9.,]+$/)) { return data.replace(/\\./g, '').replace(/,/g, '.'); } return data; }" ) ) ) ), list(extend = 'copy', title = 'krb') ), caption= paste("Stichtag:", as.character(sub("([0-9]{2})([0-9]{2})([0-9]{4})KRB.csv", "\\1.\\2.\\3", input$date))) ) )
这个JS函数会检查每个单元格内容,只要是德语格式的数字字符串,就把千分位的点清空,把小数逗号替换成点——这样Excel就能识别成正确的数值,导出后既保留数值类型,还能在Excel里手动设置回德语格式显示。
方案二:结合DT语言配置+导出处理(辅助优化)
如果你想用上language.decimal配置,可以在DT的全局选项里添加语言规则,不过这个主要是控制网页端的显示和交互解析,导出时还是得配合方案一的处理:
options = list( # 其他配置不变 language = list(decimal = ",", thousands = "."), buttons = list( # 按钮配置同上 ) )
另外给你个更简洁的思路:别把数据转成字符型,直接用数值型数据,靠DT的格式化函数设置德语显示格式。这样导出时DT会自动处理数值类型,彻底避免字符型带来的解析问题:
# 假设dataSum()返回的是数值型数据 DTa <- data.table(dataSum()[,1], (10^-6)*dataSum()[,-1]) DTa <- DT::datatable(DTa, extensions = c("Buttons"), options = list( paging = FALSE, searching = FALSE, dom = 'Bfrtip', buttons = list( list(extend = 'excel', text = "Save ", title = 'KRB'), list(extend = 'copy', title = 'krb') ), caption= paste("Stichtag:", as.character(sub("([0-9]{2})([0-9]{2})([0-9]{4})KRB.csv", "\\1.\\2.\\3", input$date))) )) %>% DT::formatRound(columns = 2:ncol(DTa), digits = 2, decimal.mark = ",", big.mark = ".")
内容的提问来源于stack exchange,提问作者maniA
相关产品推荐
相关产品推荐

