我想在一个 Scala 应用程序中使用 Apache POI 读取/创建 Excel 文件。当然,我可以直接使用 POI 库,毕竟它是 Java 的,但我希望有 Scala 的感觉。所以是否有一个 Scala 包装器带来 Scala 的感觉(使用隐式转换),即某种自由可用的“Scala-POI-DSL”?
我想在一个 Scala 应用程序中使用 Apache POI 读取/创建 Excel 文件。当然,我可以直接使用 POI 库,毕竟它是 Java 的,但我希望有 Scala 的感觉。所以是否有一个 Scala 包装器带来 Scala 的感觉(使用隐式转换),即某种自由可用的“Scala-POI-DSL”?
感谢Dave Griffith的答案,我已经模仿他的DSL并进行了一些修改。
Workbook {
Sheet("name") {
Row(1) {
Cell(1, "data") :: Cell(2, "data2") :: Nil
} ::
Row(2) {
Cell(1, "data") :: Cell(2, "data2") :: Nil
} :: Nil
} ::
Sheet("name2") {
Row(2) {
Cell(1, "data") :: Cell(2, "data2") :: Nil
} :: Nil
} :: Nil
}.save("/home/path/ok.xls")
代码可以在这里找到。
由于缺乏Scala高级开源电子表格包装器,我开始开发Spoiwo:https://github.com/norbert-radyk/spoiwo。它允许生成XSSFWorkbook并支持POI大部分功能的重要子集。
它仍然需要一些文档说明,但下面的内容应该可以初步了解其功能:
使用Spoiwo制作简单电子表格的示例:
object GettingStartedExample {
val headerStyle =
CellStyle(fillPattern = CellFill.Solid, fillForegroundColor = Color.AquaMarine, fillBackgroundColor = Color.AquaMarine, font = Font(bold = true))
val gettingStartedSheet = Sheet(name = "Some serious stuff")
.withRows(
Row(style = headerStyle).withCellValues("NAME", "BIRTH DATE", "DIED AGED", "FEMALE"),
Row().withCellValues("Marie Curie", new LocalDate(1867, 11, 7), 66, true),
Row().withCellValues("Albert Einstein", new LocalDate(1879, 3, 14), 76, false),
Row().withCellValues("Erwin Shrodinger", new LocalDate(1887, 8, 12), 73, false)
)
.withColumns(
Column(index = 0, style = CellStyle(font = Font(bold = true)), autoSized = true)
)
def main(args: Array[String]) {
gettingStartedSheet.saveAsXlsx("C:\\Reports\\getting_started.xlsx")
}
}
com.norbitltd.spoiwo.model.Sheet
序列化为HTTP响应。 - Sayat SatybaldWorkbook{
Sheet("Multiplication"){
for(i<-1 to 10){
Row{
for(j<-1 to 10){
Cell(i*j)
}
}
}
}
}.writeToFile("multiplication.xls")
很遗憾,我不能在未经我的上司确认的情况下将其提供出来,但说实话,这并不难做。你应该能够从那个例子中大部分地反向工程出来,而且不会有太多麻烦。
如果您正在编写Office XML,可以考虑避免使用POI并直接创建XML文件(同时将其进行存档)。对于简单的电子表格,这样做非常简单,并且可以消除许多变量。
请注意,如果您想要创建超过65k行的大型电子表格,则需要使用POI的OOXML支持中的流模式。
我不知道是否有任何Scala库能够实现这种封装。
关于使用apache POI的大多数问题都是迭代器相关的。
而alexcheng项目可以导入Excel文档并且附带一个测试用例。
但仅此而已。