Работа с 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 сохранён: \(