R: добавить рабочий лист в книгу Excel, не читая книгу целиком

У меня есть книга Excel размером 26 МБ, к которой я пытаюсь добавить рабочий лист размером 42 КБ. Используя пакет openxlsx, у меня есть следующий код:

wb_object <- loadWorkbook(to_name2)
addWorksheet(wb_object, "New Data")
writeData(wb_object, sheet = "New Data", m_data)
saveWorkbook(wb_object, to_name2, overwrite = TRUE)

Я заметил, что выполнение этого кода занимает около 2 минут. Я считаю, что R читает весь файл размером 26 МБ, а затем добавляет рабочий лист размером 42 КБ. Есть ли способ добавить лист размером 42 КБ в книгу размером 26 МБ, не читая файл размером 26 МБ? Сэкономил бы 2 минуты на пробежку.


person Rahul Nallappa    schedule 08.03.2018    source источник
comment
Для ясности: вся работа, которую вы делаете, находится в отличном состоянии, так что вы не можете просто сделать это в R? Если вы хотите сохранить все в книге, насколько мне известно, вам нужно прочитать всю книгу, чтобы добавить страницу и переписать.   -  person Badger    schedule 08.03.2018
comment
Спасибо за быстрый ответ, Барсук. Файл размером 26 МБ, который я создал в Excel, имеет значительное условное форматирование, и было бы сложно попытаться создать всю книгу в R. Я действительно хочу сохранить все остальное в книге, поэтому, если то, что вы говорите, правда , то, думаю, мне нужно прочитать всю книгу. Я подозревал это, но большое спасибо за подтверждение.   -  person Rahul Nallappa    schedule 08.03.2018
comment
Я не эксперт во взаимодействии R - Excel, как только я перешел на R, я разорвал связи с Excel, так что не исключено, что я ошибаюсь. Это был мой опыт! 2 минуты - это довольно жутко для такого крошечного файла.   -  person Badger    schedule 08.03.2018
comment
Попался. Да, теперь, когда вы упомянули об этом, 26 МБ - не такой уж большой файл, чтобы на чтение у него требовалось 2 минуты. Возможно, это ограничение на стороне openxlsx.   -  person Rahul Nallappa    schedule 09.03.2018


Ответы (1)


Обычно я использую openxlsx, но я не уверен, есть ли у openxlsx способ добавить рабочий лист в файл Excel без предварительной загрузки книги Excel в R. Однако с пакетом xlsx вы можете добавить новый рабочий лист без загрузки файла Excel. Например, если ваш файл - «test.xlsx», вы можете сделать:

library(xlsx)

write.xlsx(new_data, "test.xlsx", sheetName="New_Sheet", append=TRUE)

Если мне нужно что-то сохранить в файле Excel, я обычно стараюсь делать все в R, а затем записывать все, что нужно, в файл Excel в конце. Однако, если вам нужно добавить что-то в существующий файл Excel, приведенный выше код предоставляет возможность сделать это.

person eipi10    schedule 08.03.2018
comment
Похоже, это идеальное решение, большое спасибо! Попробую и сообщу, работает ли оно. - person Rahul Nallappa; 09.03.2018
comment
Я получаю следующую ошибку: Ошибка в .jcall (RJavaTools, Ljava / lang / Object ;, invokeMethod, cl,: java.lang.OutOfMemoryError: пространство кучи Java Кажется странным, что я получаю эту ошибку, учитывая, что я ' m не загружает Excel и, следовательно, не должен использовать много оперативной памяти. - person Rahul Nallappa; 09.03.2018
comment
См. этот ответ, чтобы узнать, как увеличить пространство кучи Java. - person eipi10; 09.03.2018
comment
Спасибо за быстрый ответ. Я нашел эту ссылку независимо, увеличил объем оперативной памяти до 8 ГБ, и программа успешно выполнилась. Однако на выполнение потребовалось 4 минуты, даже медленнее, чем в прошлый раз. - person Rahul Nallappa; 09.03.2018
comment
Странный. Я не уверен, что это за причина. - person eipi10; 09.03.2018
comment
Не беспокойтесь - это действительно кажется странным. Как ни странно, во время выполнения размер файла составляет 0 КБ. Когда он, наконец, выполняется, он возвращается к 22,7 МБ, что меньше исходного размера файла (26 МБ). Интересно, переписывает ли он весь файл. Я включил append = true, так что этого не должно быть ... - person Rahul Nallappa; 09.03.2018
comment
Последний вопрос, извинения. Вы уверены, что xlsx обходит чтение файла в случае, если append = true? Страница 38 официальной документации здесь, cran.r-project.org/ web / packages / xlsx / xlsx.pdf, говорит, что append = true приводит к чтению файла с диска. - person Rahul Nallappa; 09.03.2018
comment
Я не знаю, обходит ли это чтение файла. Я не рассчитал время, но время, чтобы завершить операцию, показалось мне не слишком долгим. - person eipi10; 09.03.2018