概要

スプレッドシート ドキュメント は、行と列の表形式でデータが格納されたドキュメントです。ワークブック とも呼ばれます。スプレッドシート ドキュメントには多数の形式があり、Office Open XML(XLSX、XLSM など)、Microsoft Excel バイナリ ファイル形式(XLS、XLT)、OpenDocument スプレッドシート形式(ODS、FODS、OTS)、テキストベースの区切り文字形式(CSVTSV など)があります。これらはすべて「スプレッドシート形式ファミリー」と呼ばれます。GroupDocs.Viewer は、インポート時にほぼすべてのスプレッドシート形式をサポートし、HTML、PDF、PNG、JPEG にレンダリング(変換)できます。本記事では、その方法と利用可能なオプション、使用すべきタイミングと理由を説明します。

Rendering a workbook, opened in MS Excel, to the HTML format

基本的な使用方法

まず最初にオプションについて説明します。パブリック API には、SpreadsheetOptions というクラスが用意されています。これは GroupDocs.Viewer.Options 名前空間にあり、スプレッドシート形式ファミリーのレンダリング調整専用に設計されています。4 つのビューオプションすべてで、SpreadsheetOptions プロパティを通じてアクセスできます。

明示的に指定しない場合、SpreadsheetOptions プロパティは、デフォルトで同クラスのインスタンスが暗黙的に使用されます。これは本記事の後半で詳しく説明します。

一目で分かるように、GroupDocs.Viewer でスプレッドシート ドキュメントをレンダリングするのは非常に簡単で、他の形式と同様です。まず ViewOptions のインスタンスを作成し、次に入力スプレッドシート ドキュメントを指定して Viewer のインスタンスを作成し、最後に Viewer.View(viewOptions) メソッドを呼び出します。以下のコードサンプルは、単一の入力スプレッドシート ファイルを 4 つの出力形式(HTML、PDF、PNG、JPEG)にレンダリングする例です。オプションクラスのインスタンスを作成する以外にスプレッドシート固有の調整は行っていないため、すべてのスプレッドシート オプションはデフォルト値のままです。

using GroupDocs.Viewer;
using GroupDocs.Viewer.Options;
// ...

HtmlViewOptions htmlOptions = HtmlViewOptions.ForEmbeddedResources("worksheet_{0}.html");
PdfViewOptions pdfOptions = new PdfViewOptions("Output_spreadsheet.pdf");
PngViewOptions pngOptions = new PngViewOptions("worksheet_{0}.png");
JpgViewOptions jpegOptions = new JpgViewOptions("worksheet_{0}.jpeg");

using (Viewer viewer = new Viewer("spreadsheet.xlsx"))
{
    viewer.View(htmlOptions);
    viewer.View(pdfOptions);
    viewer.View(pngOptions);
    viewer.View(jpegOptions);
}

次に ワークシート について説明します。すべてのスプレッドシートには少なくとも 1 つのワークシートがあります。Microsoft Excel のような表処理ソフトでは、ワークシートは タブ として表示されます。テキストベースの区切り文字形式(CSV、TSV など)では、単一のワークシートしか持たないことがあります。

デフォルトでは GroupDocs.Viewer は対象スプレッドシート内のすべてのワークシートをレンダリングしますが、変更可能です。Viewer.View() メソッドには、2 番目のパラメータとしてページ番号の配列 Int32[] pageNumbers を受け取るオーバーロードがあります。このパラメータを使用すると、指定したページ(=ワークシート)だけがレンダリングされます。このパラメータは汎用的で、ページを持つすべてのサポート形式に適用されますが、スプレッドシート形式ファミリーでは「表示するワークシート番号」を指します。

ページ番号(ワークシート番号)は 1 から始まる 1 ベース であることに注意してください。0 からではありません。

以下の例は、3 枚のワークシートを持つスプレッドシートの 1 番目と 3 番目のワークシートを PNG にレンダリングする方法を示しています。

using GroupDocs.Viewer;
using GroupDocs.Viewer.Options;
// ...

PngViewOptions pngOptions = new PngViewOptions("worksheet_{0}.png");
using (Viewer viewer = new Viewer("spreadsheet.xlsx"))
{
    viewer.View(pngOptions, 1, 3);
}

ワークシートをページに分割する

GroupDocs.Viewer はドキュメントを「ページ」にレンダリングします。ここでいうページとは、ディスプレイや A4 用紙に相当する比較的小さな矩形領域を指します。一方、ワークシートは非常に大きくなることがあります。たとえば、現在は廃止された XLS 形式は最大 256 列・65536 行をサポートし、最新の XLSX (Office Open XML Workbook) 形式と Microsoft Excel は最大 16384 列・1048576 行をサポートします。ワークシートをページに「収める」ことは、GroupDocs.Viewer でスプレッドシートをレンダリングする際の重要なステップです。ページに収めるために、GroupDocs.Viewer は ワークシート分割 を行います。ワークシートは複数の矩形チャンクに分割され、各チャンクが別々のページに配置されます。分割方法は 5 種類あり、以下に一覧と説明を示します。

重要なのは、これらすべての分割方法が同じ手順で指定されることです。具体的には、SpreadsheetOptions クラスの 静的ファクトリ メソッド を使用してインスタンスを作成します。

1 ページに全ワークシートをレンダリング

SpreadsheetOptions.ForOnePagePerSheet()

最も簡単な方法は、分割をオフにしてページサイズを調整し、ワークシート全体を 1 ページに収めることです。ワークシートが小さいことが事前に分かっている場合に適しています。ただし、ワークシートが非常に大きい場合は結果が酷くなる可能性があります。たとえば HTML にレンダリングすると、数十〜数百 MiB の巨大な HTML ファイルになることがあり、ブラウザでの表示に支障をきたすことがあります。JPEG にレンダリングする場合、幅または高さが 65535 ピクセルを超えると問題が発生します。したがって、このモードは意図的に使用してください。

Render worksheet on one page

ページブレークでワークシートを分割

SpreadsheetOptions.ForRenderingByPageBreaks()

Microsoft Excel は、用紙サイズやページ設定(向き・余白)に基づいて自動的にページブレークを挿入します。「表示」タブの「ページ ブレーク プレビュー」モードに切り替えると、青い線でワークシート全体が矩形チャンクに分割され、各チャンクが「Page 1」「Page 2」… とラベル付けされます。Excel が「提案」するページ分割方法です。

このメソッドを使用すると、GroupDocs.Viewer は Excel と同様にページブレークに従ってワークシートを分割します。

このオプション(ページブレークで分割)は、BaseViewOptions.SpreadsheetOptions プロパティのデフォルト設定です。したがって、ビューオプションのインスタンスを作成すると自動的に ForRenderingByPageBreaks() が選択されます。

印刷領域のみをレンダリング

SpreadsheetOptions.ForRenderingPrintArea()

Excel には「印刷領域」概念があります。印刷領域は、印刷対象として指定された 1 つ以上のセル範囲で、印刷領域外のコンテンツは全く印刷されません。印刷領域を設定するには「ページレイアウト」タブで「印刷領域」→「印刷領域の設定」を選択します。別の範囲を追加したい場合は、対象範囲を選択した上で「印刷領域」→「印刷領域に追加」をクリックします。「ページ ブレーク プレビュー」モードでは、印刷領域に含まれるすべてのセル範囲が表示されます。

Render only print area

印刷領域をレンダリングし、ページブレークで分割

SpreadsheetOptions.ForRenderingPrintAreaAndPageBreaks()

GroupDocs.Viewer のユニークな機能として、印刷領域とページブレークを同時に適用できるモードがあります。このモードでは、印刷領域のセル範囲とページブレークの両方を考慮してワークシートをページに分割します。

以下のスクリーンショットでは、赤線が印刷領域、青線がページブレークを示しています。

Render print area and split by page breaks

行・列単位で手動分割

SpreadsheetOptions.ForSplitSheetIntoPages(int countRowsPerPage)
SpreadsheetOptions.ForSplitSheetIntoPages(int countRowsPerPage, int countColumnsPerPage)

上記の分割方法がすべて不適切、または CSV のようにページブレークや印刷領域をサポートしない形式の場合、GroupDocs.Viewer では手動で「1 ページあたりの行数」および「列数」を指定できます。以下のスクリーンショットは、行だけで分割する場合と、行と列の両方で分割する場合の違いを示しています。

sForSplitSheetIntoPages の第 1 オーバーロード(引数 1 個)を使用すると、行だけで分割が有効になります。第 2 オーバーロード(引数 2 個)を使用すると、行と列の両方で分割が有効になります。

Split worksheet into pages manually by rows and columns

追加オプションの調整

上記だけでもスプレッドシートのレンダリングは可能ですが、さらに細かく結果を調整できるオプションが多数用意されています。これらのオプションは主に SpreadsheetOptions クラスのプロパティとして提供されますが、一部はすべてのビューオプションで共通の抽象クラス ViewOptions にあります。

行・列ヘッダーをレンダリング

MS Excel や類似の表処理プログラムでは、列は文字(A、B、C、AA、AB…)で、行は数字(1、2、3…)でヘッダーが表示されます。GroupDocs.Viewer はデフォルトでこれらのヘッダーを表示しません(インターフェイス要素であり、ドキュメント自体の一部ではないため)。しかし、RenderHeadings プロパティ(bool 型)を true に設定すると、出力ドキュメントに行・列ヘッダーが含まれます。

Render row and column headings

ワークシートのグリッドラインをレンダリング

このオプションも前項と似ています。デフォルトではセル間のグリッドラインは表示されませんが、RenderGridLines(bool 型)を true に設定すると、MS Excel のようにグリッドラインが出力に含まれます。

Render worksheet gridlines

セルテキストのオーバーフロー制御

テキストがセルの境界を超えてはみ出すケースはよくあります。この問題を解決するために、SpreadsheetOptions.TextOverflowMode プロパティが用意されています。TextOverflowMode は同名の列挙型で、4 つのオプションがあります。

OverlayIfNextIsEmpty

デフォルトは OverlayIfNextIsEmpty で、隣接セルが空の場合にのみテキストがはみ出します。隣接セルがデータを持つ場合、はみ出したテキストは切り捨てられます。

OverlayIfNextIsEmpty enum value

上図は OverlayIfNextIsEmpty 設定でレンダリングされた HTML を示しています。セル B2 のテキストは長く、隣接セル C2 が空でないため切り捨てられています。一方、セル C3 のテキストは D2E2 が空なのではみ出しています。

Overlay

Overlay はより積極的で、隣接セルが空であっても常にはみ出します。隣接セルにデータがあれば上書きされます。

Overlay enum value

上図では、セル B2 の長いテキストが C2D2E2F2 にまではみ出し、元々 C2F2 にあったテキストは消されています。

HideText

HideTextOverlay の反対で、はみ出すテキストはすべて切り捨てられます。隣接セルに空きがあっても影響しません。

HideText enum value

上図のセル C3 は、隣接セル D3 以降に空きがあるにもかかわらず、テキストが切り捨てられています。

AutoFitColumn

AutoFitColumn は列幅を自動で拡張し、テキスト全体が収まるようにします。テキストが長くても、該当列の幅が広がります。

AutoFitColumn enum value

上図はこのモードの動作例です。ただし、テキストが極端に長い場合はページが非常に横長になり、横スクロールが煩わしくなることがあります。

非表示の行・列をレンダリング

Excel などの表処理ソフトでは、特定の行や列を非表示にできます。デフォルトでは GroupDocs.Viewer は非表示行・列を描画しませんが、ViewOptions.SpreadsheetOptions.RenderHiddenRowsViewOptions.SpreadsheetOptions.RenderHiddenColumnstrue に設定すると、HTML、PDF、PNG、JPEG のいずれの形式でも非表示行・列が出力に含まれます。

非表示のワークシートをレンダリング

行・列と同様に、スプレッドシート ファイルは非表示のワークシートを含むことがあります。デフォルトでは非表示ワークシートは描画されませんが、RenderHiddenPages プロパティを true に設定すると表示されます。RenderHiddenPagesSpreadsheetOptions ではなく、すべてのビューオプションで共通の抽象クラス BaseViewOptions にあります。

空の行・列をスキップ

スプレッドシートが「疎」な場合、空白の行や列が多数存在し、出力サイズが大きくなることがあります。GroupDocs.Viewer では空の行・列を除外できる機能があります。SpreadsheetOptions.SkipEmptyRowsSpreadsheetOptions.SkipEmptyColumns(どちらも bool 型)を true に設定すると、HTML、PDF、PNG、JPEG の出力から空行・空列が除外されます。

Skip empty rows and columns

上図は SkipEmptyRowsSkipEmptyColumns が有効になっている様子です。

セルコメントの表示/非表示

スプレッドシートのセルにはコメントが付けられることがあります。デフォルトではすべてのコメントがレンダリングされますが、BaseViewOptions.RemoveCommentstrue に設定するとコメントが除外されます。このプロパティは SpreadsheetOptions ではなく、BaseViewOptions にあります。

Render or hide cell comments

上図はデフォルト設定で XLSX のセルコメントを PNG にレンダリングした結果で、セル E2 のコメントが PNG に含まれています。

PDF ページのワークシート余白設定

ワークシートを PDF にレンダリングする際、ページ余白(ページ端からコンテンツまでの距離)をセンチメートル単位で制御できます。上・右・下・左の余白を設定するプロパティは次のとおりです。

デフォルトではこれら 4 つのプロパティは負の値で、GroupDocs.Viewer がデフォルト余白を適用します。必要に応じて明示的に正の値を設定できます。余白は PDF 出力時にのみ適用されます。

以下のコードは PdfViewOptions を作成し、4 つの余白を設定してドキュメントをレンダリングする例です。

using GroupDocs.Viewer;
using GroupDocs.Viewer.Options;
// ...

PdfViewOptions pdfViewOptions = new PdfViewOptions("Output.pdf");
pdfViewOptions.SpreadsheetOptions = SpreadsheetOptions.ForOnePagePerSheet();
pdfViewOptions.SpreadsheetOptions.TopMargin = 2;
pdfViewOptions.SpreadsheetOptions.BottomMargin = 4;
pdfViewOptions.SpreadsheetOptions.LeftMargin = 8;
pdfViewOptions.SpreadsheetOptions.RightMargin = 0;

using (var viewer = new Viewer("spreadsheet.xlsx"))
{
    viewer.View(pdfViewOptions);
}

結果は以下の画像の通りです。

Set worksheet margins in the output PDF pages

結論

スプレッドシート形式は非常に複雑で、ドキュメントの内容やサイズは多種多様です。デフォルト設定だけで複雑なスプレッドシートを目的の形式にレンダリングできないケースが多く、そのため GroupDocs.Viewer は豊富なプロパティ群を提供しています。これらを活用すれば、ユーザーは自分の要件に合わせてレンダリング結果を細かく調整できます。

参考

無料トライアルを入手

GroupDocs.Viewer for .NET の無料トライアル版は releases.groupdocs.com からダウンロードできます。また、こちら から一時ライセンスを取得すれば、機能制限なしで全機能を試すことができます。