作成日: 2022/01/21 最終更新日: 2022/02/24
文書種別
制限事項
詳細
大量のセルにそれぞれ異なるインスタンスで作成したセル型を割り当てると、エクスポートしたExcelを開く際に次のような警告が表示される場合があります。70000個のセル型のインスタンスを作成しそれぞれ異なるセルに割り当てた場合に現象が発生することを確認しています。
'Book1.xlsx'の一部の内容に問題が見つかりました。可能な限り内容を回復しますか?ブックの発行元が信頼できる場合は、[はい]をクリックしてください。
Excelにはユニークなセル形式/スタイルは64000までという規定があり、この制限事項に該当しています。
https://support.office.com/en-us/article/excel-specifications-and-limits-1672b34d-7043-467e-8e27-269d656771c3
=====
Unique cell formats/cell styles
64,000
=====
10J以前でExcelにエクスポートを行う際には、セル型のプロパティを1つずつ比較して一意のスタイルを見つける処理が行われておりパフォーマンスに影響を与えていました。11Jからはそのロジックを削除し、セル型のインスタンスによる比較のみを行っています。10J以前では同じスタイルであればExcelに出力されないのに対して、11J以降では別インスタンスのセル型のスタイルであればすべて出力されることになり、Excelの制限事項に該当し現象が発生します。
なお、Excelの制限である64000という値は厳密に処理されているわけではなく、セル形式/スタイルが64000を超える場合(など)であっても警告が出ないケースもあるようです。
【再現手順】
1.新規作成したプロジェクトのForm1にFpSpreadとButtonを貼り付ける。
2.下記サンプルコードを記述し、プロジェクトをデバック実行する。
3.画面のボタンを押下してExcelファイルをエクスポートする。
4.エクスポートした「test.xlsx」を手動で開く。
■サンプルコード(VB.NET)
'Book1.xlsx'の一部の内容に問題が見つかりました。可能な限り内容を回復しますか?ブックの発行元が信頼できる場合は、[はい]をクリックしてください。
Excelにはユニークなセル形式/スタイルは64000までという規定があり、この制限事項に該当しています。
https://support.office.com/en-us/article/excel-specifications-and-limits-1672b34d-7043-467e-8e27-269d656771c3
=====
Unique cell formats/cell styles
64,000
=====
10J以前でExcelにエクスポートを行う際には、セル型のプロパティを1つずつ比較して一意のスタイルを見つける処理が行われておりパフォーマンスに影響を与えていました。11Jからはそのロジックを削除し、セル型のインスタンスによる比較のみを行っています。10J以前では同じスタイルであればExcelに出力されないのに対して、11J以降では別インスタンスのセル型のスタイルであればすべて出力されることになり、Excelの制限事項に該当し現象が発生します。
なお、Excelの制限である64000という値は厳密に処理されているわけではなく、セル形式/スタイルが64000を超える場合(
【再現手順】
1.新規作成したプロジェクトのForm1にFpSpreadとButtonを貼り付ける。
2.下記サンプルコードを記述し、プロジェクトをデバック実行する。
3.画面のボタンを押下してExcelファイルをエクスポートする。
4.エクスポートした「test.xlsx」を手動で開く。
■サンプルコード(VB.NET)
Imports FarPoint.Win.Spread
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
FpSpread1.SuspendLayout()
FpSpread1.ActiveSheet.RowCount = 70000
FpSpread1.ActiveSheet.ColumnCount = 1
test()
FpSpread1.ResumeLayout()
End Sub
Private Sub test()
For i = 0 To FpSpread1.ActiveSheet.RowCount - 1
Dim numberCell As New CellType.NumberCellType
FpSpread1.ActiveSheet.Cells(i, 0).Value = 0
FpSpread1.ActiveSheet.Cells(i, 0).CellType = numberCell
Next
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
FpSpread1.SaveExcel("test.xlsx", FarPoint.Excel.ExcelSaveFlags.UseOOXMLFormat)
End Sub
End Class
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
FpSpread1.SuspendLayout()
FpSpread1.ActiveSheet.RowCount = 70000
FpSpread1.ActiveSheet.ColumnCount = 1
test()
FpSpread1.ResumeLayout()
End Sub
Private Sub test()
For i = 0 To FpSpread1.ActiveSheet.RowCount - 1
Dim numberCell As New CellType.NumberCellType
FpSpread1.ActiveSheet.Cells(i, 0).Value = 0
FpSpread1.ActiveSheet.Cells(i, 0).CellType = numberCell
Next
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
FpSpread1.SaveExcel("test.xlsx", FarPoint.Excel.ExcelSaveFlags.UseOOXMLFormat)
End Sub
End Class
回避方法
同じセル型のスタイルを使用する場合には、同じインスタンスのものを割り当てます。
■サンプルコード(VB.NET)
■サンプルコード(VB.NET)
Private Sub test()
Dim numberCell As New CellType.NumberCellType
For i = 0 To FpSpread1.ActiveSheet.RowCount - 1
FpSpread1.ActiveSheet.Cells(i, 0).Value = 0
FpSpread1.ActiveSheet.Cells(i, 0).CellType = numberCell
Next
End Sub
Dim numberCell As New CellType.NumberCellType
For i = 0 To FpSpread1.ActiveSheet.RowCount - 1
FpSpread1.ActiveSheet.Cells(i, 0).Value = 0
FpSpread1.ActiveSheet.Cells(i, 0).CellType = numberCell
Next
End Sub