SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

高機能JavaScriptスプレッドシート部品「SpreadJS」の活用(AD)

Excelの資産を無駄にしない──SpreadJS「レポートシート」で実現するWeb帳票とPDF出力

  • X ポスト
  • このエントリーをはてなブックマークに追加

 メシウス株式会社が提供するJavaScriptライブラリ「SpreadJS」は、Webブラウザ上でExcelライクなスプレッドシートを構築・操作できる高機能なUIコンポーネントです。従来のスプレッドシート機能に加え、「SpreadJS V17.1J」では新たに「レポートシート」機能が追加され、従来Excelで作成していた帳票類をWeb上で再現・出力するための強力な仕組みが整いました。本記事では、このレポートシート機能を活用し、Excel帳票のWeb化とPDF出力をどのように実現できるのかを解説します。テンプレートベースの帳票作成やデータバインドといったポイントを押さえつつ、HTML+JavaScriptで構築する具体的な実装手順を見ていきましょう。

  • X ポスト
  • このエントリーをはてなブックマークに追加

対象読者

  • Excelベースの帳票をそのままWebに移行したいと考えている方
  • フロントエンドのHTML+PureJSで帳票レイアウトを実装したい方
  • バックエンドと連携して動的に帳票を表示・印刷したい方

必要な環境

 本記事では、次の環境でSpreadJSのレポートシート機能を動作確認しています。

  • Windows 11 64bit版
  • SpreadJS 18.1.4
  • Node.js 22.15.0 64bit版
  • Google Chrome 136.0.7103.93 64bit版
  • Visual Studio Code 1.99.3

 サンプルコードは、公式の技術記事をもとに構築しています。手元の環境で再現する際には、下記記事からコードをコピーしてご活用ください。

 SpreadJSは、公式サイトからトライアル版をダウンロードして利用できます。

 また、今回の実装では簡易的なAPIサーバとして、json-server(バージョン 1.0.0-beta.3)を使用します。設定方法などの詳細は、メシウス株式会社が公開している技術記事に記載されているため、あわせてご確認ください。

SpreadJSで帳票をWeb表示する方法

 ここからは、SpreadJSのレポートシート機能を使ってExcelライクな帳票テンプレートを作成し、Web上に表示するまでの流れを解説します。

1. データとサーバを準備

 まずは、帳票にバインドする元データをJSON形式で用意します。今回は、次のような10件の社員情報を含む社員一覧表(employees.json)を作成します。

employees.json
{
    "employees": [
      { "id": "E001", "name": "田中 太郎", "department": "営業部", "position": "主任", 
"hireDate": "2018-04-01" },
      { "id": "E002", "name": "鈴木 花子", "department": "総務部", "position": "係長", "hireDate": "2016-09-15" },
      { "id": "E003", "name": "佐藤 健",   "department": "技術部", "position": "エンジニア", "hireDate": "2020-01-10" },
      { "id": "E004", "name": "山本 美咲", "department": "経理部", "position": "主任", "hireDate": "2019-07-20" },
      { "id": "E005", "name": "中村 翔",   "department": "営業部", "position": "マネージャー", "hireDate": "2015-03-01" },
      { "id": "E006", "name": "小林 杏奈", "department": "人事部", "position": "スタッフ", "hireDate": "2021-11-11" },
      { "id": "E007", "name": "伊藤 健介", "department": "技術部", "position": "エンジニア", "hireDate": "2022-02-28" },
      { "id": "E008", "name": "斉藤 結衣", "department": "広報部", "position": "主任", "hireDate": "2017-06-12" },
      { "id": "E009", "name": "高橋 陽介", "department": "経理部", "position": "課長", "hireDate": "2014-01-05" },
      { "id": "E010", "name": "森田 未来", "department": "営業部", "position": "スタッフ", "hireDate": "2023-04-17" }
}

 続いて、JSONデータをAPIとして利用するために、json-serverを使って簡易APIサーバを起動します。次のコマンドを実行してください。

json-server employees.json -p 3000
図1:json-server起動画面
図1:json-server起動画面

 ブラウザで「http://localhost:3000/employees」にアクセスし、JSONデータが正しく表示されれば準備完了です。

2. SpreadJSデザイナで帳票テンプレートを作成

 製品に付属しているSpreadJSデザイナ(デスクトップアプリ)を起動し、帳票のレイアウトを作成します。初期状態では通常のスプレッドシートになっているため、まずは「挿入」メニューから「レポートシート」を選択し、新しくレポートシートを追加しましょう。シート名が「Report1」になれば、レポートシートを追加できています。

図2:レポートシートに切り替え
図2:レポートシートに切り替え

 続いて、左メニューの「データソース」から「テーブルの追加」を選択し、次のように設定します。

  • テーブル名:employees
  • 読み込み方法:GET(そのまま)
  • URL:http://localhost:3000/employees

 設定は自動保存されるため、特別な操作は不要です。

図3:データソース テーブル追加設定画面
図3:データソース テーブル追加設定画面

 次に、レポートシートへ戻り、データのキーを任意のセルにドラッグ&ドロップで配置します。今回のような一覧表形式の場合、すべてのセル型は右ペインから「リスト(テーブル)」に設定してください。

図4:一覧表示したい項目のセル型は「リスト」に設定
図4:一覧表示したい項目のセル型は「リスト」に設定

 ヘッダー行には「社員ID」「氏名」「部署」「役職」「入社日」などの項目名を記入します。フォントサイズや罫線などのスタイルは、Excelと同様の操作感で編集可能です。

3. プレビューで帳票を確認して保存

 「デザイン」メニュー内の「プレビュー」ボタンをクリックすると、データが展開された状態で帳票の完成イメージを確認できます。

図5:SpreadJS Designerのプレビュー画面
図5:SpreadJSデザイナのプレビュー画面

 プレビューで問題がなければ、ファイルを「.sjs形式」で保存します。このファイルは、Webアプリ側でテンプレートとして読み込むために使用します。

4. Webで表示準備

 作成した帳票テンプレートをWebページ上で表示するための準備をしていきます。

 プロジェクト構成を次のように配置します。その他の詳細なファイル構成は、技術記事を参考にしてください。

図6:SpreadJSプロジェクト構成例(テンプレート、スクリプト、スタイル定義)
図6:SpreadJSプロジェクト構成例(テンプレート、スクリプト、スタイル定義)

 帳票テンプレートを読み込んでレポートシートを実行しているのは、「script/app.js」内の次の箇所です。

script/app.js
const res = fetch('reports/employees.sjs').then((response) => response.blob())
    .then((myBlob) => {
        spread.open(myBlob, () => {
            console.log(`読み込み成功`);
            reportSheet = spread.getSheetTab(0);

            // レポートシートのオプション設定
            reportSheet.renderMode('Preview');
            reportSheet.options.printAllPages = true;

            // レポートシートの印刷設定
            var printInfo = reportSheet.printInfo();
            printInfo.showBorder(false);
            printInfo.zoomFactor(1);
            reportSheet.printInfo(printInfo);
        }, (e) => {
            console.log(`***ERR*** エラーコード(${e.errorCode}) : ${e.errorMessage}`);
        });
    });

 ここでは、「.sjs」形式で設計された帳票テンプレートがWebアプリケーション上に展開されています。これにより、ユーザーがブラウザ上で帳票を閲覧できる状態になります。

5. Webページで帳票を表示

 index.html を右クリックして「Open with Live Server」を選択すると、ブラウザ上で帳票が表示されます。JSONデータがテンプレートにバインドされ、一覧表として表示されていれば成功です。

図7:Webページで表示確認
図7:Webページで表示確認

 このように、SpreadJSとレポートシート機能を活用すれば、ノーコードで帳票テンプレートを設計し、JavaScriptのみでWeb帳票を構築することができます。

レポートシートを利用するメリット

 SpreadJSのレポートシートは、帳票をWeb上に表示するだけでなく、既存のExcel資産を活用しながら帳票業務を効率化・自動化できる強力な機能です。

 主なメリットは次のとおりです。

  1. Excel帳票をテンプレート化してそのまま再利用できる
  2. ノーコードで直感的に帳票を設計・編集できる
  3. データバインドによりWeb上で動的に帳票を表示できる
  4. 帳票システムの開発・保守の工数を大幅に削減できる
  5. そのままPDF出力や印刷もできる

 このように、SpreadJSのレポートシートは、Excel資産の活用・開発工数の削減・紙とWebのハイブリッド運用といった観点から、実務での帳票開発を力強くサポートします。

既存のExcel帳票をWebに移行する方法

 SpreadJSの「レポートシート」機能を活用すれば、既存のExcel帳票をそのままテンプレートとして読み込み、Webアプリ上で再利用することが可能です。

 ここでは、無料でダウンロードした請求書テンプレートを例に、帳票テンプレートのインポートからWeb上での表示までの手順をご紹介します。

図8:サンプルの帳票テンプレート(出典:ビジネステンプレート)
図8:サンプルの帳票テンプレート(出典:ビジネステンプレート

1. Excelファイルをインポート

 レポートシートを開いた状態で、上部メニューから「デザイン」→「テンプレートをインポート」を選択し、インポート対象となるExcelファイルを読み込みます。

 インポート後、SpreadJSデザイナ上に元のExcel帳票と同じレイアウトが表示されれば、取り込みは成功です。

図9:Excel帳票をインポートしたSpreadJS Designerの画面
図9:Excel帳票をインポートしたSpreadJSデザイナの画面

 元のExcelファイルに含まれる数式や関数も、SpreadJSのレポートシート上でそのまま利用可能です。明細行の2行目以降(計算式やサンプルデータを含む部分)は、テンプレートとして利用する際に不要なため、削除しておきましょう。

2. データソースの定義とバインド

 帳票に差し込むデータは、あらかじめJSON形式で用意します。今回は請求明細データを10件含む「invoices.json」を作成し、json-serverを使ってローカルAPIとして提供できるようにします。

invoices.json
{
  "invoices": [
    {
      "ID": 1,
      "CustomerID": 1,
      "CustomerName": "ABC株式会社",
      "InvoiceNo": "1001",
      "InvoiceDate": "2024/04/30",
      "Subject": "ライティング案件(メディアA)",
      "Description": "コラム記事執筆(SEO対応)",
      "Quantity": 1,
      "Unit": "式",
      "UnitPrice": 8882
    },
    {
      "ID": 2,
      "CustomerID": 1,
      "CustomerName": "ABC株式会社",
      "InvoiceNo": "1001",
      "InvoiceDate": "2024/04/30",
      "Subject": "ライティング案件(メディアA)",
      "Description": "軽微なWebデザイン調整",
      "Quantity": 3,
      "Unit": "本",
      "UnitPrice": 18657
    },
    {
      "ID": 3,
      "CustomerID": 1,
      "CustomerName": "ABC株式会社",
      "InvoiceNo": "1001",
      "InvoiceDate": "2024/04/30",
      "Subject": "ライティング案件(メディアA)",
      "Description": "サービス紹介ページのテキスト作成",
      "Quantity": 2,
      "Unit": "件",
      "UnitPrice": 18424
    },
    {
      "ID": 4,
      "CustomerID": 1,
      "CustomerName": "ABC株式会社",
      "InvoiceNo": "1001",
      "InvoiceDate": "2024/04/30",
      "Subject": "ライティング案件(メディアA)",
      "Description": "バナー文言提案",
      "Quantity": 3,
      "Unit": "件",
      "UnitPrice": 18988
    },
    {
      "ID": 5,
      "CustomerID": 1,
      "CustomerName": "ABC株式会社",
      "InvoiceNo": "1001",
      "InvoiceDate": "2024/04/30",
      "Subject": "ライティング案件(メディアA)",
      "Description": "LP原稿作成(構成案込み)",
      "Quantity": 2,
      "Unit": "本",
      "UnitPrice": 14717
    },
    {
      "ID": 6,
      "CustomerID": 2,
      "CustomerName": "テックワークス合同会社",
      "InvoiceNo": "1002",
      "InvoiceDate": "2024/05/10",
      "Subject": "Webコンテンツ制作案件",
      "Description": "軽微なWebデザイン調整",
      "Quantity": 1,
      "Unit": "本",
      "UnitPrice": 12020
    },
    {
      "ID": 7,
      "CustomerID": 2,
      "CustomerName": "テックワークス合同会社",
      "InvoiceNo": "1002",
      "InvoiceDate": "2024/05/10",
      "Subject": "Webコンテンツ制作案件",
      "Description": "コラム記事執筆(SEO対応)",
      "Quantity": 1,
      "Unit": "本",
      "UnitPrice": 9154
    },
    {
      "ID": 8,
      "CustomerID": 2,
      "CustomerName": "テックワークス合同会社",
      "InvoiceNo": "1002",
      "InvoiceDate": "2024/05/10",
      "Subject": "Webコンテンツ制作案件",
      "Description": "バナー文言提案",
      "Quantity": 1,
      "Unit": "件",
      "UnitPrice": 11616
    },
    {
      "ID": 9,
      "CustomerID": 2,
      "CustomerName": "テックワークス合同会社",
      "InvoiceNo": "1002",
      "InvoiceDate": "2024/05/10",
      "Subject": "Webコンテンツ制作案件",
      "Description": "コラム記事執筆(SEO対応)",
      "Quantity": 1,
      "Unit": "件",
      "UnitPrice": 10135
    },
    {
      "ID": 10,
      "CustomerID": 2,
      "CustomerName": "テックワークス合同会社",
      "InvoiceNo": "1002",
      "InvoiceDate": "2024/05/10",
      "Subject": "Webコンテンツ制作案件",
      "Description": "軽微なWebデザイン調整",
      "Quantity": 2,
      "Unit": "本",
      "UnitPrice": 18132
    }
  ]
}

 次のコマンドでローカルサーバを起動してください。

json-server invoices.json -p 3000

 ブラウザで「http://localhost:3000/invoices」にアクセスし、JSONデータが表示されれば準備完了です。

 次に、SpreadJSデザイナを開き、レポートシートにデータソースを設定します。左側の「データソース」パネルから「テーブルの追加」を選び、以下の情報を入力してください。

  • テーブル名:invoices
  • 取得方法:GET(そのまま)
  • URL:http://localhost:3000/invoices

 設定が完了すると、データ項目をシート上にドラッグ&ドロップできるようになります。明細行にあたる表部分のセルを選択し、右ペインの「セル型」を「リスト」に設定してください。これにより、複数行のデータを繰り返し表示できるようになります。

 さらに、帳票レイアウトが固定行の明細表である場合は、「スピル時に上書きする」にもチェックを入れておきます。これでデータが流し込まれたときにレイアウトが伸長することなく、固定行の明細表を作成することができます。

図10:明細行には「スピル時に上書きする」設定を適用
図10:明細行には「スピル時に上書きする」設定を適用

 各セルには、前半で作成した社員リストと同じ感覚で、データソースのパネルからDescription、Quantity、Unit、UnitPriceのフィールドをドラッグ&ドロップしてデータバインドします。

 最後に、1ページ単位で帳票を出力するため、コンテキスト(キー項目)を設定します。伝票番号を表示するセルを選び、右ペインの「拡張」タブから「コンテキスト」を「ユーザー設定」に変更し、「InvoiceNo」が入力されているセルを指定してください。

図11:コンテキストの設定
図11:コンテキストの設定

 この設定により、請求書番号ごとに1ページとして帳票が生成され、複数の取引先への一括出力にも対応できます。

3. プレビューで確認して保存

 レイアウトとデータバインドが完了したら、「デザイン」メニューの「プレビュー」ボタンで帳票の表示内容を確認します。請求書ごとにページが分かれ、明細やヘッダー、金額の計算式などが正しく表示されていればOKです。

図12:SpreadJS Designerのプレビュー画面
図12:SpreadJSデザイナのプレビュー画面

 問題がなければ、テンプレートを 「.sjs形式」で保存しておきましょう。

4. Webアプリ用ファイルを準備してWebで表示

 作成した帳票テンプレート(.sjsファイル)をWebページ上に表示するには、プロジェクトファイル一式を準備する必要があります。

 具体的な手順やファイル構成については、Page1「4.Webで表示準備」および技術記事を参照してください。また、サンプルが公式のGitHubでも公開されています。ページングや印刷、PDF出力などの実装方法もこちらをご参考ください。

 準備が整ったら、index.html を右クリックして「Open with Live Server」を選択します。帳票テンプレートとJSONデータが正しくバインドされていれば、Webページ上に帳票が表示されます。

図13:SpreadJSで表示された請求書帳票の例
図13:SpreadJSで表示された請求書帳票の例

 複数の請求書データがある場合は、コンテキスト設定に従ってページごとに分割表示されていれば成功です。

Web表示した帳票をPDFで出力する方法

 SpreadJSでは、savePDF() 関数を使ってWeb上に表示された帳票をそのままPDFとして出力できます。ボタンに処理を割り当てれば、クリックひとつでPDFを表示・保存できます。

   pdfButton.onclick = function () {
        spread.savePDF(function (blob) {
            var url = URL.createObjectURL(blob);
            window.open(url);
         })
    }

 日本語のテキストがPDF内で「□□□」や「?」に文字化けする場合は、PDF出力時に日本語フォントを読み込み、PDFFontsManager.registerFont() を使って登録してください。

 ※使用するフォントファイルは TrueType(.ttf)形式がおすすめです。詳細は技術記事を参照してください。

実務に活かせるレポートシートの応用例

 SpreadJSのレポートシートは、帳票をWebで表示するだけでなく、実務のさまざまなシーンで活用できます。

 例えば、次のような用途に対応可能です。

  • 請求書の自動発行:APIで取得したデータをテンプレートにバインド。PDF出力や印刷にも対応可能
  • 受注履歴の表示と管理:顧客ごとの取引履歴をテンプレートに差し込み、一覧や個別帳票として出力
  • 帳票テンプレートの一元管理:「リボンコンテナ」機能でデザイナをWebアプリに組み込み、テンプレート編集や運用をブラウザ上で実現

 このように、帳票業務のWeb化・自動化を進めたい現場にとって、SpreadJSは有力な選択肢となります。

まとめ

 SpreadJSのレポートシートを使えば、ExcelライクなGUIで帳票を設計し、データをバインドするだけでWeb帳票を簡単に構築できます。Excel資産の再利用やPDF出力にも対応しており、開発と実務の両面で高い効果が期待できます。帳票のWeb化や業務自動化を検討している方にとって、有力な選択肢となるでしょう。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加

提供:メシウス株式会社

【AD】本記事の内容は記事掲載開始時点のものです 企画・制作 株式会社翔泳社

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/21789 2025/07/30 12:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング