2013-04-16 55 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中自行復制/粘貼特殊項目以獲得結果而不是公式,但是通過代碼處理分組工作表時遇到了一些問題。

+0

如何使用Interop來遍歷所有表單?我只知道如何在OpenXML中做到這一點 –

+0

我已經更新了迭代遍歷工作表的foreach循環的答案,假設您的工作簿對象被命名爲「doc」。 –

+1

優秀:)它的作品:)謝謝:) targetRange.PasteSpecial(..)不粘貼(..) –

0

計算公式保留了公式及其結果。如果你想用它的結果值覆蓋公式,那麼你需要:
- 其值設置爲它的值:Range.Value2 = Range.value2
或使用複製和粘貼,特殊值