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

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

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

Начать курс

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

Разработка приложений для iOS и macOS часто требует интеграции с форматом Excel (.xlsx, .xls). Нативные инструменты Apple не предоставляют прямого API для работы с этими файлами, поэтому разработчики используют сторонние библиотеки. В этой статье мы рассмотрим три популярных варианта: CoreXLSX, xlsxwriter и SwiftCSV, а также приведём практические примеры для чтения и записи данных.

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

CoreXLSX — это библиотека с открытым исходным кодом, написанная полностью на Swift. Она основана на внутреннем формате ZIP (так как .xlsx — это ZIP-архив с XML-файлами). Поддерживает чтение, запись и редактирование листов, ячеек, стилей.

Установка: через Swift Package Manager (SPM) добавьте пакет https://github.com/CoreOffice/CoreXLSX.git.

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

import CoreXLSX

func readExcelExample() {
    guard let filePath = Bundle.main.path(forResource: "data", ofType: "xlsx"),
          let data = try? Data(contentsOf: URL(fileURLWithPath: filePath)),
          let file = try? XLSXFile(data: data) else {
        print("Не удалось загрузить файл")
        return
    }
    
    do {
        let sharedStrings = try file.parseSharedStrings()
        let worksheet = try file.parseWorksheet(at: "xl/worksheets/sheet1.xml")
        
        for row in worksheet.data?.rows ?? [] {
            var rowValues: [String] = []
            for cell in row.cells {
                if let stringRef = cell.stringValue(sharedStrings) {
                    rowValues.append(stringRef)
                } else if let value = cell.value {
                    rowValues.append(value)
                } else {
                    rowValues.append("")
                }
            }
            print(rowValues.joined(separator: ", "))
        }
    } catch {
        print("Ошибка парсинга: \(error)")
    }
}

2. xlsxwriter — создание Excel-файлов на Swift

xlsxwriter — это обёртка над библиотекой libxlsxwriter (C-реализация). Позволяет создавать .xlsx файлы с форматированием, формулами, диаграммами. Идеально для генерации отчётов на macOS и iOS.

Установка: через CocoaPods (pod 'xlsxwriter') или SPM.

Пример: создание простого файла

import xlsxwriter

func createExcelExample() {
    let documentDirectory = FileManager.default.temporaryDirectory
    let fileURL = documentDirectory.appendingPathComponent("report.xlsx")
    
    let workbook = Workbook(path: fileURL.path)
    let sheet = workbook.addWorksheet(named: "Отчёт")
    
    // Заголовки
    sheet.writeString("Имя", at: column: 0, row: 0)
    sheet.writeString("Возраст", at: column: 1, row: 0)
    sheet.writeString("Город", at: column: 2, row: 0)
    
    // Данные
    sheet.writeString("Анна", at: column: 0, row: 1)
    sheet.writeNumber(28, at: column: 1, row: 1)
    sheet.writeString("Москва", at: column: 2, row: 1)
    
    sheet.writeString("Иван", at: column: 0, row: 2)
    sheet.writeNumber(35, at: column: 1, row: 2)
    sheet.writeString("Санкт-Петербург", at: column: 2, row: 2)
    
    workbook.close()
    print("Файл создан: \(fileURL)")
}

3. SwiftCSV — работа с CSV (альтернатива Excel)

Если вам не требуется полноценный формат .xlsx, SwiftCSV — лёгкая библиотека для чтения и записи CSV-файлов. CSV легко открывается в Excel и других табличных редакторах.

Установка: через SPM: https://github.com/swiftcsv/SwiftCSV.git.

Пример: чтение и запись CSV

import SwiftCSV

func csvExample() {
    // Чтение
    guard let csvURL = Bundle.main.url(forResource: "data", withExtension: "csv"),
          let csv = try? CSV(url: csvURL) else { return }
    
    for row in csv.rows {
        if let name = row["Name"], let age = row["Age"] {
            print("\(name): \(age)")
        }
    }
    
    // Запись
    let newCSV = try! CSVWriter(stream: .toMemory())
    try! newCSV.write(row: ["Имя", "Возраст", "Город"])
    try! newCSV.write(row: ["Мария", "30", "Казань"])
    try! newCSV.write(row: ["Пётр", "42", "Новосибирск"])
    
    let csvData = newCSV.csv.data(using: .utf8)!
    let fileURL = FileManager.default.temporaryDirectory.appendingPathComponent("export.csv")
    try? csvData.write(to: fileURL)
    print("CSV сохранён: \(                    

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