CoreXLSX is a library focused on representing the low-level structure of XML-based XLSX spreadsheet format. It allows you to open a spreadsheet archive and map its XML structure into model types expressed directly in Swift.
To run the example project, clone the repo, and run pod install from the
Example directory first.
Model types in CoreXLSX directly map internal structure of XLSX format with
more sensible naming applied to a few attributes. The API is pretty simple:
import CoreXLSX
guard let file = XLSXFile(filepath: "./categories.xlsx") else {
fatalError("XLSX file corrupted or does not exist")
}
for path in try file.parseWorksheetPaths() {
let ws = try file.parseWorksheet(at: path)
for row in ws.data?.rows ?? [] {
for c in row.cells {
print(c)
}
}
}This prints every cell from every worksheet in the given XLSX file. Please refer
to the Worksheet
model
for more atttributes you might need to read from a parsed file.
Some cells (usually with strings) have their values shared in a separate model
type, which you can get by evaluating try file.parseSharedString(). You can
refer to the SharedStrings
model
for the full list of its properties.
Here's how you can get all shared strings in column "C" for example:
let sharedStrings = try file.parseSharedStrings()
let columnCStrings = ws.cells(atColumns: [ColumnReference("C")!])
// in format internals "s" stands for "shared",
// if it is used, it means the value is an index of a shared string
.filter { $0.type == "s" }
// get the value of the cell
.compactMap { $0.value }
// convert the value to a number
.compactMap { Int($0) }
// use the number as an index in the array of shared strings
.compactMap { sharedStrings.items[$0].text }Since version 0.5.0 you can parse style information from the archive with the
new parseStyles() function. Please refer to the Styles
model
for more details. You should also note that not all XLSX files contain style
information, so you should be prepared to handle the errors thrown from
parseStyles() function in that case.
Here's a short example that fetches a list of fonts used:
let styles = try file.parseStyles()
let fonts = styles.fonts?.items.compactMap { $0.name?.value }If you stumble upon a file that can't be parsed, please file an
issue posting the exact error
message. Thanks to use of standard Swift Codable protocol, detailed errors are
generated listing a missing attribute, so it can be easily added to the model
enabling broader format support. Attaching a file that can't be parsed would
also greatly help in diagnosing issues. If these files contain any sensitive
data, we suggest obfuscating or generating fake data with same tools that
generated original files, assuming the issue can still be reproduced this way.
If the whole file can't be attached, try passing a sufficiently large value
(between 10 and 20 usually works well) to errorContextLength argument of
XLSXFile initializer. This will bundle the failing XML snippet with the debug
description of thrown errors. Please also attach the full debug description if
possible when reporting issues.
Since every XLSX file is a zip archive of XML files, CoreXLSX uses
XMLCoder library and standard
Codable protocols to map XML nodes and atrributes into plain Swift structs.
ZIPFoundation is used for
in-memory decompression of zip archives. A detailed description is available
here.
Apple Platforms
- Xcode 10.0 or later
- Swift 4.2 or later
- iOS 9.0 / watchOS 2.0 / tvOS 9.0 / macOS 10.11 or later deployment targets
Linux
- Ubuntu 14.04 or later
- Swift 5.0.1 or later
Swift Package Manager is a tool for managing the distribution of Swift code. It’s integrated with the Swift build system to automate the process of downloading, compiling, and linking dependencies on all platforms.
Once you have your Swift package set up, adding CoreXLSX as a dependency is as
easy as adding it to the dependencies value of your Package.swift.
dependencies: [
.package(url: "https://github.com/MaxDesiatov/CoreXLSX.git",
.upToNextMajor(from: "0.9.1"))
]CoreXLSX is available through CocoaPods on Apple's
platforms. To install it, simply add pod 'CoreXLSX', '~> 0.9.1' to your
Podfile like shown here:
source 'https://github.com/CocoaPods/Specs.git'
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'
use_frameworks!
target '<Your Target Name>' do
pod 'CoreXLSX', '~> 0.9.1'
endCarthage is a dependency manager that builds your dependencies and provides you with binary frameworks on Apple's platforms.
Carthage can be installed with Homebrew using the following command:
$ brew update
$ brew install carthageInside of your Cartfile, add GitHub path to CoreXLSX and its latest version:
github "MaxDesiatov/CoreXLSX" ~> 0.9.1
Then, run the following command to build the framework:
$ carthage updateDrag the built frameworks (including the subdependencies XMLCoder and
ZIPFoundation) into your Xcode project.
For development work and for running the tests in Xcode you need to run
carthage bootstrap in the root directory of the cloned repository first.
Then you can open the CoreXLSX.xcodeproj from the same directory and select
the CoreXLSXmacOS scheme. This is the only scheme that has the tests
set up, but you can also build any other scheme (e.g. CoreXLSXiOS) to make
sure it builds on other platforms.
If you prefer not to work with Xcode, the project fully supports SwiftPM and the
usual workflow with swift build and swift test should work, otherwise please
report this as a bug.
This project adheres to the Contributor Covenant Code of Conduct. By participating, you are expected to uphold this code. Please report unacceptable behavior to corexlsx@desiatov.com.
Max Desiatov, Matvii Hodovaniuk
CoreXLSX is available under the Apache 2.0 license. See the LICENSE file for more info.