質問するログイン新規登録

回答編集履歴

1

別回答にあったNPOI に再計算させてみたところ、セル参照程度であれば問題なくいけました。

2021/05/17 10:27

投稿

rtazaki
rtazaki

スコア69

answer CHANGED
@@ -18,7 +18,7 @@
18
18
  {
19
19
  var file_name = "testbook.xlsx";
20
20
  var book = NPOI.SS.UserModel.WorkbookFactory.Create(file_name);
21
- // read_sample: Range("C6:G6") = R[5]C[2..5] = data1..5
21
+ // read_sample: Range("C6:G6") = R[5]C[2..5] = sample!B2..6への参照
22
22
  var sheet_rs = book.GetSheet("read_sample");
23
23
  // read_sampleの現在のセルの値を出力
24
24
  foreach (var c in Enumerable.Range(2, 5))
@@ -41,22 +41,24 @@
41
41
  // data6..10
42
42
  cell.SetCellValue($"data{r + 5}");
43
43
  // ----
44
- // https://teratail.com/questions/338753
45
44
  // ForceFormulaRecalculationによって、
46
45
  // 「次回読み込み時に」「Excelによって」再計算が強制される模様。
47
46
  // ----
48
- sheet.ForceFormulaRecalculation = true;
47
+ // sheet.ForceFormulaRecalculation = true;
49
48
  }
50
49
 
50
+ // NPOIに再計算させる。
51
+ book.GetCreationHelper().CreateFormulaEvaluator().EvaluateAll();
52
+
51
53
  // read_sampleが保存前に更新されたか確認する。
52
54
  // 期待: data6..10になって欲しいが、そのままでもよい。
53
- // 結果: data1..5なので、変わっていない。
55
+ // 結果: data6..10
54
56
  foreach (var c in Enumerable.Range(2, 5))
55
57
  {
56
58
  var row = sheet_rs.GetRow(5) ?? sheet_rs.CreateRow(5);
57
59
  var cell = row.GetCell(c) ?? row.CreateCell(c);
58
60
  Console.WriteLine(cell.StringCellValue);
59
- // data1 data2 data3 data4 data5
61
+ // data6 data7 data8 data9 data10
60
62
  }
61
63
  book.Write(save_fs);
62
64
  }
@@ -65,13 +67,13 @@
65
67
 
66
68
  // 保存されたread_sampleの現在のセルの値を出力
67
69
  // 期待: data6..10になって欲しい。
68
- // 結果: data1..5なので、変わっていない。
70
+ // 結果: data6..10
69
71
  foreach (var c in Enumerable.Range(2, 5))
70
72
  {
71
73
  var row = sheet_srs.GetRow(5) ?? sheet_srs.CreateRow(5);
72
74
  var cell = row.GetCell(c) ?? row.CreateCell(c);
73
75
  Console.WriteLine(cell.StringCellValue);
74
- // data1 data2 data3 data4 data5
76
+ // data6 data7 data8 data9 data10
75
77
  }
76
78
  }
77
79
  }