日本語環境、個別の機能についてよくある質問

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

  • このページの内容は、従来の .NET Framework 向けの SpreadsheetGear for .NET Framework の機能を対象としています。
  • クロスプラットフォーム向けの SpreadsheetGear Engine for .NET および SpreadsheetGear for Windows の機能や対応状況については、お問い合わせください。

ファイル入出力、ワークブック、ワークシートに関する質問

  1. 全角かっこを含むシート名が名前定義されているファイルが開けません。
  2. Excel 2010 以降のパスワード保護が設定された xls 形式のファイルを開けません。
  3. 出力したファイルを Excel で開くと「変更を保存しますか?」のメッセージが表示されます。
  4. ワークブックを CSV 形式で出力すると日本語が文字化けします。
  5. ワークシートを印刷する際に、改ページ位置が Excel と異なります。
  6. 出力されたワークブックを iOS、Android または OpenOffice で読み込めますか?
  7. 出力結果のワークブックにマクロを埋め込めますか?
  8. 大量のデータを扱いたいのですが、パフォーマンスが気になります。
  9. マルチスレッドの処理は可能ですか?

セル、書式設定、ワークシート内の設定に関する質問

  1. セルの値の取得や設定は、どのプロパティを使用すれば良いですか?
  2. セルに特定のフォントを指定するにはどうすれば良いですか?
  3. セルに設定された "=DOLLAR" 関数を参照すると、"=USDOLLAR" が返されます。
  4. アスタリスク (*) 付きやユーザー定義の日付書式が正しく反映されません。
  5. 出力結果のワークブックに、ふりがなが反映されません。
  6. セルに設定した列幅が Excel ファイルに正しく反映されません。
  7. AutoFit (列幅の自動調整) を適用した列幅が出力ファイルに正しく反映されません。
  8. 結合セルを含んだセル範囲に対する、行や列の挿入や削除ができません。
  9. リスト形式のデータの入力規則が出力ファイルに反映されません。

グラフに関する質問

  1. 3D 効果のグラフを描画できません。
  2. 散布図 (XY Scatter) グラフの複合グラフを描画できません。
  3. グラフの系列の参照範囲に設定された静的な値がグラフに反映されません。

オートシェイプ、フォーム コントロール、オブジェクトに関する質問

  1. オートシェイプやイメージのサイズが、出力ファイルに正しく反映されません。
  2. ワークブックの読み込みや出力の際に、いくつかのオートシェイプが削除されます。
  3. ワークブックの読み込みや出力の際に、いくつかの画像が削除されます。
  4. ワークブック上のコメントやコントロール (ボタン、チェックボックスなど) が消えてしまいます。
  5. オートシェイプに関連付けられた VBA マクロが出力ファイルで動作しません。
  6. 縦書きテキストボックスが、出力結果のワークブックでは横書きに変更されてしまいます。
  7. ワークシート上のオブジェクトをコピーできますか?

その他の Excel 互換機能、WorkbookView コントロールに関する質問

  1. ピボット テーブル付きのワークブックの読み込みや設定は可能ですか?
  2. セルの書式設定「縮小して全体を表示する」が WorkbookView での表示や印刷時に反映されません。
  3. 和暦 (元号) の日付書式が WorkbookView での表示や印刷時に反映されません。
  4. WorkbookView コントロールの UI を日本語で表示できますか?
  5. Excel 上でコピーしたセルが最大で 65,536 行までしか WorkbookView コントロールに貼り付けられません。
  6. ワークシートやワークブックを PDF 形式で出力できますか?
  7. 全角文字にもかかわらず、Excel の LENB 関数の結果が LEN と同じになります。

ページトップへ

ファイル入出力、ワークブック、ワークシートに関する質問

  1. 全角かっこを含むシート名が名前定義されているファイルが開けません。

    この現象は、全角かっこを含むシート名が "名前定義の参照する範囲" に指定されているワークブックを SpreadsheetGear から Open XML (xlsx、xlsm) 形式で出力する場合に発生する既知の制限になります。

    ここで出力されたワークブックを Excel で読み込む際に「'ファイル名.xlsx' の一部の内容に問題が見つかりました。可能な限り内容を回復しますか?ブックの発行元が信頼できる場合は、[はい] をクリックしてください。」といったエラーが発生しますが、この現象は Excel 英語版と日本語版の非互換に起因します (Excel 日本語版でシート名に全角かっこを含むワークブックを Excel 英語版で読み込み、xlsx や xlsm 形式で出力した場合にも同じ現象が発生します。
    ※なお Excel 2013 以降の英語版では、この現象が改善されています。

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

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

    現在の回避策として、以下の方法が挙げられます。

    • Excel 97-2003 (xls) 形式で出力する
    • 単一引用符で囲まないとシート名として判断されない文字 (主に全角文字で表現された ASCII 記号) を使用しない
      例として、
      • 全角の小かっこ: "" や ""
      • 全角のアンパサンド: ""
      • 全角の波ダッシュ: ""
      • 全角のカンマ、ピリオド (句読点): "" や ""
      • 全角のスペース: " "
      などが該当します。
      なお、""、""、"" などの非 ASCII 記号の全角文字は、単一引用符で囲まれない場合でもシート名として判断されるため使用可能かと思われます。

    ページトップへ

  2. Excel 2010 以降のパスワード保護が設定された xls 形式のファイルを開けません。

    SpreadsheetGear 製品では Excel 97-2003 (xls) 形式のワークブックの読み込み時に、下記の 2 つの暗号化のみをサポートしています。

    • 弱い暗号化 (XOR)
    • Office 97/2000 互換
    ここで、Excel 2013 以降ではワークブックを暗号化する際に上記の 2 つとは異なる
    • RC4, Microsoft Enhanced Cryptographic Provider v1.0
    の暗号化が設定されるように仕様が変更されたため、SpreadsheetGear では Excel 2013 以降から出力される暗号化された xls 形式のワークブックの読み込み時に「Unsupported encryption method」のエラーが発生します。

    回避策は Excel 2007 デフォルトの暗号化によりパスワード保護されたファイルを使用する方法、または xlsx 形式で再保存したワークブックを使用する方法になります。

    ページトップへ

  3. 出力したファイルを Excel で開くと「変更を保存しますか?」のメッセージが表示されます。

    Excel には、calcId というレコードが存在しますが、Excel の各ビルド毎にこの ID が異なるために、現象が発生しています。
    ※本製品では、意図的に古い calcId (Excel 2003 以前) を書き込んでいますが、これは Excel に再計算をさせる目的があるからです。

    回避策として、下記の 2 つの方法が考えられます。

    • 計算式の埋め込まれたセルを値に置き換える
      ワークブックをファイルとして保存する際に、セルに設定された数式の代わりに、数式の結果をセルに書き込むことでファイルを開く際に再計算が行われなくなりますので、変更保存メッセージを抑止することができます。
    • 再計算を [手動] に設定する
      ワークブックを保存する前に、IWorkbookSet.Calculation に Calculation.Manual を設定します。ただし、これにより [F9] ボタンを押下するまで再計算は行われない、という点にご注意ください。
                          // ワークブックのオープン
                          SpreadsheetGear.IWorkbookSet workbookset = SpreadsheetGear.Factory.GetWorkbookSet();
                          SpreadsheetGear.IWorkbook workbook = workbookset.Workbooks.Open(@"input.xlsx");
      
                          // 再計算を [手動] に設定する
                          workbookset.Calculation = SpreadsheetGear.Calculation.Manual;
      
                          // ワークブックを出力
                          workbook.SaveAs(@"output.xlsx", SpreadsheetGear.FileFormat.OpenXMLWorkbook);
                        

    ページトップへ

  4. ワークブックを CSV 形式で出力すると日本語が文字化けします。

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

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

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

    ページトップへ

  5. ワークシートを印刷する際に、改ページ位置が Excel と異なります。

    Excel と SpreadsheetGear で、印刷結果の改ページ位置が異なる理由は、下記の 2 つが考えられます。

    • Excel と .NET 間の使用フォントによる差異
      SpreadsheetGear では、Excel と同じように印刷余白などを読み込み、Excel のレンダリング、配置、レイアウト方法など、できる限り同じように処理していますが、両者にはいくつかキーとなる違いがあります。これは主に .NET API での制限によるものです。
      SpreadsheetGear ではアンチエイリアス フォントを使用していますが、Excel ではこれを使用していないため、印刷余白やテキストのレイアウトなどに相違が生まれます。これは、印刷時だけでなく、「セルに設定した列幅が Excel ファイルに正しく反映されません」などにも影響します。
    • 自動改ページによる差異
      Excel の印刷設定は、プリンター ドライバーの用紙設定に依存せず、変換元のドキュメントにあらかじめ設定されている印刷設定 (用紙サイズ、用紙向きなど) がそのまま印刷結果に反映されます。その一方で、自動改ページ (青の点線で区切られた改ページ) の場合、ページ区切り位置は、出力するプリンターに依存します。
      そのため、SpreadsheetGear では IPageSetup にてワークブックの用紙サイズ、用紙の向き、明示的に設定されている改ページ位置などは参照が可能ですが、自動改ページの場合 (改ページが明示的に設定されていない場合) は、改ページ情報を取得できる API は提供されていません。

    上記を踏まえた回避策は、印刷範囲をいったんクリアした後で、必要な改ページ位置を明示的に設定する方法になります。

                    // 印刷範囲のクリア
                    worksheet.PageSetup.PrintArea = "";
    
                    // 改ページ情報をいったんクリア
                    worksheet.Cells.PageBreak = SpreadsheetGear.PageBreak.None;
    
                    // 列方向の改ページ位置設定 (10 列目と 20 列目)
                    worksheet.VPageBreaks.Add(worksheet.Cells["J1"]);
                    worksheet.VPageBreaks.Add(worksheet.Cells["T1"]);
    
                    // 行方向の改ページ位置設定 (10 行目と 20 行目)
                    worksheet.HPageBreaks.Add(worksheet.Cells["A11"]);
                    worksheet.HPageBreaks.Add(worksheet.Cells["A21"]);
                  

    最初の説明の「使用フォントによる差異」により、改ページ位置を明示的に指定しても期待する出力結果が得られない場合があります。その場合は Excel の [拡大縮小印刷] の機能で回避できる場合もあります。

    • IPageSetup.Zoom (Excel の [拡大/縮小] 機能)
      指定ページ範囲内に正しく改ページが発生するように、IPageSetup.Zoom = 90 (90% に縮小) などの縮小印刷を指定します。
    • IPageSetup.FitToPages (Excel の [次のページ数に合わせて印刷] 機能)
      IPageSetup.FitToPages = True としたうえで、IPageSetup.FitToPagesWide (横) および IPageSetup.FitToPagesTall (縦) プロパティにて、印刷範囲が指定したページ数に収まることを明示的に指定する方法です。ただし、VPageBreaks や HPageBreaks で指定した改ページ位置は無視されますのでご注意ください。

    ページトップへ

  6. 出力されたワークブックを iOS、Android または OpenOffice で読み込めますか?

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

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

                  SpreadsheetGear.IWorkbookSet workbookset = SpreadsheetGear.Factory.GetWorkbookSet();
                  workbookset.Experimental = "OleDbOpenXmlWorkaround";    // サードパーティ向けの回避オプションを指定
    
                  SpreadsheetGear.IWorkbook workbook = workbookset.Workbooks.Add();
                  SpreadsheetGear.IWorksheet worksheet = workbook.Worksheets[0];
                
    • このオプションは、Open XML 形式のワークブックでのみ有効です。
    • OLE DB でも有効です。
    • あくまでも「試験的」なオプションですので、完全な動作は保証されません。

    ページトップへ

  7. 出力結果のワークブックにマクロを埋め込めますか?

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

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

    ページトップへ

  8. 大量のデータを扱いたいのですが、パフォーマンスが気になります。

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

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

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

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

    ページトップへ

  9. マルチスレッドの処理は可能ですか?

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

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

    ※マルチスレッド演算処理は、.NET 4.0 以降のアセンブリを使用することでサポートされます。

    ページトップへ

セル、書式設定、ワークシート内の設定に関する質問

  1. セルの値の取得や設定は、どのプロパティを使用すれば良いですか?

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

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

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

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

    ページトップへ

  2. セルに特定のフォントを指定するにはどうすれば良いですか?

    セルのフォントの詳細を設定するには、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ゴシック";
                

    ページトップへ

  3. セルに設定された "=DOLLAR" 関数を参照すると、"=USDOLLAR" が返されます。

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

    ページトップへ

  4. アスタリスク (*) 付きやユーザー定義の日付書式が正しく反映されません。
    アスタリスク (*) 付きの日付書式について

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

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

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

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

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

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

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

    ページトップへ

  5. 出力結果のワークブックに、ふりがなが反映されません。

    残念ながら、セルに設定された「ふりがなの表示」や、セルの文字列にふりがなを付与する PHONETIC 関数はサポートされておりません。これらの設定や関数はワークブックを読み込む際に無効になります。

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

    ページトップへ

  6. セルに設定した列幅が Excel ファイルに正しく反映されません。

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

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

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

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

    ページトップへ

  7. AutoFit (列幅の自動調整) を適用した列幅が出力ファイルに正しく反映されません。

    セルに設定した列幅が Excel ファイルに正しく反映されません」で説明されるように、既知の制限になります。

    基本的に GDI+ で計測されるサイズは GDI の場合よりも多少、小さい値になりますので、Excel で開く場合に文字が設定された列幅からはみ出してしまいます。回避策として、AutoFit を実行後に列サイズを少しだけ広げる方法が挙げられます。

                  // 列 A、列 B の列幅を自動調整する場合
                  worksheet.cells["A:B"].EntireColumn.AutoFit();
                  foreach (SpreadsheetGear.IRange column in worksheet.cells["A:B"].Columns)
                  {
                      column.ColumnWidth *= 1.24;
                  }
                

    上記の設定値はあくまでも参考になります。処理対象となるセルの内容によっては、サイズに大きな過不足が生じる場合もありますので、お客様ご自身でご確認いただきますよう、お願いします。

    ページトップへ

  8. 結合セルを含んだセル範囲に対する、行や列の挿入や削除ができません。

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

    SpreadsheetGear では、結合セルが含まれたセル範囲への行や列の挿入、削除を行う場合に "Operation is not valid for a partial merged cell." のエラーが発生します。可能性のある回避策 (行を挿入する場合) としては下記の手順が挙げられます。

    1. 挿入処理の前に対象行の結合セル状況 (IRange.MergeArea) を退避
    2. 結合セル範囲 (MergeArea.Address) を IRange.UnMerge() で解除
    3. IRange.EntireRow.Insert() で行を挿入
    4. 最初に退避させた結合セル状況を再度、IRange.Merge() にて反映

    上記の手順はあくまでも参考手順になります。処理対象となるセル範囲の結合状況によっては、より複雑なセル結合の判定や再結合の処理が必要になる場合もありますので、具体的な実装方法や実装可否については、お客様ご自身でご確認いただきますよう、お願いします。

    ページトップへ

  9. リスト形式のデータの入力規則が出力ファイルに反映されません。

    入力規則に指定するドロップダウンの選択項目「元の値」が別シートの値を参照していないかをご確認ください。

    リスト形式のデータの入力規則について、別シートの値をドロップダウンの「元の値」に指定する (別シートを参照する) 方法は Excel 2007 以降でサポートされた機能になりますが、現時点で、本製品では この Open XML 形式から可能となった指定方法がサポートされていません。本製品では、Excel 2003 (xls) 形式と同様、直接セル範囲を指定する場合は同一シートの値のみが参照可能です。

    別シートの値をドロップダウンの選択項目に設定するための回避策としては、別シートのセル範囲を「名前定義」し、その名前を入力規則リストの「元の値」に指定する方法になります。たとえば、Sheet1 のセルに対して Sheet2 のセル範囲 (A1:A5) をドロップダウンの選択項目に指定する場合は、リストの条件の「元の値」に "=Sheet2!A1:A5" と指定する代わりに、当該セル範囲を「リストアイテム」などの名前で定義し、「元の値」には "=リストアイテム" のように指定します。

    ページトップへ

グラフに関する質問

  1. 3D 効果のグラフを描画できません。

    WorkbookView コントロールでは、3D 効果のグラフ設定がコントロール上の描画に反映されません。

    グラフ オブジェクトの ChartType に、Column3D や Line3D などの「グラフ名 + 3D」のグラフ形式を指定したり、Surface などの 3D グラフ形式を指定すると、Workbook Viewer 上のグラフ エリアには「3D Column Chart Rendering Not Supported」のように表示されます (ただし、ワークブックとしてファイル出力する場合には、正常に反映されます)。

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

    ページトップへ

  2. 散布図 (XY Scatter) グラフの複合グラフを描画できません。

    残念ながら、現時点では縦棒や折れ線などの Category Type のグラフと散布図 (XY Scatter) グラフの複合グラフがサポートされていません。

    一方で、これらの複合グラフがすでに配置されているワークブックの読み込みや書き出しについては基本的にサポートされていますので、回避策としては、あらかじめ複合グラフや系列などが設定されているテンプレート ファイルを本製品で読み込んで、プログラム内でそのデータ範囲などを変更して最終的なグラフを生成する、といった方法になります。

    ページトップへ

  3. グラフの系列の参照範囲に設定された静的な値がグラフに反映されません。

    グラフ内でセル範囲の代わりに静的な値を参照元に設定する場合、これらの静的な値 (スタティックな値) は Excel のデータ キャッシュに保存されます。一方で、残念ながら SpreadsheetGear では、グラフの「スタティック データ キャッシュ」の読み取りや書き出しがサポートされていませんので、これらの系列に設定された値はプロットできるデータとして存在しないことになります。

    回避策としては、これらの静的な値 (たとえば "={1,2,3,4,5}" など) の代わりに、通常のセル範囲 (たとえば "=Sheet1!$A$1:$A$5" など) を参照範囲に設定する方法になります。

    ページトップへ

オートシェイプ、フォーム コントロール、オブジェクトに関する質問

  1. オートシェイプやイメージのサイズが、出力ファイルに正しく反映されません。

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

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

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

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

    ページトップへ

  2. ワークブックの読み込みや出力の際に、いくつかのオートシェイプが削除されます。

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

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

    ページトップへ

  3. ワークブックの読み込みや出力の際に、いくつかの画像が削除されます。

    SpreadsheetGear 製品が "直接" サポートする画像形式は下記のとおりです。

    • WinForms 環境: jpg、png、emf 形式
    • WPF 環境: jpg、png 形式

    その他の画像形式の場合、SpreadsheetGear は内部の .NET ライブラリを使用して png 形式に変換する仕様になっていますが、ここで png 形式に変換できない画像形式については、本製品で読み込むことができないため、ワークブックから削除されます。同様に、SpreadsheetGear の AddPicture() で画像をワークブックに追加する際にも、png 形式に変換できない画像形式の場合は「Unable to convert the image to PNG format.」のエラーが発生します。

    回避策としては、画像編集ツールなどで jpg や png 形式に変換した画像を読み込み対象のワークブックに追加しておく方法が挙げられます。AddPicture() でワークブックに画像を追加する際にも、jpg または png 形式の画像を指定するようにします。

    ページトップへ

  4. ワークブック上のコントロール (ボタン、チェックボックスなど) が消えてしまいます。

    "コントロール" タイプのコントロールはサポートされません。この形式のコントロールは、既存の Windows の OLE タイプの機能に基づいていませんので .NET の 100% マネージ コード環境での実装が非常に複雑なためです。

    ※"フォーム" タイプのコントロールは、SpreadsheetGear 2023 (Ver. 9) からサポートされています。

    ページトップへ

  5. オートシェイプに関連付けられた VBA マクロが出力ファイルで動作しません。

    以前のバージョンにおける既知の制限になります。

    SpreadsheetGear 2023 (Ver. 9) からは、オートシェイプに関連付けられたマクロは出力ファイルに保持されますので、正常に動作させることができます。

    ページトップへ

  6. 縦書きテキストボックスが、出力結果のワークブックでは横書きに変更されてしまいます。

    SpreadsheetGear における縦書きテキストボックスの [行の並び] (文字の方向) は「左から右」のみがサポートされています。

    縦書きや横書きを指定する [文字列の方向] と文字の方向を指定する [行の並び] の 2 つのプロパティは、Open XML 形式のファイル内部で連結して格納されています。その一方で、残念ながら現時点で SpreadsheetGear 製品での [行の並び] (文字の方向) は「左から右」のみがサポートされているため、結果的に出力時には、これら 2 つのプロパティが同時に欠落することで、縦書きテキストボックスが横書きに変更されてしまいます。

    完全な回避策ではありませんが、少なくとも「縦書き」のテキストボックスを出力結果に反映させるためには、行の並びを「左から右」に指定します。

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

    ページトップへ

  7. ワークシート上のオブジェクトをコピーできますか?

    残念ながら、現時点ではワークシート上のオートシェイプ、画像、グラフなどのオブジェクト単独のコピーや貼り付けがサポートされていません。これらのオブジェクトをコピーするには、ISheet.CopyBefore や CopyAfter によりワークシート全体をコピーする必要があります。

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

    ページトップへ

Excel 互換機能、WorkbookView コントロールに関する質問

  1. ピボット テーブル付きのワークブックの読み込みや設定は可能ですか?

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

    ページトップへ

  2. セルの書式設定「縮小して全体を表示する」が WorkbookView での表示や印刷時に反映されません。

    残念ながら、WorkbookView コントロールでは、Excel のセルの書式設定「縮小して全体を表示する」(Excel API の "ShrinkToFit" プロパティ) の設定がコントロール上の描画に反映されません。また、WorkbookView コントールや WorkbookPrintDocument による印刷処理 (プリンター印刷や PDF 出力処理) においても同様に、この書式設定の出力がサポートされていません (ただし、ワークブックをファイル出力する際には正常に反映されます)。

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

    ページトップへ

  3. 和暦 (元号) の日付書式が WorkbookView での表示や印刷時に反映されません。

    残念ながら、本製品は完全には Excel 日本語版にローカライズされておらず、「昭和」「平成」「令和」などの和暦 (元号) の書式 ([$-ja-JP]ggge"年"m"月";@ や [$-411]ggge"年"m"月"d"日";@ などの書式) の描画がサポートされていません。また、WorkbookView コントールや WorkbookPrintDocument による印刷処理 (プリンター印刷や PDF 出力処理) においても同様に、この書式設定の出力がサポートされていません (ただし、ワークブックをファイル出力する際には正常に反映されます)。

    本件については今後の機能改善リストにファイルされており、将来的に多言語へのローカライズも検討されていますが、現時点での対応時期は未定となっています。

    ページトップへ

  4. WorkbookView コントロールの UI を日本語で表示できますか?

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

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

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

    ページトップへ

  5. Excel 上でコピーしたセルが最大で 65,536 行までしか WorkbookView コントロールに貼り付けられません。

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

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

    ここで一番の問題は、.NET がクリップボードの遅延レンダリングをサポートしていない点になります。そのため、仮に SpreadsheetGear 側で xlsb 形式をサポートしたとしても、依然として xls 形式によるクリップボードへのコピーも同時に実装しておく必要があります。一方で、Microsoft 社が .NET の遅延レンダリング機能を追加したとしても、同様に xlsb 形式での書き込み機能を本製品に実装するためには、非常に大きな工数が必要になります。

    なお、テキスト データであれば、現時点でも Windows のクリップボードからすべての行を貼り付けることが可能です。ただし、そこにはセルの書式は含まれませんので、ご注意ください。

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

    ページトップへ

  6. ワークシートやワークブックを PDF 形式で出力できますか?

    残念ながら、SpreadsheetGear にはビルトインの PDF 出力機能は実装されていません。

    その一方で SpreadsheetGear では、Excel ファイルを任意のプリンターから印刷する機能は提供されていますので、 Windows 10、Windows Server 2016 以降で標準装備されている仮想プリンターの [Microsoft Print to PDF] を使用することで PDF 出力を実現することが可能です。

                  // 出力対象をワークシートとする
                  SpreadsheetGear.Printing.PrintWhat printWhat;
                  printWhat = SpreadsheetGear.Printing.PrintWhat.Sheet;
    
                  SpreadsheetGear.Drawing.Printing.WorkbookPrintDocument document =
                                      new SpreadsheetGear.Drawing.Printing.WorkbookPrintDocument(workbook.ActiveSheet, printWhat);
    
                  // Windows の仮想プリンター [Microsoft Print to PDF] を指定して PDF 出力する
                  document.PrinterSettings.PrinterName = "Microsoft Print to PDF";
                  document.PrinterSettings.PrintFileName = @"c:\output.pdf";
                  document.PrinterSettings.PrintToFile = true;
                  document.Print();
                
    • 本製品の内部で使用している .NET 標準の System.Printing 名前空間は、Windows サービスや ASP.NET アプリケーションを十分にサポートしていませんのでご注意ください。詳細は、System.Printing Namespace ページの最下部「注意事項」欄をご確認ください。
    • 「SpreadsheetGear Engine for .NET」では印刷機能 (SpreadsheetGear.Drawing.Printing アセンブリ) が提供されないため、上記のサンプル コードは実装できません。 PDF 出力を含めた印刷機能は「SpreadsheetGear for .NET Framework」および「SpreadsheetGear for Windows」でサポートされます。

    ページトップへ

  7. 全角文字にもかかわらず、Excel の LENB 関数の結果が LEN と同じになります。

    基本的に LENB は常に LEN と同じ値を返しますが、これは製品の既知の制限 (仕様) になります。また、MIDB や RIGHTB などの *B 関数についても同様です。

    実際に、LENB を含むワークブックを Excel 英語版で開くと、LEN と LENB は同じ結果として表示されます。SpreadsheetGear は、Excel 英語版との互換性をベースに開発されていますので、Excel 英語版と同様に LEN と LENB の演算結果は同じになります。※なお、こちらが把握するかぎりでは、LENB が LEN と異なる値を返すのは、デフォルトの言語が DBCS 環境の国の Excel の場合になります。

    なお、以下の API を参照することで Shift-JIS 環境におけるバイト長 (VB6 環境での LENB) を .NET 環境で取得できます。

                  System.Text.Encoding.GetEncoding("Shift_JIS").GetByteCount(str);
                


ページトップへ