2013-04-16 2 views
1

Мне нужно удалить все формулы Excel из моего рабочего листа (заменить формулы его результатами), а затем сохранить файл. Например - вместо B3 + 13 Я хочу иметь 2013-04-11 в клетке, когда я открываю файл, используя OpenXMLСохранение пересчитанного файла Excel

Я нашел эту статью http://office.microsoft.com/en-us/excel-help/replace-a-formula-with-its-result-HP010066258.aspx

Он работает - после сохранения нет никакой формулы. Мне нужен тот же эффект в C#. Я пробовал много решений в Интернете, но у меня нет надежды.

   string source = @"C:\Source\doc.xlsx"; 
      object Unknown = Type.Missing; 

      Workbook doc = newApp.Workbooks.Open(
       source, 
       Unknown, 
       Unknown, 
       Unknown, 
       Unknown, 
       Unknown, 
       Unknown, 
       Unknown, 
       Unknown, 
       Unknown, 
       Unknown, 
       Unknown, 
       Unknown, 
       Unknown, 
       Unknown); 

      newApp.Calculation = Microsoft.Office.Interop.Excel.XlCalculation.xlCalculationManual; 

      doc.ForceFullCalculation = true; 
      newApp.CalculateFull(); 
      newApp.CalculateBeforeSave = true; 

      doc.SaveAs("c:\\temp\\recalc.xlsx", Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookDefault, Type.Missing, Type.Missing, 
      false, false, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlExclusive, 
      Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); 
      doc.Close(); 

В чем проблема? Почему я могу видеть «= DY3 + 1» вместо «2013-04-11»?

ответ

2

Выберите диапазон, который содержит данные, а затем скопировать и вставить значения в месте:

using Excel = Microsoft.Office.Interop.Excel; 
foreach (Excel.Worksheet ws in doc.Worksheets) 
{ 
    Excel.Range targetRange = (Excel.Range)ws.UsedRange; 
    targetRange.Copy(Type.Missing); 
    targetRange.PasteSpecial(Excel.XlPasteType.xlPasteValues, 
     Excel.XlPasteSpecialOperation.xlPasteSpecialOperationNone, false, false); 
} 

Это дублирует раздел «Замена формул с их расчетными значениями» документа вы публикуемую. В Excel можно выбрать все листы и скопировать/вставить в Excel, чтобы получить результаты, а не формулы, но у меня возникли проблемы с групповыми листами через код.

+0

И как выполнить итерацию через все листы с помощью Interop? Я знаю только, как это сделать в OpenXML –

+0

Я обновил ответ с помощью цикла foreach, итерации по листам, предполагая, что ваш объект книги называется «doc». –

+1

Отлично :) Это работает :) Спасибо :) targetRange.PasteSpecial (..) not Paste (..) –

0

Вычисление формулы сохраняет формулу и ее результат. Если вы хотите переписать формулу с результатом значения, то вам нужно либо:
- установите значение его значение: Range.Value2 = Range.value2
или использовать копирование и вставка-специальные значения

Смежные вопросы