Corexlsx-это библиотека, ориентированная на представление низкоуровневой структуры формата электронной таблицы на основе XML. Это позволяет вам открыть архив электронной таблицы с расширением .xlsx и составить его внутреннюю структуру в типы моделей, выраженные непосредственно в Swift.
Важно отметить, что эта библиотека обеспечивает поддержку только для чтения только для формата .xlsx . Поскольку в формате электронной таблицы xls более старый Legacy .xls совершенно разные внутренние внутренности, обратитесь к другим библиотекам, если вам нужно работать с файлами такого типа.
Если ваши файлы .xlsx используют гибкое шифрование ECMA-376 (которое, кажется, является самым популярным разнообразием), посмотрите на библиотеку CryptoOffice.
Автоматически сгенерированная документация доступна на наших страницах GitHub.
Присоединяйтесь к нашим разногласиям для любых вопросов и дружелюбного подшучивания.
Чтобы запустить пример проекта, клонируйте репо, и сначала запустите pod install из Directory Directory.
Типы моделей в CoreXLSX непосредственно отображают внутреннюю структуру формата XLSX с более разумным именованием, применяемым к нескольким атрибутам. API довольно прост:
import CoreXLSX
let filepath = " ./categories.xlsx "
guard let file = XLSXFile ( filepath : filepath ) else {
fatalError ( " XLSX file at ( filepath ) is corrupted or does not exist " )
}
for wbk in try file . parseWorkbooks ( ) {
for (name , path ) in try file . parseWorksheetPathsAndNames ( workbook : wbk ) {
if let worksheetName = name {
print ( " This worksheet has a name: ( worksheetName ) " )
}
let worksheet = try file . parseWorksheet ( at : path )
for row in worksheet . data ? . rows ?? [ ] {
for c in row . cells {
print ( c )
}
}
}
} Это печатает данные необработанных ячеек с каждого рабочего листа в данном файле XLSX. Пожалуйста, обратитесь к модели Worksheet для получения дополнительной информации, вам может потребоваться прочитать из файла разыгрывания.
Вы не должны обращаться к клеткам через их индексы в массиве cells . У каждой ячейки есть reference свойство, которое вы можете прочитать, чтобы понять, где находится именно данная ячейка. Соответствующие свойства на структуре CellReference дают вам точное положение ячейки.
Формат .xlsx делает четкое различие между пустой ячейкой и отсутствием клетки. Если вы не получаете ячейку или строку при переходе через массив cells , это означает, что в вашем документе нет такой ячейки или ряда. В вашем документе .xlsx должны быть написаны пустые ячейки и строки, в первую очередь, чтобы вы могли их читать.
Сделание этого различия делает формат более эффективным, особенно для разреженных таблиц. Если бы у вас была таблица с одной ячейкой Z1000000, она не будет содержать миллионы пустых ячеек и одну ячейку со значением. Файл хранит только одну ячейку, которая позволяет быстро сохранить и загружать редкие таблицы, также занимая меньше места в файловой системе.
Учитывая, как формат .xlsx хранит ячейки, вы потенциально должны итерации по всем ячейкам и создаете свое собственное отображение из ссылок на ячейки на фактические значения клеток. Библиотека Corexlsx в настоящее время не делает это автоматически, и вам придется реализовать свое собственное отображение, если вам это нужно. Вы можете отправить запрос на привлечение, который добавляет такую функциональность в качестве дополнительного шага во время анализа.
Строки в внутренних таблицах часто представлены как строки, разделяемые между несколькими рабочими листами. Чтобы проанализировать строковое значение из ячейки, вы должны использовать функцию stringValue(_: SharedStrings) на Cell вместе с parseSharedString() на XLSXFile .
Вот как вы можете получить все строки в столбце «C», например:
if let sharedStrings = try file . parseSharedStrings ( ) {
let columnCStrings = worksheet . cells ( atColumns : [ ColumnReference ( " C " ) ! ] )
. compactMap { $0 . stringValue ( sharedStrings ) }
} Чтобы проанализировать значение даты из ячейки, используйте свойство dateValue на типе Cell :
let columnCDates = worksheet . cells ( atColumns : [ ColumnReference ( " C " ) ! ] )
. compactMap { $0 . dateValue } Точно так же, чтобы проанализировать богатые струны, используйте функцию richStringValue :
if let richStrings = try file . parseSharedStrings ( ) {
let columnCRichStrings = worksheet . cells ( atColumns : [ ColumnReference ( " C " ) ! ] )
. compactMap { $0 . richStringValue ( sharedStrings ) }
} Поскольку версия 0.5.0 вы можете анализировать информацию о стиле из архива с помощью новой функции parseStyles() . Пожалуйста, обратитесь к модели Styles для более подробной информации. Вы также должны отметить, что не все файлы XLSX содержат информацию о стиле, поэтому вы должны быть готовы обрабатывать ошибки, выбрасываемую из функции parseStyles() в этом случае.
Вот краткий пример, который извлекает список используемых шрифтов:
let styles = try file . parseStyles ( )
let fonts = styles . fonts ? . items . compactMap { $0 . name ? . value } Чтобы получить форматирование для данной ячейки, используйте format(in:) и font(in:) Функции, передавая ее результат parseStyles :
let styles = try file . parseStyles ( )
let format = worksheet . data ? . rows . first ? . cells . first ? . format ( in : styles )
let font = worksheet . data ? . rows . first ? . cells . first ? . font ( in : styles ) Если вы наткнетесь на файл, который не может быть проанализирован, пожалуйста, подайте проблему, опубликовав точное сообщение об ошибке. Благодаря использованию стандартного протокола Swift Codable , сгенерируются подробные ошибки, в которых перечислены отсутствующий атрибут, поэтому его можно легко добавить в модель, позволяющая более широкому поддержке формата. Прикрепление файла, который не может быть проанализирован, также очень поможет в диагностике проблем. Если эти файлы содержат какие -либо конфиденциальные данные, мы предлагаем запутывать или генерировать поддельные данные с теми же инструментами, которые сгенерировали исходные файлы, предполагая, что проблема все еще может быть воспроизведена таким образом.
Если весь файл не может быть подключен, попробуйте пропустить достаточно большое значение (от 10 до 20 обычно работает хорошо) к errorContextLength Argiry of XLSXFile инициализатора. Это объединит неудачный фрагмент XML с описанием отладки ошибок брошенных. Пожалуйста, также прикрепите полное описание отладки, если это возможно, при отчетности.
Поскольку каждый файл XLSX представляет собой архив ZIP из файлов XML, CoreXLSX использует библиотеку XMLCoder и стандартные Codable протоколы для картирования узлов XML и атрибутов в простые быстрые структуры. ZIPFoundation используется для декомпрессии архивов Zip в памяти. Подробное описание доступно здесь.
Apple Платформы
Linux
Swift Package Manager - это инструмент для управления распределением Swift Code. Он интегрирован с системой Swift Build для автоматизации процесса загрузки, компиляции и связывания зависимостей на всех платформах.
После того, как у вас настраивается пакет Swift, добавление CoreXLSX в качестве зависимости так же просто, как добавить его к значению dependencies вашего Package.swift Swift.
dependencies: [
. package ( url : " https://github.com/CoreOffice/CoreXLSX.git " ,
. upToNextMinor ( from : " 0.14.1 " ) )
]Если вы используете CoreXlSX в приложении, созданном с помощью XCode, вы также можете добавить его в качестве прямой зависимости, используя графический интерфейс Xcode.
Corexlsx доступен через кокопод на платформах Apple. Чтобы установить его, просто добавьте pod 'CoreXLSX', '~> 0.14.1' к вашему Podfile , как показано здесь:
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.14.1'
end В MacOS самый простой способ начать работу над проектом - это открыть файл Package.swift в XCode 11 или более поздней версии. Существует обширный набор тестирования, в котором оба тестируют файлы, сквозные и изолированные фрагменты по соответствующим значениям модели.
Если вы предпочитаете не работать с XCode, проект полностью поддерживает SWIFTPM, и обычный рабочий процесс с помощью swift build и swift test должен работать, в противном случае, пожалуйста, сообщите об этом как ошибку.
Этот проект использует Swiftformat и Swiftlint для обеспечения соблюдения форматирования и стиля кодирования. Мы рекомендуем вам запустить Swiftformat в локальном клоне репозитория, любым способом, который лучше всего подходит для вас вручную или автоматически через расширение Xcode, фазу сборки или Git Pre-Commit Hook и т. Д.
Чтобы гарантировать, что эти инструменты работают до того, как вы совершите свои изменения в MacOS, вам рекомендуется запустить это один раз, чтобы настроить крюк перед предварительной коммитацией:
brew bundle # installs SwiftLint, SwiftFormat and pre-commit
pre-commit install # installs pre-commit hook to run checks before you commit
Обратитесь к странице предварительной документации для получения более подробной информации и инструкций по установке для других платформ.
Swiftformat и Swiftlint также работают на CI для каждого PR, и, следовательно, сборка CI может выйти из строя с непоследовательным форматированием или стилем. Мы требуем, чтобы CI Builds проходили для всех PRS перед слиянием.
Этот проект придерживается Кодекса поведения завета участника. Участвуя, вы должны поддержать этот кодекс. Пожалуйста, сообщите о неприемлемом поведении по адресу [email protected].
Corexlsx доступен по лицензии Apache 2.0. Смотрите файл лицензии для получения дополнительной информации.