スポンサーリンク

【SwiftUI】SwiftUIでエクセルファイルを生成・保存する

SwiftUI

SwiftUIでエクセルを生成する方法について日本語の記事がほとんどなかったため、備忘録として残します。

スポンサーリンク

xlsxwriterをインストール

xlsxwriter.swiftというライブラリを利用します。
このライブラリは、元々C言語で書かれたlibxlsxwriterというライブラリをSwiftUI用にラップしたものです。
詳しくはGithubを参照してください。

さて、このライブラリを利用するにはSwiftPackageManager(SPM)もしくはCocoaPodsでインストールできますが、CocoaPodsでインストールしようと試みたもののエラーが解決できず、SPMを利用する前提で話を進めます。

上記のように、ProjectのPackageDependenciesで+を押して、
https://github.com/damuellen/xlsxwriter.swift
を入力し、Dependency RuleをBranchで選択してSPMと入力します。

これでインストールできない場合は、

brew install libxlsxwriter

をMacにインストールしておく必要があるかもしれません。私はCocoaPodsでインストールを試みようとした際に事前に上記をインストールした状態でSPMを実行しました。
homebrewを利用していますので、homebrewがない場合はまずhomebrewからインストールしてください。

利用方法

アプリ内でエクセルファイルを生成して値を書き込む

import xlsxwriter

struct ExcelDownloadView: View {
    // ファイル生成中にグルグルを表示させるためのフラグ
    @State var isShowProgress = false
    // 仮データ
    @State var members = ["田中くん", "佐藤くん", "南さん"]
    
    

    var body: some View {
      ...
    }

    func createExcelSheet() {
        // グルグルを表示させる
        isShowProgress = true
        
        DispatchQueue.global(qos: .background).async { [self] in
            // ここでファイル名とパスを指定
            let filePath = FileManager.default.temporaryDirectory.appendingPathComponent("sample.xlsx").path
            // 指定したパスにワークブック作成
            let workbook = xlsxwriter.Workbook(name: filePath)
            
            defer {
                workbook.close()
                // 共有シートを表示
                DispatchQueue.main.async {
                    // シート作成完了後にグルグルを消す
                    isShowProgress = false
                    // 共有シートを開く関数(別途実装必要)
                    shareFile(at: filePath)
                }
            }

            // エクセルファイルにシートを追加
            for member in members {
                // シートを追加
           let sheet = workbook.addWorksheet(name: member)
                // 列幅を設定 A列を大きくしています。
                sheet.column(Cols(stringLiteral: "A"), width: 12.5)

                // 名前を記載 sheet.writeでセルに値を記載します。セルの指定は[行,列]で指定できます。
                sheet.write(.string(member.name ?? ""), [0,0])
                sheet.write(.string("男"), [0,1])
                sheet.write(.string("身長"), [1,0])
                sheet.write(.string("170cm"), [1,1])
            }
        }
    }

    // ファイル共有シートを開く
    func shareFile(at filePath: String) {
        let fileURL = URL(fileURLWithPath: filePath)
        let activityVC = UIActivityViewController(activityItems: [fileURL], applicationActivities: nil)
        
        if let scene = UIApplication.shared.connectedScenes.first as? UIWindowScene,
           let window = scene.windows.first {
            window.rootViewController?.present(activityVC, animated: true, completion: nil)
        } else {
            print("ウィンドウが見つかりませんでした。")
        }
    }
}

上記は、structの中にエクセルファイルを作成して共有シートを開き共有する関数を入れています。
一時ディレクトリに生成しているので、アプリを閉じると生成したファイルは消えてしまいます。アプリ内に保持しておきたい場合はアプリ内やデバイス内のディレクトリに保存するように書き換えてみてください。

機能一覧

上記の例では、セルの幅の指定と文字列の記載の機能を実装していますが、他にも様々な機能があります。

フォーマットを付けて入力

let format = workbook.addFormat()
format.bold() // 太字
format.italic() // 斜体
format.fontColor(.red) // 文字色を赤に変更
format.align(.center) // セルの中央揃え

worksheet.write(.string("フォーマット付きテキスト"), [0, 0], format: format)

数式の追加

worksheet.write(.formula("=SUM(A1:A2)"), [2, 0]) // A3セルにSUM(A1:A2)を記載
worksheet.write(.formula("シート2"!A1), [0, 2]) // シート2のA1の値をC1に記載

文字列ではない形式で入力

worksheet.write(.number(Double(222)), [1, 0]) // 数字として入力

.numberの他に、.datetimeや.booleanなど様々な形式を選択可能です。

他にも円やグラフや条件付き書式なども、元になっているlibxlsxwriterには存在するため、恐らく実装可能かと思います。その辺は未確認なので、他の資料等を参考にしてみてください。

コメント

タイトルとURLをコピーしました