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

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

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

Начать курс

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

При разработке приложений под iOS и macOS часто возникает необходимость импортировать, экспортировать или обрабатывать данные в формате Excel (XLSX, CSV). На платформе Apple нет встроенной поддержки Excel-форматов, поэтому разработчики используют сторонние библиотеки. В этой статье разберём три популярных инструмента: CoreXLSX, XLSXWriter и SwiftCSV, а также приведём практические примеры кода на Swift.

1. CoreXLSX — чтение и запись XLSX

CoreXLSX — легковесная библиотека для чтения и создания XLSX-файлов. Основана на стандарте Open XML, поддерживает строки, числа, даты, формулы и стили.

Установка

// Swift Package Manager
dependencies: [
    .package(url: "https://github.com/CoreOffice/CoreXLSX.git", from: "0.14.0")
]

Пример: чтение данных из Excel

import CoreXLSX

func readExcel(path: String) {
    guard let file = XLSXFile(filepath: path) else {
        print("Ошибка открытия файла")
        return
    }
    
    do {
        for path in try file.parseWorksheetPaths() {
            let worksheet = try file.parseWorksheet(at: path)
            let rows = worksheet.data?.rows ?? []
            for row in rows {
                let values = row.cells.compactMap { $0.value }
                print(values.joined(separator: "\t"))
            }
        }
    } catch {
        print("Ошибка чтения: \(error)")
    }
}

Пример: создание нового XLSX-файла

import CoreXLSX

func createExcel() {
    let header = ["Имя", "Возраст", "Город"]
    let data = [
        ["Анна", "25", "Москва"],
        ["Борис", "30", "Санкт-Петербург"]
    ]
    
    var sharedStrings = SharedStrings()
    let headerRefs = header.map { sharedStrings.append(string: $0) }
    let dataRefs = data.map { row in
        row.map { sharedStrings.append(string: $0) }
    }
    
    let headerRow = Row(cells: headerRefs.enumerated().map { (index, ref) in
        Cell(reference: "\(Character(UnicodeScalar(65 + index)!))1", type: .string, value: ref)
    })
    
    let dataRows = dataRefs.enumerated().map { (rowIndex, row) in
        Row(cells: row.enumerated().map { (colIndex, ref) in
            let colRef = Character(UnicodeScalar(65 + colIndex)!)
            return Cell(reference: "\(colRef)\(rowIndex + 2)", type: .string, value: ref)
        })
    }
    
    let worksheet = Worksheet(data: Data(rows: [headerRow] + dataRows))
    let file = XLSXFile(sharedStrings: sharedStrings, worksheets: [worksheet])
    
    do {
        try file.write(to: URL(fileURLWithPath: "/tmp/example.xlsx"))
        print("Файл сохранён")
    } catch {
        print("Ошибка записи: \(error)")
    }
}

2. XLSXWriter — быстрая запись больших файлов

XLSXWriter — библиотека, ориентированная на производительность при записи. Подходит для экспорта тысяч строк, поддерживает стили, объединение ячеек и диаграммы.

Установка

// Через CocoaPods
pod 'XLSXWriter'

Пример: запись данных с форматированием

import XLSXWriter

func writeFormattedExcel() {
    let workbook = Workbook()
    let sheet = workbook.addSheet(named: "Отчёт")
    
    // Стили
    let headerStyle = CellStyle()
    headerStyle.font = Font(name: "Helvetica", size: 14, bold: true)
    headerStyle.fill = Fill(color: .lightGray)
    
    let dataStyle = CellStyle()
    dataStyle.font = Font(name: "Helvetica", size: 12)
    dataStyle.border = Border(top: .thin, bottom: .thin)
    
    // Заголовки
    sheet.write(row: 0, column: 0, value: "Товар", style: headerStyle)
    sheet.write(row: 0, column: 1, value: "Цена", style: headerStyle)
    sheet.write(row: 0, column: 2, value: "Количество", style: headerStyle)
    
    // Данные
    let products = [
        ("Ноутбук", 120000, 5),
        ("Мышь", 2500, 20)
    ]
    
    for (index, (name, price, qty)) in products.enumerated() {
        let row = index + 1
        sheet.write(row: row, column: 0, value: name, style: dataStyle)
        sheet.write(row: row, column: 1, value: price, style: dataStyle)
        sheet.write(row: row, column: 2, value: qty, style: dataStyle)
    }
    
    // Автоширина столбцов
    sheet.setColumn(0, width: 30)
    sheet.setColumn(1, width: 15)
    sheet.setColumn(2, width: 15)                    

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