Работа с 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) Также в библиотеке
resty для Go: полное руководство с примерами
Парсинг HTML в TypeScript: библиотеки, инструменты и примеры кода
Валидация данных в C++: библиотеки и методы (libvalidate, nlohmann/json, Boost)