nambu.devGitHub ↗

SwiftSheets / Swift ライブラリ

Swiftで
スプレッドシートを
読み書き

XLSX、XLSM、CSV / TSV、ODS、Apple Numbers に対応する Swift ライブラリです。ファイルの読み込み、セルの編集、書式設定、保存を共通の API で実装できます。

sales.xlsx↗
Workbook / Sheet / CellValue
オープンソース / MITSwift 6.2+macOS 14+ / iOS 17+ / Linux外部パッケージ依存なし

用途

データの入出力と帳票更新

ブックを表す Workbook、シートを表す Sheet、セルの値を表す CellValue を使います。形式ごとに読み込みと書き出しを実装する必要がありません。

ファイル出力

Excelレポートの生成

売上や作業記録などのデータを XLSX に書き出せます。見出しの書式や列幅を設定し、アプリにレポート出力機能を追加できます。

ファイル入力・変換

複数形式のデータ取り込み

Excel、CSV、ODS、Numbers のデータを共通のモデルに読み込めます。取り込み後のセル操作を共通化し、別の形式への変換にも使えます。

既存ファイルの編集

帳票の数値と書式の更新

既存ファイルを開いて数値や書式を変更できます。同じ形式でブック全体を保存する XLSX / XLSM では、ライブラリが解釈しない部品を元のバイト列で保持します。

ライブラリの特徴

SwiftらしいAPIと効率的な処理

Swift の型やクロージャーを使って表を操作できます。大きなデータには、メモリを抑えるストリーミング処理と複数シートの並列読み込みを用意しています。

セルの値をそのまま代入

sheet["B2"] = 150_000 のように、文字列や数値を直接代入できます。editSheet のクロージャー内で編集できるので、シートを取り出して戻す手順も省けます。

Workbook と Sheet は値型です。Sendable に対応し、非同期処理へデータを渡せます。

必要な形式だけ組み込める

Swift 製のライブラリで、外部パッケージへの依存がありません。すべての形式を含む SwiftSheets のほか、SheetXLSX や SheetCSV などを選んで組み込めます。

Mac・iPhone・iPad のアプリだけでなく、Linux のサーバー処理でも利用できます。

1行ずつ処理してメモリを節約

StreamingReader と StreamingWriter で、表全体をメモリに保持せず読み書きできます。大量のデータの集計やレポート出力に適しています。

値と書式を扱う方式です。結合セル・注釈・未解釈部品の保持には、ブック全体を読み込む方式を使います。

複数シートを並列に読み込み

条件を満たす XLSX は、複数のシートを並列に解析して読み込み時間を短縮します。ReadOptions.concurrency で並列数を調整し、速度とメモリ使用量のバランスを選べます。

1 を指定するとシートを順番に読み込みます。

100万セルのXLSXで測定した速度とメモリ

処理方式時間最大メモリ使用量
ブック全体の読み込み1.47 秒213.3 MB
ブック全体の書き出し0.93 秒214.8 MB
1行ずつ読み込み1.01 秒13.2 MB
1行ずつ書き出し1.10 秒10.8 MB

同じ100万セルを8シートに分けた読み込みでは、逐次処理が 1.35 秒・139.1 MB、並列処理が 0.65 秒・228.8 MB でした。

測定: 2026年9月13日 / SwiftSheets 1.0.0 / Apple M2・メモリ8 GB / Swift 6.4・リリースビルド。100列 × 10,000行の合成データで、書式や図は含みません。最大メモリ使用量はプロセス全体のピークです。データの内容や実行環境によって結果は変わります。

測定条件と全形式の計測結果 ↗

基本操作

売上データの作成・編集・変換

地域別の売上を Excel の XLSX 形式に保存します。次のサンプルでは保存したファイルを読み込み、セルの更新や LibreOffice などで使う ODS 形式への変換を行います。売上の単位は円です。

Swift / サンプルコード
import Foundation
import SwiftSheets

var book = Workbook()
book.sheets[0].name = "Sales"
book.editSheet(at: 0) { sheet in
    sheet.append(["地域", "売上(円)"])
    sheet.append(["東京", 120_000])
    sheet.append(["大阪", 85_000])
    sheet.setStyle("A1:B1") {
        $0.font.bold = true
        $0.fill = .solid(Color(hex: "EAF1DC"))
    }
    sheet.setStyle("B2:B3") {
        $0.numberFormat = "#,##0"
    }
    sheet.autofitColumns()
}
let result = try book.write(
    to: URL(filePath: "sales.xlsx"))
print(result.warnings)
sales.xlsx出力例
行AB
1地域売上(円)
2東京120,000
3大阪85,000

地域別売上をXLSXに保存

Sales シートに地域と売上を追加し、見出しと数値の書式を設定します。write(to:) の戻り値から保存時の警告を確認できます。

この XLSX をダウンロード ↓

右の表は掲載コードの出力例です。ブラウザ内で Swift は実行しません。ダウンロード用ファイルは掲載コードを実行して生成しています。コードはカレントディレクトリにファイルを読み書きします。

導入

インストール

  1. Xcode の「File → Add Package Dependencies…」で GitHub のリポジトリ URL を追加します。
  2. バージョンは 1.0.0 以降、製品は SwiftSheets を選び、使うターゲットに追加します。
  3. import SwiftSheets を書いて、上のサンプルから始めましょう。

Swift Package Manager を使う場合は、右の内容を既存の Package.swift に組み込みます。App は自分のターゲット名に置き換えてください。

導入ガイドを読む ↗
// Package.swift の該当する配列に追加
dependencies: [
    .package(
        url: "https://github.com/nanbu/SwiftSheets.git",
        from: "1.0.0"
    )
],
targets: [
    .target(name: "App", dependencies: [
        .product(name: "SwiftSheets", package: "SwiftSheets")
    ])
]

ファイル形式

対応形式と保持範囲

形式ごとに保存できる機能が異なります。読み込み時や変換時に扱えない内容は、結果の warnings で確認できます。

形式形式の概要SwiftSheetsでの保存
XLSX
.xlsx
Microsoft Excel の標準的なブック形式です。値・数式・書式・複数のシートを保存できます。読み書きに対応します。同じ形式でブック全体を保存すると、未解釈の部品を保持し、モデル化した内容は意味を保って再生成します。
XLSM
.xlsm
Excel のマクロ言語である VBA のプログラムを保存できるブック形式です。マクロを含む帳票などで使われます。読み書きに対応します。同じ XLSM 形式ならマクロの部品も保持します。ライブラリがマクロを実行することはありません。
CSV / TSV
.csv / .tsv
値をカンマやタブで区切ったテキスト形式です。アプリやシステム間のデータ交換に使われます。書式や複数シートは保存しません。読み書きに対応します。セルの値を保存し、区切り文字や文字コードを指定できます。
ODS
.ods
OpenDocument Spreadsheet の略です。LibreOffice Calc などで標準的に使われる公開規格の表計算形式で、値・数式・書式・複数シートを保存できます。読み書きに対応します。対応する値・数式・書式などを再構築します。元ファイルのすべての部品をそのまま保持する方式ではありません。
Numbers
.numbers
Apple の表計算アプリ Numbers の形式です。1枚のシートに複数の表を配置でき、Mac・iPhone・iPad で使われます。読み書きに対応します。テンプレートからファイルを再生成します。元ファイルから保持できる機能は、詳しい対応表で確認できます。

大きな表には、1行ずつ処理する読み書きも用意しています。ただし、その処理では結合セル・注釈・未解釈部品の保持は対象外です。WebAssembly には実行環境や書き出し方法の制限があります。

ソースコードと資料

GitHubとドキュメント