openxlsx не может читать из файла .xlsx в R

Я пытаюсь прочитать значение из файла .xlsx, используя пакет openxlsx в R. Проще говоря, мне нужно записать строку данных, которая затем заполняет некоторую ячейку вывода, которую нужно прочитать обратно в R. Я поделюсь примером, чтобы лучше объяснить проблему.

Исходное состояние файла .xlsx:

введите здесь описание изображения

Сейчас я пытаюсь записать в ячейку новые значения: A2:A3 = c("c", 5). Так что в идеале я ожидаю A6 = 15

Ниже приведен используемый код:

require(openxlsx)
path <- "C:/path_to_file/for_SO1.xlsx"
input_row <- c("c", 5)
# Load workbook; create if not existing
wb <- loadWorkbook(path)
# createSheet(wb, name = "1")
writeData(wb, 
          sheet = "Sheet1",
          x = data.frame(input_row),
          startCol=1,
          startRow=1
)  

data_IM <- read.xlsx(wb, 
                     sheet = "Sheet1",
                     rows = c(5,6),
                     cols = c(1))
# Save workbook
saveWorkbook(wb, file = path, overwrite = TRUE)

#> data_IM
#  output_row
#1          3

Но я получаю начальное значение (3). Однако, если я открою файл .xlsx, я увижу, что там находится 15:

введите здесь описание изображения

Что может быть причиной невозможности прочитать эту ячейку? Я попытался сохранить его после записи в файл и снова прочитать его, но даже это не удалось. openxlsx - единственный вариант, который у меня есть из-за ошибок JAVA от XLConnect и т. д.


person joel.wilson    schedule 24.10.2017    source источник
comment
Пожалуйста, прочитайте При каких обстоятельствах я могу добавить «срочно» или другие подобные фразы к моему вопросу, чтобы получить более быстрые ответы? - Подводя итог, можно сказать, что это не идеальный способ обращения к волонтерам и, вероятно, контрпродуктивно для получения ответов. Пожалуйста, воздержитесь от добавления этого к своим вопросам.   -  person halfer    schedule 26.10.2017
comment
@halfer спасибо за информацию .. Я не получаю отрицательных ответов, и я все еще застрял здесь   -  person joel.wilson    schedule 26.10.2017
comment
Возможно, стоит добавить упомянутые вами ошибки Java. Кроме того, завтра вы можете добавить награду к вопросу, чтобы соблазнить людей ответить.   -  person halfer    schedule 26.10.2017


Ответы (2)


?read.xlsx

Формулы, написанные с помощью writeFormula для объекта Workbook, не будут обработаны read.xlsx(). Это связано с тем, что только формула записывается и остается для оценки при открытии файла в Excel. Открытие, сохранение и закрытие файла в Excel решит эту проблему.

Итак, файл нужно открыть в Excel, а затем сохранить, я могу убедиться, что это работает. Однако это может вам не подойти.

XLConnect, кажется, имеет желаемую функциональность

# 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)
person zacdav    schedule 29.10.2017
comment
XLConnect может динамически оценивать формулу и дает мне ответ, но проблема в том, что он не поддерживает TRANSPOSE из excel и некоторые другие функции (используемые в моих расчетах). Он продолжает выдавать мне ошибку Apache POI Array. - person joel.wilson; 29.10.2017
comment
Итак, используйте openxlsx, сохраните его, прочитайте с помощью XLConnect, пересчитайте, а затем сохраните? В остальном я на 100% ответил на вопрос. - person zacdav; 29.10.2017
comment
хотя я все еще застрял, это мой долг отметить это! благодарю вас - person joel.wilson; 29.10.2017

Файл https://cran.r-project.org/web/packages/openxlsx/openxlsx.pdf говорит

Объект рабочей книги не будет получен функцией read.xlsx(). Это связано с тем, что только формула записывается и остается для оценки при открытии файла в Excel. Открытие, сохранение и закрытие файла в Excel решит эту проблему. Поэтому, если вы используете окна, сохраните следующий файл vbs, например, в 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

а затем вы можете написать код R, поскольку ячейка A4 имеет формулу в Book1.xlsx как = 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)

У меня работает, кстати, mywritexlsx как

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)
}
person makarand kulkarni    schedule 17.07.2018