openxlsx not able to read from .xlsx file in R

前端 未结 2 1605
迷失自我
迷失自我 2020-12-19 23:08

I am trying to read value from a .xlsx file using openxlsx package in R. In simple words, I need to write a row of data, which then p

相关标签:
2条回答
  • 2020-12-20 00:06
    ?read.xlsx
    

    Formulae written using writeFormula to a Workbook object will not get picked up by read.xlsx(). This is because only the formula is written and left to be evaluated when the file is opened in Excel. Opening, saving and closing the file with Excel will resolve this.

    So the file needs to be opened in Excel and then saved, I can verify that this does work. However this may not be suitable for you.

    XLConnect seems to have the desired functionality

    # rjava can run out of memory sometimes, this can help.
    options(java.parameters = "-Xmx1G")
    library(XLConnect)
    
    file_path = "test.xlsx"
    
    input_row <- c("c", 5)
    
    wb <- loadWorkbook(file_path, create=F)
    writeWorksheet(wb, 1, startRow = 1, startCol = 1, data = data.frame(input_row))
    setForceFormulaRecalculation(wb, 1, TRUE)
    saveWorkbook(wb)
    
    # checking
    wb <- loadWorkbook(file_path, create=F)
    readWorksheet(wb, 1)
    
    0 讨论(0)
  • 2020-12-20 00:07

    The file https://cran.r-project.org/web/packages/openxlsx/openxlsx.pdf says

    Workbook object will not get picked up by read.xlsx(). This is because only the formula is written and left to be evaluated when the file is opened in Excel. Opening, saving and closing the file with Excel will resolve this. So if you are using windows then save following file vbs file to for example opensaveexcel.vbs

    Set objExcel = CreateObject("Excel.Application")
    Set objWorkbook = objExcel.Workbooks.Open("D:\Book2.xlsx")
    objWorkbook.Save
    objWorkbook.Close 
    objExcel.Quit
    Set objExcel = Nothing
    Set objWorkbook = Nothing
    

    and then you can write R code as cell A4 has formula in Book1.xlsx as =A3*5

    mywritexlsx(fname="d:/Book1.xlsx",data = 20,startCol = 1,startRow = 3)
    system("cp d:\\Book1.xlsx d:\\Book2.xlsx")
    system("cscript //nologo d:\\opensaveexcel.vbs")
    tdt1=read.xlsx(xlsxFile = "d:/Book1.xlsx",sheet = "Sheet1",colNames = FALSE)
    tdt2=read.xlsx(xlsxFile = "d:/Book2.xlsx",sheet = "Sheet1",colNames = FALSE)
    

    Works for me by the way mywritexlsx is as

    mywritexlsx<-function(fname="temp.xlsx",sheetname="Sheet1",data,
                      startCol = 1, startRow = 1, colNames = TRUE, rowNames = FALSE)
    {
      if(!file.exists(fname))
      {
       wb = openxlsx::createWorkbook()
       sheet = openxlsx::addWorksheet(wb, sheetname)
      }
      else
     {
       wb <- openxlsx::loadWorkbook(file =fname)
       if(!(sum(openxlsx::getSheetNames(fname)==sheetname)))
       sheet = openxlsx::addWorksheet(wb, sheetname)
       else
        sheet=sheetname
      }
    
      openxlsx::writeData(wb,sheet,data,startCol = startCol, startRow = startRow, 
              colNames = colNames, rowNames = rowNames)
      openxlsx::saveWorkbook(wb, fname,overwrite = TRUE)
    }
    
    0 讨论(0)
提交回复
热议问题