Работа с Excel в Swift: Полное руководство по библиотекам и инструментам для iOS/macOS

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Работа с Excel в Swift (iOS/macOS): Обзор библиотек и примеры кода

Обработка табличных данных — одна из ключевых задач в современных приложениях. На платформах Apple (iOS, macOS, watchOS) встроенной поддержки формата Excel (.xlsx) нет, поэтому разработчики используют сторонние библиотеки. В этой статье мы рассмотрим три основных подхода и библиотеки для работы с Excel в Swift: CoreXLSX, SwiftExcel и XLConnect. Вы узнаете, как читать, создавать и редактировать файлы, а также получите готовые примеры кода.

1. CoreXLSX — чтение и запись .xlsx файлов

CoreXLSX — самая популярная библиотека для работы с Excel в Swift. Она поддерживает чтение и запись файлов формата Office Open XML (OOXML). Библиотека написана на чистом Swift и не требует внешних зависимостей.

Установка через Swift Package Manager

// В Package.swift добавьте:
dependencies: [
    .package(url: "https://github.com/CoreOffice/CoreXLSX.git", from: "0.14.0")
]

Чтение Excel-файла

import CoreXLSX

guard let filePath = Bundle.main.path(forResource: "data", ofType: "xlsx") else {
    print("Файл не найден")
    return
}

let file = try XLSXFile(filepath: filePath)
let sharedStrings = try file?.parseSharedStrings()
let worksheets = try file?.parseWorksheetPaths()

for worksheetPath in worksheets ?? [] {
    let worksheet = try file?.parseWorksheet(at: worksheetPath)
    let rows = worksheet?.data?.rows ?? []
    
    for row in rows {
        for cell in row.cells {
            if let sharedStrings = sharedStrings {
                let reference = cell.reference
                let value = cell.stringValue(sharedStrings) ?? cell.value ?? ""
                print("Ячейка \(reference): \(value)")
            }
        }
    }
}

Создание нового файла

import CoreXLSX

let path = FileManager.default.temporaryDirectory.appendingPathComponent("newFile.xlsx")
let file = XLSXFile(filepath: path.path)

// Создаем рабочий лист
let worksheet = Worksheet(data: DataSheet(rows: [
    Row(cells: [
        Cell(reference: "A1", value: "Имя"),
        Cell(reference: "B1", value: "Возраст")
    ]),
    Row(cells: [
        Cell(reference: "A2", value: "Анна"),
        Cell(reference: "B2", value: "25")
    ])
]))

try file?.write(worksheet: worksheet, at: "xl/worksheets/sheet1.xml")

2. SwiftExcel — легковесная альтернатива

SwiftExcel — минималистичная библиотека для создания Excel-файлов. Она не поддерживает чтение существующих файлов, но отлично подходит для генерации отчетов и экспорта данных.

Установка через CocoaPods

pod 'SwiftExcel'

Пример создания таблицы

import SwiftExcel

let workbook = Workbook()
let sheet = workbook.createSheet(named: "Отчет")

// Заполняем заголовки
sheet.write(value: "Продукт", column: 1, row: 1)
sheet.write(value: "Цена", column: 2, row: 1)
sheet.write(value: "Количество", column: 3, row: 1)

// Данные
sheet.write(value: "Ноутбук", column: 1, row: 2)
sheet.write(value: 1500.00, column: 2, row: 2)
sheet.write(value: 10, column: 3, row: 2)

// Сохраняем
let path = FileManager.default.temporaryDirectory.appendingPathComponent("report.xlsx")
try workbook.save(to: path)
print("Файл сохранен: \(path)")

3. XLConnect — работа с Excel через OpenXML (macOS)

XLConnect — библиотека для macOS, которая использует формат OpenXML напрямую. Она поддерживает сложные операции: объединение ячеек, стили, формулы и диаграммы.

Установка через Carthage

github "SwiftStudies/XLConnect" ~> 2.0

Пример с формулами и стилями

import XLConnect

let workbook = Workbook()
let sheet = try workbook.createSheet("Финансы")

// Стиль для заголовков
let headerStyle = CellStyle()
headerStyle.font = Font(bold: true, size: 14)
headerStyle.fill = Fill(backgroundColor: Color(red: 0.2, green: 0.6, blue: 0.8))

// Заголовки
try sheet.write(cell: Cell("Дата", style: headerStyle), at: .init(row: 1, column: 1))
try sheet.write(cell: Cell("Доход", style: headerStyle), at: .init(row: 1, column: 2))
try sheet.write(cell: Cell("Расход", style: headerStyle), at: .init(row: 1, column: 3))

// Данные с формулой
try sheet.write(value: 10000                    

Рекомендаций