「pptxjenjs」と書かれているのを見かけたら、だいたいは PptxGenJS(npmのパッケージ名は pptxgenjs)のことだと思って大丈夫です。JavaScriptでPowerPoint(.pptx)を“自動で組み立てて”出力できる、わりと珍しいタイプのライブラリです。(GitHub)

PowerPointを開いてコピペして整えて……という作業、正直しんどいですよね。とくに、毎週・毎月、同じ形で数字だけ差し替える資料は、いちばん機械に任せたい。PptxGenJSは、そこをまっすぐ狙ってきます。Node.jsでもブラウザでも動き、出力はOfficeの標準形式(OOXML)なので、PowerPointやKeynote、LibreOfficeなどで開けます(Google Slidesはインポート経由)。(GitHub)

ちなみに現時点の最新リリースは v4.0.1(2025年6月26日)です。バージョン差で挙動が変わることもあるので、チームで使うなら「どのバージョン前提か」を最初に揃えておくと後が楽です。(GitHub)

PptxGenJSでできること(ざっくり)

できることはシンプルです。コードで「スライドを追加して、そこにテキスト・図形・画像・表・グラフなどのオブジェクトを配置していく」。それを最後に .pptx として書き出します。テキスト、表、図形、画像、チャート、メディアまで一通り揃っています。(GitHub)

もうひとつ便利なのが“型”です。会社のロゴ位置やフッター、ページ番号などを「マスター(Slide Master)」として定義し、以降のスライドに同じ骨格を適用できます。要するに、デザインのルールをコードに閉じ込められる。(gitbrent.github.io)

どんな場面で刺さるか

人間が作る価値が高いのは、構成を考えることや、言葉を選ぶことです。逆に、決まった型に数字を流し込む作業は、人間がやるほどミスが増えます。

PptxGenJSが得意なのは、たとえばこんな場面です。

  • 月次・週次のレポート(KPIの表、推移グラフ、コメント欄)
  • 顧客別の提案書を大量に作る(表紙だけ差し替え、あとは同じ構造)
  • ダッシュボードの“配布用スナップショット”をpptxで出したい
  • フロントエンドで「エクスポート(PPTX)」ボタンを作りたい

ブラウザから直接 .pptx をダウンロードさせることもできます。ここは地味に強い。(gitbrent.github.io)

まずは動かす:インストールと最初の1枚

Node.jsなら npm install pptxgenjs(または yarn add pptxgenjs)で入ります。ブラウザで素の <script> で使う場合は、bundle版を読み込むと依存(JSZip)込みで扱えます。(gitbrent.github.io)

Node環境の注意点として、公式ドキュメントではNode.js 18以上が案内されています。CIやサーバーのバージョンが古いと、思わぬところで詰まります。(gitbrent.github.io)

最小コードはこんな感じです(TypeScriptでもJavaScriptでもほぼ同じです)。

import pptxgen from 'pptxgenjs';

async function main() {
  // 1) プレゼンを作る
  const pptx = new pptxgen();

  // 2) スライドを足す
  const slide = pptx.addSlide();

  // 3) オブジェクトを置く(ここではテキスト)
  slide.addText('こんにちは、PptxGenJS', {
    x: 0.8,
    y: 0.8,
    w: 8.5,
    h: 0.6,
    fontSize: 28,
    color: '363636',
  });

  // 4) 書き出す
  await pptx.writeFile({ fileName: 'hello.pptx' });
}

main().catch(console.error);

流れは公式の「4ステップ」と同じで、やっていることも素直です。(gitbrent.github.io)

いちばん大事な話:座標の単位は「インチ」

PptxGenJSを使ううえで、最初に体に入れておきたいのが座標系です。x, y, w, h は基本的に「インチ」で指定します(数値の場合)。加えて、'50%' のようにパーセント指定もできます。(gitbrent.github.io)

ここを理解すると、配置が急に安定します。逆にここがふわっとしていると、「環境によってズレる」「ちょっと直すたびに全体が崩れる」が起きます。

合わせて、スライドのサイズ(レイアウト)も最初に決めるのがコツです。標準レイアウトには LAYOUT_16x9(10 x 5.625 inches)などがあり、必要なら defineLayout() で独自サイズも定義できます。(gitbrent.github.io)

“会社っぽさ”を出す:マスターをコードで持つ

資料がダサく見える最大の理由は、たいてい「毎回ちょっとずつ違う」からです。ロゴの位置、帯の高さ、タイトルの余白。これが揃うだけで、見た目は一段上がります。

PptxGenJSは defineSlideMaster() でマスターを定義できます。定義したマスターは addSlide({ masterName: '...' }) で使います。(gitbrent.github.io)

import pptxgen from 'pptxgenjs';

const pptx = new pptxgen();
pptx.layout = 'LAYOUT_16x9';

pptx.defineSlideMaster({
  title: 'MASTER',
  background: { color: 'FFFFFF' },
  objects: [
    // 上部に帯
    { rect: { x: 0, y: 0, w: '100%', h: 0.55, fill: { color: '0B1F3A' } } },
    // 左上タイトル(固定)
    {
      text: {
        text: '月次レポート',
        options: {
          x: 0.6,
          y: 0.12,
          w: 8,
          h: 0.3,
          color: 'FFFFFF',
          fontSize: 16,
        },
      },
    },
  ],
  slideNumber: { x: '92%', y: '93%', color: '666666' },
});

const slide = pptx.addSlide({ masterName: 'MASTER' });
slide.addText('今月のサマリー', {
  x: 0.6,
  y: 0.9,
  fontSize: 28,
  color: '111111',
});

プレースホルダーも用意できるので、「ここに画像を入れる」「ここにタイトルを流し込む」を名前で扱えるようになります。テンプレート運用がぐっとラクになります。(gitbrent.github.io)

表とグラフ:レポートっぽさの芯

グラフは addChart()、表は addTable() です。チャート種類は pptx.ChartType から選びます。(gitbrent.github.io)

const slide = pptx.addSlide({ masterName: 'MASTER' });

const data = [
  {
    name: 'Actual',
    labels: ['Jan', 'Feb', 'Mar', 'Apr'],
    values: [1500, 4600, 5156, 3167],
  },
  {
    name: 'Projected',
    labels: ['Jan', 'Feb', 'Mar', 'Apr'],
    values: [1000, 2600, 3456, 4567],
  },
];

slide.addChart(pptx.ChartType.line, data, { x: 0.8, y: 1.6, w: 8.6, h: 3.2 });

表は地味ですが強いです。PptxGenJSの表は、行がスライドからはみ出たら自動で次スライドへ送る「auto-paging」も用意されています。行数が増減するレポート系に、これが効きます。(gitbrent.github.io)

HTMLの表を“そのまま”スライドにする裏技

Webアプリ側に既に <table> があるなら、tableToSlides() が刺さることがあります。HTMLのテーブルを1行でスライドに起こし、必要なら自動で複数枚に分割します。CSSはセルレベルまで反映されます(ただし万能ではなく、ネストしたテーブルなどは制約があります)。(gitbrent.github.io)

const pptx = new pptxgen();
pptx.tableToSlides('tableElementId');
pptx.writeFile({ fileName: 'export.pptx' });

「見た目はアプリで作り込んでいる。配布だけpptxが欲しい」みたいなときに、上手くハマると気持ちいいやつです。(gitbrent.github.io)

書き出し:ブラウザとNodeで“同じメソッド、違う挙動”

writeFile() は共通の入口ですが、ブラウザではダウンロードが走り、Nodeではファイルとして保存されます。いずれもPromiseを返します。さらに outputType を指定してbase64 / Blob / Bufferなどで受け取ることもできます。圧縮(zip compression)を有効にするオプションもあります。(gitbrent.github.io)

このあたりは「どこで生成して、どこで配るか」を決めたうえで設計すると迷いません。サーバーで生成してS3に置くのか、ブラウザで生成してその場で落とすのか。どっちも選べます。(gitbrent.github.io)

つまずきやすいポイント(先回りメモ)

最後に、地味に効く話をいくつか。

まず、フォントです。pptxは「フォント名」を指定しても、最終的に描画するのは閲覧側の環境です。相手のPCにないフォントは置き換わります。会社で標準フォントが決まっているなら、マスターやテーマで揃えるのが無難です(デフォルトフォントの設定も用意されています)。(gitbrent.github.io)

次に、メディアです。動画・音声は入れられますが、再生互換は環境依存になりがちです。オンライン動画(YouTube埋め込み)はMicrosoft 365でのサポート、といった前提もあります。デッキを配る相手の再生環境が読めないなら、動画は「サムネ+リンク」に逃がすのが安全です。(gitbrent.github.io)

そして、座標の設計です。インチ指定は強力ですが、行き当たりばったりで数字を置くと、後から修正するたびに破綻します。マスターで余白・帯・フッターを固定し、本文領域だけを「ここに収める」と決める。PptxGenJSは、そういう作り方が似合います。(gitbrent.github.io)