2014-01-24 5 views
0

다른 셀 C2에 값을 입력 한 후 다시 계산해야하는 수식 셀 C4가 있습니다. 그러나 C4는 계속 캐시되고 계속해서 오래된 캐시 된 값을 반환합니다.open xml sdk 셀 제거 후 수식 재 계산

나는이 질문을 여러 번 물었지만 아무 도움도받지 못하고있다. 나는 할 수있는 모든 것을 시도하고있다. 여기에 내가 msdn 사이트에서 찾은 것입니다. 보고서 를 생성하는 대신 목록 이전 코드의 방법으로

, 지금은 반복적으로 포트폴리오 데이터와 를 받고 보고서를 작성하는 updateValue에 호출하는 과정이다. 실제로 이 작업을 수행하는 데 필요한 코드를 추가하는 경우, 한 가지 문제 - Open XML 조작을 통해 값이 변경된 셀 의 셀을 참조하는 수식이 포함 된 셀은 모두 올바르게 작동하지 않는 것 같습니다. 결과. 이것은 Excel에서 수식 의 결과를 셀 내에 캐시하기 때문입니다. Excel에서는 캐시 된 올바른 값을 가지고 있다고 생각하기 때문에 셀을 다시 계산하지 않습니다. 자동 계산 이 켜져 있거나 F9 키를 눌러 수동 재 계산을 수행하는 경우 Excel 은 셀을 다시 계산하지 않습니다. 이 문제를 해결하려면 캐시 된 값을이 셀에서 제거하여 Excel에서 파일을 열 때 즉시 Excel에서 값을 다시 계산합니다 ( ). 다음 예제에 표시된 RemoveCellValue 메서드 을 PortfolioReport 클래스에 추가하여이 기능을 으로 제공하십시오.

위의 MSDN 설명을 근거로합니다. 셀을 업데이트하기 전에 코드 제거를 시도했습니다. 내가 셀을 업데이트 한 후. 수식 셀을 읽기 전에 수식 셀을 읽은 후에도 수식 셀을 읽은 후에 다음과 같은 오류가 계속 발생합니다.

System.NullReferenceException : 개체 참조가 개체 인스턴스로 설정되지 않았습니다.

다음

내 코드는 ...

string filename = Server.MapPath("/") + "MyExcelData.xlsx"; 



    using (SpreadsheetDocument document = SpreadsheetDocument.Open(filename, true)) 
    { 


     Sheet sheet = document.WorkbookPart.Workbook.Descendants<Sheet>().SingleOrDefault(s => s.Name == "myRange1"); 
     if (sheet == null) 
     { 
      throw new ArgumentException(
       String.Format("No sheet named {0} found in spreadsheet {1}", "myRange1", filename), "sheetName"); 
     } 
     WorksheetPart worksheetPart = (WorksheetPart)document.WorkbookPart.GetPartById(sheet.Id); 
     Worksheet ws = worksheetPart.Worksheet; // ((WorksheetPart)(worksheetPart.GetPartById(sheet.Id))).Worksheet; 
     Cell cell = InsertCellInWorksheet(ws, "C4"); 

     // If there is a cell value, remove it to force a recalculation 
     // on this cell. 
     if (cell.CellValue != null) 
     { 
      cell.CellValue.Remove(); 
     } 

     // Save the worksheet. 
     ws.Save(); 
     document.Close(); 
    } 



    // getting 2 numbers in excel sheet, saving, and closing it. 

    using (SpreadsheetDocument document = SpreadsheetDocument.Open(filename, true)) 
    { 


     Sheet sheet = document.WorkbookPart.Workbook.Descendants<Sheet>().SingleOrDefault(s => s.Name == "myRange1"); 
     if (sheet == null) 
     { 
      throw new ArgumentException(
       String.Format("No sheet named {0} found in spreadsheet {1}", "myRange1", filename), "sheetName"); 
     } 
     WorksheetPart worksheetPart = (WorksheetPart)document.WorkbookPart.GetPartById(sheet.Id); 


     int rowIndex = int.Parse("C3".Substring(1)); 

     Row row = worksheetPart.Worksheet.GetFirstChild<SheetData>(). 
       Elements<Row>().FirstOrDefault(r => r.RowIndex == rowIndex); 

     Cell cell3 = row.Elements<Cell>().FirstOrDefault(c => "C3".Equals(c.CellReference.Value)); 
     if (cell3 != null) 
     { 
      cell3.CellValue = new CellValue("16"); 
      cell3.DataType = new DocumentFormat.OpenXml.EnumValue<CellValues>(CellValues.Number); 
     } 

     worksheetPart.Worksheet.Save(); 
     document.Close(); 

    } 

    // getting the result out of excel. 
    using (SpreadsheetDocument document = SpreadsheetDocument.Open(filename, false)) 
    { 
     document.WorkbookPart.Workbook.CalculationProperties.ForceFullCalculation = true; 
     document.WorkbookPart.Workbook.CalculationProperties.FullCalculationOnLoad = true; 

     Sheet sheet = document.WorkbookPart.Workbook.Descendants<Sheet>().SingleOrDefault(s => s.Name == "myRange1"); 
     if (sheet == null) 
     { 
      throw new ArgumentException(
       String.Format("No sheet named {0} found in spreadsheet {1}", "myRange1", filename), "sheetName"); 
     } 



     WorksheetPart worksheetPart = (WorksheetPart)document.WorkbookPart.GetPartById(sheet.Id); 

     int rowIndex = int.Parse("C4".Substring(1)); 

     Row row = worksheetPart.Worksheet.GetFirstChild<SheetData>(). 
       Elements<Row>().FirstOrDefault(r => r.RowIndex == rowIndex); 

     Cell cell = row.Elements<Cell>().FirstOrDefault(c => "C4".Equals(c.CellReference.Value)); 

     d.Average = Convert.ToDouble(cell.CellValue.InnerText); 

    } 

답변

0

문제는 당신이 직접 Excel에서 개방하지 않고 엑셀 데이터 파일을 수정하는 것 같다. Excel은 열려있을 때 수식 종속성을 추적 할 수 있기 때문에 Excel을 사용하지 않고 데이터를 변경할 때 다시 계산해야한다는 것을 알지 못합니다.
1) 엑셀 열 파일 사용 상호 운용성/자동으로 변경 한 후하지 검사 파일()
2)에서 계산 쇄 부분을 제거하고 전체 계산을 요구 (또는 :

3 개 가능한 해결 의존성 전체 계산은 또한 생성/공식)을 변경하는 경우
3) true로 fullcalculationonload 속성을 설정 재건 :이 파일

-1

내가 u는 cellValue을 삭제 한 생각을 열 때이 엑셀 전체 계산을하게한다 C4의 ,, 먼저 당신이 그것에 어떤 작업을 수행 할 수있는 cellValue을 만들어야합니다.