作成日: 2020/02/20 最終更新日: 2020/04/30
文書種別
不具合
状況
修正済み
詳細
CELL/CHAR/CODE/INFO関数が設定されたExcelファイルを読み読み込んだ後、シート上で関数の計算が行われない状態でSaveメソッドを呼び出してXMLに保存しようとすると例外(NullReferenceException)が発生します。本現象はLegacyBehaviorsプロパティにStyleを含め従来のスタイルシステムを有効にしている場合に発生します。
型 'System.NullReferenceException' のハンドルされていない例外が FarPoint.Win.SpreadJ.dll で発生しました
【再現手順】
1.新規作成したプロジェクトのForm1にFpSpreadを貼り付ける。
2.下記サンプルコードを記述し、例外が発生する関数を登録したExcelファイルを準備してプロジェクトをデバック実行する。
-- 例外が発生します
■サンプルコード(VB.NET)
型 'System.NullReferenceException' のハンドルされていない例外が FarPoint.Win.SpreadJ.dll で発生しました
【再現手順】
1.新規作成したプロジェクトのForm1にFpSpreadを貼り付ける。
2.下記サンプルコードを記述し、例外が発生する関数を登録したExcelファイルを準備してプロジェクトをデバック実行する。
-- 例外が発生します
■サンプルコード(VB.NET)
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim filePath As String = "..¥..¥~.xlsx" 'エラーとなる4つの関数が設定されたファイルのパスを指定する
FpSpread1.OpenExcel(filePath)
Using ms As System.IO.MemoryStream = New System.IO.MemoryStream()
If FpSpread1.Save(ms, False) Then
ms.Position = 0
FpSpread1.Open(ms)
End If
End Using
FpSpread1.ActiveSheet.RecalculateAll()
End Sub
End Class
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim filePath As String = "..¥..¥~.xlsx" 'エラーとなる4つの関数が設定されたファイルのパスを指定する
FpSpread1.OpenExcel(filePath)
Using ms As System.IO.MemoryStream = New System.IO.MemoryStream()
If FpSpread1.Save(ms, False) Then
ms.Position = 0
FpSpread1.Open(ms)
End If
End Using
FpSpread1.ActiveSheet.RecalculateAll()
End Sub
End Class
回避方法
Service Pack 4(v12.0.4505.2012)で修正済み。
Service Pack を適用せずに対処する場合、RecalculateAllメソッドによりシート上で明示的に計算を行った上で、LanguagePackageの状態を保存し再設定することで回避可能です。
■サンプルコード(VB.NET)
Service Pack を適用せずに対処する場合、RecalculateAllメソッドによりシート上で明示的に計算を行った上で、LanguagePackageの状態を保存し再設定することで回避可能です。
■サンプルコード(VB.NET)
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim filePath As String = "..¥..¥~.xlsx"
FpSpread1.OpenExcel(filePath)
'回避策(1):シート上で計算を行う
FpSpread1.ActiveSheet.RecalculateAll()
'回避策(2):現在のLanguagePackageの状態を保存
Dim oldLanguage As GrapeCity.Spreadsheet.Localization.LanguagePackage = FpSpread1.AsWorkbook().WorkbookSet.LanguagePackage
Using ms As System.IO.MemoryStream = New System.IO.MemoryStream()
If FpSpread1.Save(ms, False) Then
ms.Position = 0
FpSpread1.Open(ms)
End If
End Using
'回避策(3):LanguagePackageを明示的に変更してから元の状態に戻す
FpSpread1.AsWorkbook().WorkbookSet.LanguagePackage = GrapeCity.Spreadsheet.Localization.LanguagePackage.English
FpSpread1.AsWorkbook().WorkbookSet.LanguagePackage = oldLanguage
FpSpread1.ActiveSheet.RecalculateAll()
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim filePath As String = "..¥..¥~.xlsx"
FpSpread1.OpenExcel(filePath)
'回避策(1):シート上で計算を行う
FpSpread1.ActiveSheet.RecalculateAll()
'回避策(2):現在のLanguagePackageの状態を保存
Dim oldLanguage As GrapeCity.Spreadsheet.Localization.LanguagePackage = FpSpread1.AsWorkbook().WorkbookSet.LanguagePackage
Using ms As System.IO.MemoryStream = New System.IO.MemoryStream()
If FpSpread1.Save(ms, False) Then
ms.Position = 0
FpSpread1.Open(ms)
End If
End Using
'回避策(3):LanguagePackageを明示的に変更してから元の状態に戻す
FpSpread1.AsWorkbook().WorkbookSet.LanguagePackage = GrapeCity.Spreadsheet.Localization.LanguagePackage.English
FpSpread1.AsWorkbook().WorkbookSet.LanguagePackage = oldLanguage
FpSpread1.ActiveSheet.RecalculateAll()
旧文書番号
84949