Corexlsx是一个库,重点是表示基于XML的XLSX电子表格格式的低级结构。它允许您打开带有.xlsx扩展名的电子表格存档,并将其内部结构映射到直接在Swift中表达的模型类型。
重要的是要注意,该库仅提供仅针对.xlsx格式的读取支持。由于较旧的旧版.xls电子表格格式具有完全不同的内部词,因此,如果您需要使用该类型的文件,请参考其他库。
如果您的.xlsx文件使用ECMA-376敏捷加密(似乎是最受欢迎的品种),请查看CryptoOffice库。
自动生成的文档可在我们的GitHub页面上找到。
出于任何疑问和友好的玩笑,加入我们的不和谐。
要运行示例项目,请首先从示例目录中pod install 。
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库当前未自动执行此操作,如果需要,您将必须实现自己的映射。欢迎您提交拉动请求,该请求将功能添加为解析过程中的可选步骤。
电子表格内部设备中的字符串经常表示为多个工作表之间的字符串。要从单元格中解析字符串值,您应该在Cell上使用stringValue(_: SharedStrings)函数,以及XLSXFile上的parseSharedString() 。
例如,您可以在“ C”列中获取所有字符串:
if let sharedStrings = try file . parseSharedStrings ( ) {
let columnCStrings = worksheet . cells ( atColumns : [ ColumnReference ( " C " ) ! ] )
. compactMap { $0 . stringValue ( sharedStrings ) }
}要从单元格中解析日期值,请在Cell格上使用dateValue属性:
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.5,您可以通过新的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之间效果很好)传递到XLSXFile初始化器的errorContextLength参数。这将与丢弃错误的调试描述捆绑失败的XML片段。如果可能的话,请在可能的情况下附加完整的调试说明。
由于每个XLSX文件都是XML文件的ZIP档案,因此CoreXLSX使用XMLCoder库和标准Codable协议将XML节点映射到Plain Swift structs中。 ZIPFoundation用于邮政档案中的内存解压缩。这里有详细的描述。
苹果平台
Linux
Swift软件包管理器是管理Swift代码分布的工具。它与Swift Build System集成在一起,以自动化下载,编译和链接所有平台的依赖关系的过程。
设置了Swift软件包后,将CoreXLSX作为依赖关系添加就像将其添加到Package.swift的dependencies值中一样容易。
dependencies: [
. package ( url : " https://github.com/CoreOffice/CoreXLSX.git " ,
. upToNextMinor ( from : " 0.14.1 " ) )
]如果您在使用Xcode构建的应用程序中使用Corexlsx,则还可以使用Xcode的GUI将其添加为直接依赖关系。
Corexlsx可通过Apple平台上的Cocoapods获得。要安装它,只需将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上,最简单的方法开始处理该项目的方法是打开XCODE 11或更高版本中的Package.swift文件。有一个广泛的测试套件,两个测试都针对其相应的模型值端对端和隔离片段进行了测试。
如果您不希望与Xcode合作,则该项目完全支持SwiftPM,并且swift build and swift test的通常工作流程应起作用,否则请将其报告为错误。
该项目使用SwiftFormat和Swiftlint来执行格式和编码样式。我们鼓励您通过XCode扩展名,构建阶段或Git预先承诺的挂钩等,以最适合您或自动的方式运行存储库的本地克隆。
为了确保这些工具在进行MACOS上的更改之前运行,我们鼓励您一次运行一次以设置预先承诺的钩子:
brew bundle # installs SwiftLint, SwiftFormat and pre-commit
pre-commit install # installs pre-commit hook to run checks before you commit
有关其他平台的更多详细信息和安装说明,请参阅“预先承诺的文档”页面。
SwiftFormat和Swiftlint也在每个PR上都在CI上运行,因此CI构建可能会因格式不一致或样式而失败。我们要求CI构建在合并之前通过所有PR通过。
该项目遵守贡献者盟约行为准则。通过参加,您应该维护此代码。请向[email protected]报告不可接受的行为。
Corexlsx可在Apache 2.0许可下获得。有关更多信息,请参见许可证文件。