2013-12-18 3 views
5

R (3.0.2)/MSOffice 2013/Win7Экспорт данных из R в Excel: формулы не пересчитывать

Предположим, мы существующий data.xlsx файл с двумя листами - "данные" и "известково".

лист «данные» заполняется через R с:

require(XLConnect) 
df <- data.frame(c(1,2,3,4,5), c(2,3,4,5,6)) 
wb <- loadWorkbook("data.xlsx", create=F) 
setStyleAction(wb, type=XLC$"STYLE_ACTION.NONE") 
writeWorksheet(wb, data=df, sheet="data", startRow=1, startCol=1, header=F) 
saveWorkbook(wb) 

Так вот возникает проблема - у меня есть «известково» лист, который ссылается на «данные» лист с формулами. По какой-то причине обновление данных не будет пересчитываться, даже если формулы относятся к только что заполненным ячейкам.

Функция вычисления в Excel превращается в автоматическую, даже поворачивая ее в ручную и нажимая F9, чтобы принудительно пересчитать, т работы.

Я нашел несколько странных способов сделать эту работу: 1. выберите конкретную ячейку, в которой есть правильная формула, и нажмите enter (для каждой ячейки). 2. Перетащите формулы над неисправными ячейками снова (перепишите формулу с помощью точно такая же формула ..) 3. Ссылаясь на лист данных из другого файла (скажем, data2.xlsx), работает, но для меня это последний вариант. Я не хочу раздувать структуру файлов с отдельными файлами данных. Кроме того, рассмотрите это ужасное требование об открытии обоих файлов, чтобы заставить его работать.

Заранее спасибо.

+0

ли ворота это сделать? – pnuts

+1

Нет, это не так. –

+0

Я могу воспроизвести эту точную проблему с Excel2010 на Win7. Моя рекомендация - подать отчет об ошибке с автором XLConnect и тем временем попробовать работать с пакетом 'xlsx'. Кстати, я пробовал пропустить вашу строку 'setStyleAction', без каких-либо изменений в результатах.Я думаю, что что-то в XLConnect ломает все, что использует Excel, чтобы «связывать» формулы со своими ссылочными ячейками. –

ответ

2

Глядя, что эта ссылка получает несколько кликов и решение спрятано в разделе комментариев, вот ответ:

wb$setForceFormulaRecalculation(T)

Это должно работать для большинства пакетов (по крайней мере, основанных на rJava), поскольку это Java метод передается внутри excel, следовательно, не определяется языком R.

-1

Вы можете поместить этот макрос VBA в модуль своего документа excel и запустить (из excel) его после передачи данных.

Sub RefreshCalculations() 
     Calculate 
    End Sub 

Даже простейший: нажмите F9 в excel, это заставляет вычислять все формулы.

Прошу прощения за мой предыдущий ответ.

этот макрос работает для меня, просто проверял:

Sub refresh2() 
Dim sht As Worksheet 

Dim rng0 As Range 
Dim rng1 As Range 
Dim c As Range 

'loop through the sheets 
For Each sht In ActiveWorkbook.Worksheets 

    'limit the search to the UsedRange 
    Set rng0 = sht.UsedRange 
    On Error Resume Next ' in case of no formulas 

    'reduce looping further 
    Set rng1 = rng0.SpecialCells(xlCellTypeFormulas) 

    For Each c In rng1 'loop through the SpecialCells only 
     c.Formula = c.Formula 
    Next 

Next 
End Sub 
+0

Это не то, что сказал ОП: он уже пробовал это, как и я. Проблема глубже, чем просто пересчет. –

+0

Я подозреваю, что макрос почти такой же, как при нажатии F9. И ... Думаю, я уже упоминал об этом в этой статье. –

+0

Это очень творческая работа, но у меня есть два возражения. Во-первых, он, скорее всего, будет запущен, если на листе есть другие формулы. Во-вторых, поскольку довольно ясно, что «XLConnect» делает то, что книги типа «xlsx» не нравятся, это «R» -пакет, который должен быть исправлен, вместо того, чтобы допускать ошибку для пропаганды. –

0

Я знаю, что этот пост 2,5 лет, но я только что был точно такой же вопрос с вами. Я подозреваю, что есть некоторые проблемы с XLConnect. Я использовал write.csv, и он сработал. Проблема с write.csv заключается в том, что у моей файловой рамки больше 16384 столбцов, и я не могу добавить еще один лист в файл.

+0

Да, я тоже это переживаю – user2981639

1

После того как вы загрузите книгу и напишите данные, принудительно пересчитайте формулу, прежде чем сохранять книгу в каталог.

Это должно работать для вас:

writeWorksheet(wb, data=df, sheet="data", startRow=1, startCol=1, header=F) 
setForceFormulaRecalculation(wb,"data",TRUE) 
saveWorkbook(wb) 
Смежные вопросы