使用Shiny写入并保存到excel文件

时间:2019-04-30 12:50:17

标签: r excel shiny

我的应用程序允许用户输入日期范围,除法,pdf文件和excel文件。该程序从pdf中提取数字,计算总点数,并将其添加到从现有excel文件中提取的等级中。应该写并保存excel文件。没有Shiny,我的程序可以正常工作。在Shiny中,它正在运行并且数据正确,但是不会将数据添加到excel文件中。我已在各个阶段添加了打印提示以进行测试。我尝试过在外部运行此程序,但结果相同。它不会引发错误,只是不会将数据添加到excel文件中。

服务器功能

server<-function(input,output){

  output$horse_div <- renderText({ 
    paste("You have chosen",input$division)
    })

  output$qualifying<-renderText({
    paste("Qualifying Period from",input$date[1],"to",input$date[2])
  })

  output$pdf<-renderText({
    req(input$horsereport)
    req(input$excelfile)
    ponyoutput<-horseRecord(input$horsereport$datapath,input$date[1],input$date[2],input$division,input$excelfile$datapath)
    paste("mylist",ponyoutput[1])
  })
}

horseRecord函数的片段

#Set up sheet and excel file
  wsheetrank<-paste(div,"RANK")
  wsheetpoints<-paste(div,"POINTS")

  #load workbook
  wb<-loadWorkbook(file=excelfile)

  #add pony to ranked list
  rank<-read.xlsx(excelfile,wsheetrank)
  rank<-rank[,2:3]
  rank<-rank %>% mutate(Points=as.numeric(Points))
  dat<-rank
  dat<-dat%>% add_row(Pony=horse,Points=points) %>% arrange(desc(Points))

  #remove duplicates
  dat<-dat[!duplicated(dat$Pony),]
  rownames(dat)<-seq(from=1,to=nrow(dat),by=1)

  #find rank
  rank<-grep(horse,dat$Pony)

  #Write to excel file
  writeData(wb,sheet=wsheetrank,x=dat,colNames=TRUE,rowNames = TRUE,borders="all")
  saveWorkbook(wb,excelfile,overwrite=TRUE)

这应将从PDF文件中提取的总点添加到排名列表中,重新排序,然后写入排名工作表。完整的代码和文件可以在这里找到:https://github.com/chealy21/horsePoints

1 个答案:

答案 0 :(得分:0)

您上传的excel文件将保存在闪亮服务器上的临时文件中。即使您在本地运行应用,磁盘上也不是excel文件。

如果在将数据写入工作簿之前添加browser()horsereportfunction.R的第138行),则当应用程序到达该行时,您将收到控制台提示,并且可以看到它为你自己。

这是excelfile变量中的内容(在Linux计算机上。Windows临时文件位于其他位置,但它们仍然只是tmp文件):

excelfile
# [1] "/tmp/RtmpFllCQq/5709c4b043babf5b85bd29b4/0.xlsx"

闪亮服务器上的此临时文件确实已更新:

readxl::read_excel("/tmp/RtmpFllCQq/5709c4b043babf5b85bd29b4/0.xlsx") %>% filter(Pony == "BIT OF LAUGHTER")
# # A tibble: 1 x 3
#   ..1   Pony            Points
#   <chr> <chr>            <dbl>
# 1 30    BIT OF LAUGHTER  1503.

这与documentation for fileInput相符:

  

只要文件上传完成,就会将相应的输入变量设置为数据框。此数据框包含每个选定文件的一行,以及以下各列:

     
      
  • 名称:   Web浏览器提供的文件名。这不是读取以获取上载的实际数据的路径(请参见datapath列)。
  •   
  • 大小:   上传数据的大小(以字节为单位)。
  •   
  • 类型:   浏览器报告的MIME类型(例如,文本/纯文本),如果浏览器不知道,则为空字符串。
  •   
  • 数据路径:   包含已上传数据的临时文件的路径。如果用户执行其他上载操作,则该文件可能会被删除。
  •   

也许您可以让用户在更新后从datapath下载更新的报告?

如果您从不打算发布应用程序并且始终在本地使用它,则可以对excel文件目录进行硬编码。然后,您的应用将从datapath的硬编码位置复制工作簿。