r-使用openxlsx包为包含utf-8字符的大型数据帧编写xlsx



我正试图通过bright使用openxlsx包编写一个相当大的数据框架(超过200列和6000行),其中包括希伯来语字符
出于某种原因,当我下载文件时,我得到了一个损坏的excel文件,当我试图打开它时,我会得到一个

excel发现无法读取的内容您想恢复此工作簿的内容吗

然后:

excel能够通过修复或删除无法读取的内容来打开文件

一旦我打开文件,所有的希伯来文字符都不见了
试图重现这个问题时,我发现如果我尝试写一个较小的数据帧,例如[100:100],它是有效的,希伯来语就在那里,但一旦我把数据帧调大,它就不起作用了
这是我在下面的测试代码中使用的文件的链接
这是我正在使用的代码:
服务器.R

library(shiny)
    library(openxlsx)
    shinyServer(function(input, output) {
      datasetInput <- reactive({
      file_1 <- read.csv("../file1.txt", header=T, stringsAsFactors =F)   
      file1<-file_1[1:200,1:200] ##if i place here [100:100] it works fine!
      return(file1)
      })
  output$table <- renderTable({
    datasetInput()
  })
  output$downloadData <- downloadHandler(
    filename = function() { paste("download", "xlsx", sep='.') },
    content = function(file){
      fname <- paste(file,"xlsx",sep=".")
   wb <- createWorkbook()
   print(class(datasetInput()))
    addWorksheet(wb = wb, sheetName = "Sheet 1", gridLines = FALSE)
    writeDataTable(wb = wb, sheet = 1, x = datasetInput())
    saveWorkbook(wb, file, overwrite = TRUE)
    }
  )
})

ui.R

 shinyUI(pageWithSidebar(
      headerPanel('Download Example'),
      sidebarPanel(
        downloadButton('downloadData', 'Download')
      ),
      mainPanel(
        tableOutput('table')
      )
    ))

多亏了这个包的创建者Alexander Walker,问题得到了解决:
问题似乎是由于其中一个字符串"\b"中的转义符引起的

> x <- read.csv("file1.txt")
> x[150,44]
[1] ÷øéîéðåìåâéä áäúîçåú áîãò ôåøðæé - îåñîê    b

修复方法是:

x <- read.csv("file1.txt", stringsAsFactors = FALSE)
wb <- createWorkbook()
addWorksheet(wb, "Sheet 1")
is_character_col <- which(sapply(x, class) %in% "character")
for(i in is_character_col){
  x[[i]] <- gsub("b", "", x[[i]], fixed = TRUE)
}
writeDataTable(wb, 1, x)
saveWorkbook(wb, "hopefully_fixed.xlsx")

最新更新