日本語環境、個別の機能に関する質問

日本語環境での動作や個別の機能についてなど、日本のお客様からよく寄せられる質問です。


ワークブック生成時に明示的にロケールが指定されていない場合は、Microsoft Excel 英語版に基づいて表現されます。例えば WorkbookSet クラスにロケールを指定しない場合、生成されるワークブックのデフォルト フォントには Calibri 11 pt. が設定されます。
※ただし xlsx/xlsm 形式の場合は、MS Excel の言語バージョンのデフォルト設定に依存します。

そこで日本語環境で使用する場合は、明示的に WorkbookSet クラスに地域 (ロケール) を設定することを推奨しています。[日本] の場合は CultureInfo(1041) や CultureInfo("ja-JP")、また日本語ロケールでの使用がはっきりしている場合は System.Globalization.CultureInfo.CurrentCulture を設定します。

          // WorkbookSet クラスのロケールを「日本」に設定
          SpreadsheetGear.IWorkbookSet workbookset = SpreadsheetGear.Factory.GetWorkbookSet(
                        new System.Globalization.CultureInfo(1041));
          SpreadsheetGear.IWorkbook workbook = workbookset.Workbooks.Add();
          SpreadsheetGear.IWorksheet worksheet = workbook.Worksheets[0];
        
          ' WorkbookSet クラスのロケールを「日本」に設定
          Dim workbookset As SpreadsheetGear.IWorkbookSet = SpreadsheetGear.Factory.GetWorkbookSet( _
                        New System.Globalization.CultureInfo(1041))
          Dim workbook As SpreadsheetGear.IWorkbook = workbookset.Workbooks.Add()
          Dim worksheet As SpreadsheetGear.IWorksheet = workbook.Worksheets(0)
        

セルのフォントの詳細を設定するには、IFont インターフェースを使用します。

          SpreadsheetGear.IWorkbook workbook = SpreadsheetGear.Factory.GetWorkbook();
          SpreadsheetGear.IWorksheet  worksheet = workbook.Worksheets[0];
          SpreadsheetGear.IRange cells = worksheet.Cells;

          // シート全体
          worksheet.Cells.Font.Name = "MS P明朝";
          // セル A1 から E5 まで
          cells["A1:E5"].Font.Name = "MS Pゴシック";
        
          Dim workbook As SpreadsheetGear.IWorkbook = SpreadsheetGear.Factory.GetWorkbook()
          Dim worksheet As SpreadsheetGear.IWorksheet = workbook.Worksheets(0)
          Dim cells As SpreadsheetGear.IRange = worksheet.Cells

          ' シート全体
          worksheet.Cells.Font.Name = "MS P明朝"
          ' セル A1 から E5 まで
          cells("A1:E5").Font.Name = "MS Pゴシック"
        

セルの書式設定には、NumberFormat プロパティを使用します。

例えば、セル A1 に円マーク (¥) の通貨書式を適用するには、次のように記述します。

          SpreadsheetGear.IWorkbook workbook = SpreadsheetGear.Factory.GetWorkbook();
          SpreadsheetGear.IWorksheet worksheet = workbook.Worksheets[0];
          SpreadsheetGear.IRange cells = worksheet.Cells;
          cells["A1"].Value = 12345.0;
          cells["A1"].NumberFormat = "¥¥¥¥#,##0";
        
          Dim workbook As SpreadsheetGear.IWorkbook = SpreadsheetGear.Factory.GetWorkbook()
          Dim worksheet As SpreadsheetGear.IWorksheet = workbook.Worksheets(0)
          Dim cells As SpreadsheetGear.IRange = worksheet.Cells
          cells("A1").Value = 12345.0
          cells("A1").NumberFormat = "¥¥#,##0"
        

作成されたワークブックに設定する日付書式が正しく反映されない場合があります。これは WorkbookSet クラスに地域 (ロケール) を設定することで回避できます。

[日本] の場合は CultureInfo(1041) や CultureInfo("ja-JP")、または日本語ロケールでの使用がはっきりしている場合は System.Globalization.CultureInfo.CurrentCulture を設定します。

コード例は、「1. ワークブックのデフォルト フォントが日本語版 Excel と異なります」を参照してください。

アスタリスク (*) 付きの日付書式について

現在のところ Microsoft Excel で設定可能なアスタリスク (*) 付きの「長い形式の日付書式」に対する自動設定はサポートされていません。異なる日付書式を設定する場合は、日付データをセル範囲に読み込んだ後で IRange.NumberFormat で指定する方法になります。

          worksheet.Cells["A1"].NumberFormat = @"yyyy/mm/dd;@";
        
          worksheet.Cells("A1").NumberFormat = "yyyy/mm/dd;@"
        

ユーザー定義の日付書式について

セルの書式で明示的にロケールが指定されていない場合の日付書式は Microsoft Excel 英語版に基づいて表現されます。例えば、ユーザー定義の日付書式「yyyy"年"m"月"」を設定したセルは Microsoft Excel 英語版で読み込むと「* m/d/yyyy」(システムの短い日付書式) と表現されます。この書式は SpreadsheetGear でも同様に処理されるため、結果的に期待する書式が反映されません。これは Microsoft Excel 英語版に互換する動作になります。

回避策として、特定のロケールに依存する日付書式を指定する際は、

  • [$-411]yyyy"年"m"月"
  • yyyy"年"m"月";@
などのように指定します。

書式設定で使用可能な文字や記号については、Microsoft Excel のヘルプを参照してください。

関数名は、すべて Microsoft Excel 英語版に基づいて表現されます。例えば、Microsoft Excel の日本語版の DOLLAR 関数は USDOLLAR、また YEN 関数は DOLLAR と表現されます。YEN 関数は Microsoft Excel 日本語版の関数ですので、ご注意ください。

セルの列幅はフォント マトリックスに基づいていますが、SpreadsheetGear が .NET から提供される GDI+ のフォント マトリックスを使用する一方で、MS Excel は GDI を使用しているために、両者の間で指定する列幅は微妙に異なります。

回避策として、日本語環境で列幅を設定する場合には、設定したい数値から 0.2 を差し引いた数値を列幅に指定します。例えば、列幅「5」を A 列に設定する場合は以下のように指定します。

          worksheet.Cells["A:A"].ColumnWidth = 5 - 0.2;
        
          worksheet.Cells("A:A").ColumnWidth = 5 - 0.2
        

上記の回避策は、生成するワークブックの地域 (ロケール) が [日本] に設定されている必要があります。詳細は「1. ワークブックのデフォルト フォントが日本語版 Excel と異なります」を参照してください。

行高 (RowHeight プロパティ) に数値を指定する場合、設定値がそのまま出力結果にも反映されますので減算処理は必要ありません。

MS Excel では行 / 列のサイズを明示的に設定しない場合、内部の STANDARDWIDTH レコードには何も書き込まれませんので、その入力ファイルを読み込む場合には SpreadsheetGear のデフォルトの列幅を使用してワークブックを開くことになります。その際に設定される列幅は、「7. セルに設定した列幅が Excel ファイルに正しく反映されません」で説明されるように GDI+ のフォント マトリックスが使用されるために MS Excel の列幅と差異が生じます。

また、入力ファイルのフォントについて Excel 2007 以降では、明示的にセルのフォントやサイズを指定しない場合、フォント情報がファイルに書き込まれませんので、そのワークブックを開く際は各言語バージョンのデフォルト フォントが適用されます。例えばデフォルト設定で作成されたワークブックを MS Excel 日本語版で開く場合に設定されている "MS Pゴシック" は、MS Excel 英語版では "Calibri" フォントで表現されます。

上記を踏まえた回避策として、列幅、デフォルト フォントを明示的に設定したワークブックを入力ファイルに使用します。具体的にはシート全体を選択して、列幅、フォントを明示的に設定する必要があります。

  • MS Excel 2007 以前のバージョンでファイルを生成する場合は、デフォルト フォントの明示的な指定は必要ありません (列幅の指定は必要です)。
  • MS Excel 2007 以降のバージョンでデフォルト フォントの指定が難しい場合は、API でデフォルト フォントを指定することが可能です (以下を参照)。
          SpreadsheetGear.IWorkbook workbook = SpreadsheetGear.Factory.GetWorkbook();

          // MS Excel 日本語版のデフォルト フォントを明示的に指定
          workbook.Styles["Normal"].Font.Name = "MS Pゴシック";
          workbook.Styles["Normal"].Font.Size = 11;
        
          Dim workbook As SpreadsheetGear.IWorkbook = SpreadsheetGear.Factory.GetWorkbook()

          ' MS Excel 日本語版のデフォルト フォントを明示的に指定
          workbook.Styles("Normal").Font.Name = "MS Pゴシック"
          workbook.Styles("Normal").Font.Size = 11
        

はい。SpreadsheetGear 2010 (Ver. 6) からオートフィルタがサポートされています。
SpreadsheetGear 2009 (Ver. 5) およびそれ以前のバージョンでは、ワークブックにオートフィルタが含まれる場合は削除されますので、ご注意ください。

いいえ。ドキュメントのプロパティ情報はサポートされていません。
Excel ファイルを読み込む際に、これらのプロパティ情報は削除されます。

VBA マクロを編集したり実行することはできません。

ただし、VBA マクロを含んだ Excel ファイル (xls/xlsm) を読み込み後、同様のマクロを含んだ状態でワークブックを出力することが可能ですので、例えば、あらかじめマクロを定義してある Excel ファイルを入力ファイルとすることで、出力結果のワークブックに入力ファイルのマクロを反映させることはできます。

なお、SpreadsheetGear 2009 (Ver. 5) までは Excel 97-2003 (xls) 形式のマクロ付きワークブックの出力のみがサポートされています。Excel 2007 Open XML 形式からの xlsm 出力は SpreadsheetGear 2010 (Ver. 6) 以降でサポートされています。

残念ながら、現在までのところ CSV ファイル出力時の Unicode はサポートされていません。

日本語文字を含むワークブックをテキスト ファイルとして出力する場合は、タブ区切りの Unicode テキスト ファイル形式 (UTF-8 形式) で出力する必要があります。

          workbook.SaveAs("output.txt", SpreadsheetGear.FileFormat.UnicodeText);
          // または
          workbook.SaveToStream(Response.OutputStream, SpreadsheetGear.FileFormat.UnicodeText);
        
          workbook.SaveAs("output.txt", SpreadsheetGear.FileFormat.UnicodeText)
          ' または
          workbook.SaveToStream(Response.OutputStream, SpreadsheetGear.FileFormat.UnicodeText)
        

いいえ。残念ながら、現在までのところピボット テーブルはサポートされておりませんので API でピボット テーブルを生成、操作することができません。
また、ピボット テーブルを含むワークブックを読み込む場合、ピボット テーブルはワークブックから削除されます。

"コントロール" タイプのコントロールはサポートされません。

この形式のコントロールは、既存の Windows の OLE タイプの機能に基づいていませんので .NET の 100% マネージ コード環境での実装が非常に複雑なためです。
その一方で "フォーム" タイプのコントロールはサポートされていますので表示/編集ともに問題ありません。

シェイプやイメージのサイズの差異は、既知の制限事項になります。

この現象の原因は以下の 2 点になります。

  • MS Excel と .NET で使用されるフォント マトリックスの差異
    ワークシート上のシェイプやイメージは 2 つのアンカー (左上のセルの行/列位置と、右下のセルの位置) によって位置決めされています。
    ここで、セルの行/列幅は、フォント マトリックスに基づいていますが、SpreadsheetGear が .NET から提供される GDI+ のフォント マトリックスを使用する一方で、MS Excel は GDI を使用しているために、両者の間で指定する列幅が微妙に異なります。そのためシェイプのサイズにもこの影響が及びます。
    列幅の差異については、「8. 読み込んだワークブックのフォントや列幅が出力ファイルに正しく反映されません」もご確認ください。
  • xls と xlsx の互換性の問題
    xlsx/xlsm ではアンカーポイントを、行/列のオフセット + 行/列内のユニット距離 (English Metric Units: EMUs) により格納しており、これは xls 形式の場合の列のオフセット + 列からの小数距離による格納方法と異なります。
    列幅はフォント マトリックスにより算出されるため、異なるフォント マトリックスと EMU による位置計算によって、シェイプの位置やサイズには、それらの位置する列境界の相対距離の影響を受けて差異が生じてしまいます。

上記の理由により、残念ながら MS Excel で使用されているフォント マトリックスが .NET から提供されない限り回避策を提示または製品機能を改善することができません。

Excel および SpreadsheetGear では、日付と時間は数値として格納されます。

この点を踏まえ、使用用途に合わせて以下の各プロパティを参照します。

  • IRange.Formula: セルに設定された値または数式を取得、設定
  • IRange.Value: 数値を取得、設定
  • IRange.Entry: MS Excel の数式バーに表示されるテキストを取得
  • IRange.Text: 書式設定されたテキストを取得

例えば、書式設定されたセルに対して値のみを設定する場合は IRange.Formula を使用します。
日付形式などが書式設定されたセルのテキストを取得する場合は IRange.Text を参照します。

アプリケーションの構成はお客様ごとにさまざまですので、SpreadsheetGear ではベンチマーク資料を提供していません

ただし、多くのお客様からは「他の製品から SpreadsheetGear に切り替えたことでパフォーマンスが顕著に向上した」とのフィードバックを多数いただいております。また SpreadsheetGear は 100% マネージ コードですのでメモリ リークが起こりません。安心してコーディングできるかと思われます。

具体的な処理パフォーマンスに関しては、製品とともにインストールされるサンプル ソリューションが参照になります。
Windows スタート メニューから [SpreadsheetGear 2017] の [SpreadsheetGear Explorer Sample C#] と [SpreadsheetGear Explorer Sample VB] を選択すると Visual Studio 2008 用のサンプル ソリューションで製品の機能と実装例を参照することができます。

このサンプル ソリューションの [Advanced] - [Performance] のデモ サンプルで処理パフォーマンスをご確認いただけます。
ここでのサンプルでは 50,000 行 x 4 列にデータを出力しています。

SpreadsheetGear は .NET ツールになりますので、マルチスレッドの扱いについては .NET 側の処理に依存します。

ただし、SpreadsheetGear では、ワークブックセットのコンセプトに基づいて処理していますので、それぞれのワークブックセット毎に異なるスレッドで、そこに含まれる複数のワークブックを処理することが可能です。
また、IWorkbookSet.GetLock / ReleaseLock / UnwindLock / RewindLock メソッドにより、同一ワークブックセット内のワークブックに対してマルチスレッド処理時の制御を行うことも可能です。

なお、SpreadsheetGear 2012 (Ver. 7) からは .NET 4.0 以降のアセンブリを使用することでマルチスレッド演算処理がサポートされます。

残念ながら、SpreadsheetGear で提供される WorkbookView コントロールおよび各種 Explorer ダイアログのユーザー インターフェースの日本語化の機能は提供されていません。

コントロールやダイアログ画面の日本語化はできませんが、以下の 2 つについてはお客様ご自身でコーディングすることで表示をカスタマイズすることが可能です。

  • マウス右クリックで表示されるコンテキスト メニュー
    既存のコンテキスト メニューに対する変更はサポートされていません。ただしお客様ご自身で ContextMenuStrip を作成し WorkbookView.ContextMenuStrip プロパティを設定することでカスタマイズは可能です。
    例えば、コンテキスト メニューを表示させない場合は、下記のコードで制御できます。
                  WorkbookView.ContextMenuStrip = null;
                
                  WorkbookView.ContextMenuStrip = Nothing
                
  • WorkbookView コントロールで表示されるメッセージ
    SpreadsheetGear.Windows.Forms.ShowErrorEventArgs を活用することで日本語メッセージを表示できます。
    具体的なサンプルは、製品付属のサンプル ソリューション [SpreadsheetGear Explorer C#/VB Sample] 中の [WorkbookView] - [ShowError] を参照してください。

SpreadsheetGear 2017 (Ver. 8) 以降でサポートされています。最新版にて動作をご確認ください。

SpreadsheetGear 2012 (7.3.2.104) 以降でサポートされています。最新版にて動作をご確認ください。

この現象は MS Excel で生成される Open XML (xlsx/xlsm) 形式のワークブックを読み込む場合にのみ発生する既知の制限で、Microsoft Excel 英語版と日本語版の互換性の問題になります (MS Excel 日本語版でシート名に全角かっこを含むワークブックを MS Excel 英語版で読み込み、xlsx/xlsm 形式で出力した場合にも同じ現象が発生します)。

本来、全角かっこを含むシート名は xlsx/xlsm に含まれる workbook.xml ファイル内では単一引用符 (') で囲まれるべきですが、残念ながら、MS Excel (英語版) で書き出されたワークブックでは、シート名を単一引用符 (') で囲いません。そのため、例えば MS Excel 英語版にて全角かっこを含むシート名を「名前定義」したワークブックを、日本語版の MS Excel で開く場合にエラーが発生します。

SpreadsheetGear は、MS Excel 英語版との互換性をベースに開発されていますので、出力されたワークブックを MS Excel 日本語版で読み込む際にも上記のエラーが発生します。残念ながら、現在までのところ、完全には Excel 日本語版にローカライズされていません。将来的に多言語へのローカライズも検討されていますが、具体的な対応予定はありません。

現在の回避策は、

  • Excel 97-2003 (xls) 形式で出力する
  • 単一引用符 (') で囲まないとシート名として判断されない文字 (例えば、本件の全角小かっこ( や )、また、全角アンパサンド (&) など) を使用しない
のいずれかになります。

サポートされないオートシェイプには、次の 2 種類があります。

  • WorkbookView コントロールで表示がサポートされていないシェイプ
    Windows スタートメニューから [SpreadsheetGear 2017] の [SpreadsheetGear 2017 for .NET] を開き、[SpreadsheetGear 2017 for Windows] をクリックしてください。
    任意のワークブックを [SpreadsheetGear 2017 for Windows] で開く場合に、画面上に表示されないオブジェクトやシェイプは、WorkbookView コントロールで表示がサポートされていない、とご判断ください。
    また、WorkbookView コントロールで "表示" が可能なオートシェイプの種類につきましては、上記の [SpreadsheetGear 2017 for Windows] を起動してメニューバーの [Insert] - [Shape] - [Auto Shape] で選択可能なものになります。
  • SpreadsheetGear の API を使用して出力したワークブックでサポートされないシェイプ
    上記で "表示" がサポートされていないオートシェイプについても、API でこれらのシェイプを読み込んで出力する際に「xls 形式の入力を xls/xlsx/xlsm 形式で出力する」場合は、元のシェイプをそのまま出力ファイルに反映させることができます。
    その一方で「xlsx/xlsm 形式の入力を xls/xlsx/xlsm 形式で出力する」場合、xlsx/xlsm 上のいくつかのオートシェイプは読み込みがサポートされていませんので、出力結果にも反映されません。ご注意ください。
    詳細は、上記の [SpreadsheetGear 2017 for Windows] で読み込んだワークブックを保存することでご確認いただけます。

    補足として、SpreadsheetGear ではコネクタ タイプのシェイプがサポートされていませんのであらかじめご了承ください。Excel 2007 以降では Line を挿入する場合、Excel は "直線コネクタ" として生成されますので、ワークブックを読み込むと、これらの "直線コネクタ" は削除されます。ご注意ください。

残念ながら、既知の制限になります。

SpreadsheetGear では VBA マクロを含むワークブックの読み込み、出力をサポートしていますが、オートシェイプに関連付けられたマクロの場合は、出力時にその関連付けが保持されません (マクロそのものは削除されずに出力されます)。

本件については今後の機能改善リストにファイルされていますが、現時点での対応時期は未定となっています。

WorkbookView コントロールでは、MS Excel のセルの書式設定「縮小して全体を表示する」(Excel API の "ShrinkToFit" プロパティ) の設定がコントロール上の描画に反映されません。

本件については今後の機能改善リストにファイルされていますが、現時点での対応時期は未定となっています。
※出力結果のワークブックには正常に反映されます。

SpreadsheetGear は Microsoft Excel のファイル仕様への準拠を第一とし、正式には iOS、Android または OpenOffice などのプラットフォームやサードパーティー社で提供される Excel 製品はサポートしていません。

ただし、試験的に iOS などの環境で参照を可能にするためのオプション (IWorkbookSet.Experimental) を用意しています。下記のコードで出力されるワークブックは iOS などで開けるかと思われます。

          SpreadsheetGear.IWorkbookSet workbookset = SpreadsheetGear.Factory.GetWorkbookSet(
                        new System.Globalization.CultureInfo(1041));
          workbookset.Experimental = "OleDbOpenXmlWorkaround";    // サードパーティ向けの回避オプションを指定

          SpreadsheetGear.IWorkbook workbook = workbookset.Workbooks.Add();
          SpreadsheetGear.IWorksheet worksheet = workbook.Worksheets[0];
        
          Dim workbookset As SpreadsheetGear.IWorkbookSet = SpreadsheetGear.Factory.GetWorkbookSet(_
                        New System.Globalization.CultureInfo(1041))
          workbookset.Experimental = "OleDbOpenXmlWorkaround"     ' サードパーティ向けの回避オプションを指定

          Dim workbook As SpreadsheetGear.IWorkbook = workbookset.Workbooks.Add()
          Dim worksheet As SpreadsheetGear.IWorksheet = workbook.Worksheets(0)
        
  • このオプションは、Open XML 形式のワークブックでのみ有効です。
  • OleDb でも有効です。
  • あくまでも「試験的」なオプションですので、完全な動作は保証されません。

Open XML (XLSX、XLSM) 形式のワークシートを開く場合、シート上の画像は PNG または JPG 形式のみ、読み込みがサポートされています。

例えば、読み込み対象のワークシートに TIFF 形式の画像を挿入している場合、この画像は読み込むことができませんので、IShape オブジェクトとして参照することができません。
※Excel 97-2003 (XLS 形式) のワークシートの場合は、すべての画像形式がサポートされます。

残念ながら、現時点ではシート保護機能ので個別の保護オプション (オブジェクトの編集、列の書式設定、オートフィルタの使用など) の指定はサポートされていません。

そのため SpreadsheetGear でシート保護を設定する際に、シェイプの選択可否や列幅の変更可否などを個別に指定することはできません。またそれらの保護オプションが設定されたワークシートを SpreadsheetGear で読み込む際も、それらのオプション設定は無効になります。

本件については今後の機能改善リストにファイルされていますが、現時点での対応時期は未定となっています。

現在までのところ Excel 2007-2010 Open XML (xlsx/xlsm) 形式のワークブックに配置されたコメントおよびフォーム コントロールの読み書きはサポートされておりません。

これらのコメントやコントロールはワークブックを読み込む際に削除されます。また SpreadsheetGear で追加されたコメントを Open XML (xlsx/xlsm) 形式で出力する場合、これらのコメントはテキストボックスに変換されます。
なお、Excel 97-2003 (xls) 形式の場合は、コメントもフォーム コントロールもサポートされます。

残念ながら、既知の制限になります。

SpreadsheetGear では、"Biff8" (*.xls) ファイル形式を使用して Windows のクリップボードとデータのやり取りを行っていますので、65,536 行 (および 256 列) の制限を受けることになります。Excel では、"Biff12" (*.xlsb) ファイル形式の変数を使用することで、拡張された Open XML 形式の行、列数制限でクリップボートとやり取りが可能になりますが、現時点で SpreadsheetGear には、この XLSB 形式が実装されていません。

本件については今後の機能改善リストにファイルされていますが、現時点での対応時期は未定となっています。

以前の SpreadsheetGear バージョンでは、Excel Mobile、Excel 2016、Office 365 などで生成されたワークブックを読み込む際に、"Corrupt OpenXML document" の例外がスローされる場合があります。これは旧バージョンにおける Excel の内部データの取り扱い方法が、これらの Excel バージョンに十分に対応していなかったためです。

これらのワークブックの読み込みは SpreadsheetGear 2012 (7.4.17.102) 以降でサポートされています。最新版にて動作をご確認ください。


ページトップへ