다른 셀 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);
}