2017-04-25 2 views
0

Ich versuche, alle Formeln mit openxml aus einem Blatt zu entfernen. Das, was ich versuche:Entfernen einer Formel aus Excel mit OpenXML

internal static void ReplaceFormulaWithValue() 
    { 

     var res = _worksheetPart.Worksheet.GetFirstChild<SheetData>().Elements<Row>(); 


     foreach (Row row in _worksheetPart.Worksheet.GetFirstChild<SheetData>().Elements<Row>()) 
     { 
      foreach (Cell cell in row.Elements<Cell>()) 
      { 
       if (cell.CellFormula != null && 
         cell.CellValue != null) 
       { 
        string cellRef = cell.CellReference; 
        CalculationChainPart calculationChainPart = _spreadSheet.WorkbookPart.CalculationChainPart; 
        CalculationChain calculationChain = calculationChainPart.CalculationChain; 
        var calculationCells = calculationChain.Elements<CalculationCell>().ToList(); 
        CalculationCell calculationCell = calculationCells.Where(c => c.CellReference == cellRef).FirstOrDefault(); 
        //CalculationCell calculationCell = calculationChain.Elements<CalculationCell>().Where(c => c.CellReference == cell.CellReference).FirstOrDefault(); 

        string value = cell.CellValue.InnerText; 
        UpdateCell(cell, DataTypes.String, value); 

        cell.CellFormula.Remove(); 
        calculationCell.Remove(); 


       } 
      } 

     } 
     SaveChanges(); 
    } 

Auf das Excel-Dokument zu öffnen, erhalte ich die folgende Fehlermeldung:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<recoveryLog xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"> 
<logFileName>error192600_01.xml</logFileName><summary>Errors were detected in file 'C:\DEV\ExcelEditor\ExcelEditor\bin\Debug\Chart.xlsx'</summary> 
<removedParts summary="Following is a list of removed parts:"> 
<removedPart>Removed Part: /xl/calcChain.xml part with XML error. (Calculation properties) Catastrophic failure Line 1, column 138.</removedPart> 
</removedParts></recoveryLog> 

So vergleichen wir die alte calcChain.xml Datei mit dem neu generierte mit OpenXML SDK-Tool . Die alte Datei hat folgende Möglichkeiten:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 
<calcChain xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"> 
<c i="1" l="1" r="D2"/> 
</calcChain> 

und dem neuen nach meinem Code ausgeführt wird:

<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 
<x:calcChain xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main"> 

</x:calcChain> 

Könnte jemand helfen, wenn ich hier bin etwas fehlt.

Antwort

1

Wenn Sie alle Formeln löschen, benötigen Sie eine leere calcChain.xml? Hast du versucht es zu löschen?

Dies funktioniert für mich:

public static void ReplaceFormulasWithValue() 
{ 
    try 
    { 
     CalculationChainPart calculationChainPart = _spreadSheet.WorkbookPart.CalculationChainPart; 
     CalculationChain calculationChain = calculationChainPart.CalculationChain; 
     var calculationCells = calculationChain.Elements<CalculationCell>().ToList(); 

     foreach (Row row in _worksheetPart.Worksheet.GetFirstChild<SheetData>().Elements<Row>()) 
     { 
      foreach (Cell cell in row.Elements<Cell>()) 
      { 
       if (cell.CellFormula != null && cell.CellValue != null) 
       { 
        string cellRef = cell.CellReference;        
        CalculationCell calculationCell = calculationCells.Where(c => c.CellReference == cellRef).FirstOrDefault(); 

        UpdateCell(cell, DataTypes.String, cell.CellValue.InnerText); 

        cell.CellFormula.Remove(); 
        if(calculationCell != null) 
        {      
         calculationCell.Remove(); 
         calculationCells.Remove(calculationCell); 
        } 
        else 
        { 
         //Something is went wrong - log it 
        }     
       } 
       if (calculationCells.Count == 0) 
        _spreadSheet.WorkbookPart.DeletePart(calculationChainPart); 

      } 
      _worksheetPart.Worksheet.Save(); 
     } 
    } 
    catch(Exception ex) 
    { 
     Console.WriteLine(ex); 
    } 
} 
+0

Dies funktioniert. Aber warum würde eine leere XML-Datei Fehler verursachen? Gibt es eine Beziehung, für die gesorgt werden muss? –