在 Swift 中处理 Excel:适用于 iOS 和 macOS 的库与工具
在开发 iOS 和 macOS 应用程序时,经常需要导入、导出或处理 Excel 格式(XLSX、CSV)的数据。Apple 平台没有内置对 Excel 格式的支持,因此开发者会使用第三方库。本文将介绍三种流行的工具:CoreXLSX、XLSXWriter 和 SwiftCSV,并提供 Swift 的实际代码示例。
1. CoreXLSX — 读取和写入 XLSX
CoreXLSX 是一个轻量级库,用于读取和创建 XLSX 文件。它基于 Open XML 标准,支持字符串、数字、日期、公式和样式。
安装
// Swift Package Managerdependencies: [ .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 是一个专注于写入性能的库。适用于导出数千行数据,支持样式、单元格合并和图表。
安装
// 通过 CocoaPodspod '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: "数量"