редактирование определенных ячеек листа Excel

У меня есть книга Excel, в которой я хочу отредактировать/заполнить некоторые определенные ячейки с помощью R без изменения форматирования.

До сих пор я пробовал пакет XLConnect, и кажется, что он может делать то, что я ищу, я просто не нашел способа сделать это.

Мой прямой подход к проблеме:

wb <- loadWorkbook("file1.xls")
data1 <- readWorksheet(wb, "Sheet1", header=TRUE)

## adding a value to a particular cell:
data1[11,12] <- 3.2 

## rewriting old data:
writeWorksheet(wb, data1, "Sheet1")
saveWorkbook(wb, "new_file1.xls")

Однако таким образом новая книга теряет все предыдущее форматирование (объединенные ячейки, формулы и т. д.).

Есть ли способ изменить значения в некоторых ячейках без потери форматирования оставшегося листа?


person runr    schedule 14.11.2014    source источник
comment
Это не имеет большого смысла. Если вы не хотите заменять содержимое ячейки (например, ее формулу), то... не делайте этого. Если вы пытаетесь поместить вещи в одну часть объединенной ячейки, то, казалось бы, желательно разбить слияние.   -  person IRTFM    schedule 14.11.2014
comment
Если вы используете Windows (и у вас, очевидно, установлен Excel), вы можете автоматизировать Excel (и все остальное...) из R, используя пакет RDCOMClient.   -  person jlhoward    schedule 14.11.2014
comment
Прочтите страницы справки для пакета и обратите внимание, что страница ?writeWorksheet действительно ссылается на ?writeNamedRegion. (Разве вы не ожидали, что функция с именем writeWorksheet заменит весь рабочий лист?)   -  person IRTFM    schedule 14.11.2014
comment
@BondedDust Я делаю хочу заменить содержимое ячейки, но я хочу сохранить все предыдущее форматирование оставшегося листа - таким же, как и раньше. Например, если бы у меня был шаблон с пустыми ячейками, которые я хотел бы заполнить. Используя writeWorksheet, я записываю всю информацию в виде data.frame, поэтому все форматы (объединенные ячейки, размеры текста, размеры столбцов/строк и т. д.) исчезли.   -  person runr    schedule 14.11.2014
comment
Точно. Если вы не хотите заменять весь рабочий лист, не используйте функцию с именем writeWorksheet.   -  person IRTFM    schedule 14.11.2014
comment
@BondedDust есть ли способ заменить значение только одной ячейки с помощью пакета XLConnect (или любого другого, если на то пошло)?   -  person runr    schedule 14.11.2014
comment
Я думаю, что есть, но в вашем вопросе нет файла примера, и я не склонен создавать тестовый пример.   -  person IRTFM    schedule 14.11.2014
comment
См. setStyleAction XLConnect. Действия стиля NONE или DATA_FORMAT_ONLY должны делать то, что вы ищете.   -  person Martin Studer    schedule 17.11.2014


Ответы (3)


Вот пример использования R для автоматизации Excel.

library(RDCOMClient)
xlApp <- COMCreate("Excel.Application")
wb    <- xlApp[["Workbooks"]]$Open("file.1.xls")
sheet <- wb$Worksheets("Sheet1")

# change the value of a single cell
cell  <- sheet$Cells(11,12)
cell[["Value"]] <- 3.1

# change the value of a range
range <- sheet$Range("A1:F1")
range[["Value"]] <- paste("Col",1:6,sep="-")

wb$Save()                  # save the workbook
wb$SaveAS("new.file.xls")  # save as a new workbook
xlApp$Quit()               # close Excel
person jlhoward    schedule 14.11.2014
comment
Просто примечание: пакет RDCOMClient работает только с Windows. Это было в комментариях, но я хотел прояснить это, чтобы пользователи Unix не тратили свое время. - person CephBirk; 28.05.2016
comment
что, если появится всплывающее окно с вопросом, хочу ли я обновить ссылки? есть ли способ щелкнуть это в R? - person Rafael; 22.06.2017

Использование действия стиля XLC$STYLE_ACTION.NONE должно добавить ваши данные без изменения форматирования:

data1 <- readWorksheetFromFile("file1.xls", "Sheet1")

## adding a value to a particular cell:
data1[11,12] <- 3.2 

## rewriting old data:
writeWorksheetToFile("file1.xls", data1, "Sheet1", styleAction = XLC$STYLE_ACTION.NONE)

Спасибо Мартину за предложение изучить это в комментариях.

person CephBirk    schedule 27.05.2016

Если вам не нужно использовать формулу, у вас есть 2 возможных решения.

Вы можете использовать пакет {xlsx}:

library(xlsx)
xlsx::write.xlsx(x = head(iris),file = "source3.xlsx",sheetName = "A")
hop3 <- xlsx::loadWorkbook(file = "source3.xlsx")
sheets <- getSheets(hop3)
rows  <- getRows(sheets$A,rowIndex = 2)   # get all the rows
cc <- getCells(rows,colIndex = 3) 
xlsx::setCellValue(cc[[1]],value = "54321")
hop3$setForceFormulaRecalculation(TRUE)
xlsx::saveWorkbook(hop3,file = "output3.xlsx")

Вы также можете использовать {XLconnect}

library(XLConnect)    
XLConnect::writeWorksheetToFile(file = "source2.xlsx",data = head(iris),sheet="A")
hop2 <- XLConnect::loadWorkbook(file = "source2.xlsx")
createName(hop2, name = "plop", formula = "A!C2")
writeNamedRegion(hop2, 12345, name = "plop", header = FALSE)

С уважением

person Vincent Guyader    schedule 05.03.2019