表格形式

基本的电子表格格式 - 行、列、标题 - 已经被普通的计算机用户广泛理解。有很多电子表格程序,它们都提供了高级的数据编辑功能,甚至还有其他程序可以将它们自己的数据导出为表格。这些情况使得电子表格成为某些类型数据交换的理想格式,但并非总是有现成的工具可以将数据转换回结构化对象。该软件包的目的是帮助访问和转换所需的值。

这个软件包并不打算处理非常大的表格,或者以最大速度或最小内存成本来处理它们,它也不进行转换本身。 相反,它专注于促进普通用户和开发人员之间的数据共享,让前者以熟悉的格式生成数据,后者可以轻松地从中提取相关部分,并具有一定的容错性。

通过 CoreXLSX 支持读取 XLSX 文件。 可能会在某个时候添加 CSV 支持。

示例

标题在行中,单个数据列

Data:
+-------+-------+
| Name  | Alice |
| Age   |   27  |
+-------+-------+

let person = Person(
    name: try table.at(row:"name").text(),
    age: try table.at(row:"age").int()
)

创建一个按姓氏分组的人员映射

Data:
+-------------+------------+-----+
| First name  | Last name  | Age |
+-------------+------------+-----+
| Alice       | Goldsmith  |  27 |
| Bob         | Cooper     |  31 |
| Concha      | Delorean   |  60 |
| Zoe         | Cooper     |  36 |
+-------------+------------+-----+

let personsByLastName = try table.enumerateRows().reduce(into: [String:[Person]]()) { map, row in
    let lastName = try table.at(col:"last name", row).text()
    let person = try Person(
        firstName: table.at(col:"first name", row).text(),
        lastName: lastName,
        age: table.at(col:"age", row).int()
    )

    var list = map[lastName] ?? []
    list.append(person)
    map[lastName] = list
}

将相关列加载到数组/二维数组中

Data:
+-------------+-----------------+-----------------+-----------------+-----------------+------------+-----------+
| Guest       | Main Course 1.1 | Main Course 1.2 | Main Course 2.1 | Main Course 2.2 | Dessert 1  | Dessert 2 |
+-------------+-----------------+-----------------+-----------------+-----------------+------------+-----------+
| Alice       | Veal            | Mutton          | Tuna            | Bass            | Porridge   | Mousse    |
| Bob         | Beef            | Pork            | Salmon          | Trout           | Cheesecake | Custard   |
+-------------+-----------------+-----------------+-----------------+-----------------+------------+-----------+

struct Choices {
    let guest: String
    let mains: [[String]]
    let dessert: [String]
}

let choices = try table.enumerateRows().map { row in Choices(
    guest: try table.at(col:"guest", row).text(),
    mains: try table.array2(col:"main course", row).map { $0.map { try $0.text() }},
    dessert: try table.array(col:"main course", row).map { try $0.text() }
)}

许可证

除非另有说明,否则此软件包中的所有文件均是 NOTICE 文件中提到的软件包贡献者的版权所有,并根据 Apache 2.0 许可证 获得许可,该许可证允许商业用途。