是否有适用于Apache POI的Scala封装器?

21

我想在一个 Scala 应用程序中使用 Apache POI 读取/创建 Excel 文件。当然,我可以直接使用 POI 库,毕竟它是 Java 的,但我希望有 Scala 的感觉。所以是否有一个 Scala 包装器带来 Scala 的感觉(使用隐式转换),即某种自由可用的“Scala-POI-DSL”?


1
你有找到/创建任何Fancy POI的示例吗?谢谢。 - Ittai
6个回答

13

感谢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")

代码可以在这里找到。


这看起来不错,但只是主要的工作簿,没有额外的功能。所以还需要一些工作。 - Peter Kofler
谢谢。我只是在需要的时候进行了一些黑客攻击。欢迎提交拉取请求 ;) - George

10

由于缺乏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")
  }
} 

谢谢提供这个模块!我真的很喜欢在报告生成中使用函数式风格的想法。我有一个小问题:如何在Play框架中使用此模块?我正在尝试在控制器中返回文件,但我需要将com.norbitltd.spoiwo.model.Sheet序列化为HTTP响应。 - Sayat Satybald
感谢您的评论和问题。简单的答案是:您可以像使用Apache POI一样使用它 - 因为您可以将其转换为原始POI表格(只需调用com.norbitltd.spoiwo.model.Sheet.convertAsXlsx()),而Spoiwo只是一个包装器 :) 请让我知道您如何想象它与您的应用程序一起工作,希望我能提出更好的建议。 - Norbert Radyk
据我所知,在Play框架中没有XLSX工作簿到HTTP响应的序列化程序。我使用了一个技巧来保存文件,然后将其作为文件返回。虽然如此,我不喜欢这个解决方案,因为我需要保存一个文件。以下是代码:http://stackoverflow.com/a/28711403/2586315 - Sayat Satybald
@NorbertRadyk,SPOIWO是否支持以函数式的方式读取xsl / xslx文件,就像它创建这些文件那样?谢谢! - juanpavergara
很遗憾,目前它只是一个仅用于创建的库。 - Norbert Radyk

5

Fancy POI - 似乎没有太多相关信息,但我猜这就是你在寻找的。


这看起来更完整,但没有文档、示例或单元测试。需要弄清楚如何使用它... - Peter Kofler

4
这是完全没有帮助的,但我编写了一个类似于Scala的POI领域特定语言。它允许像这样的代码:
Workbook{
  Sheet("Multiplication"){
      for(i<-1 to 10){
         Row{
           for(j<-1 to 10){
             Cell(i*j)
           }
         }
      }
  }
}.writeToFile("multiplication.xls")

很遗憾,我不能在未经我的上司确认的情况下将其提供出来,但说实话,这并不难做。你应该能够从那个例子中大部分地反向工程出来,而且不会有太多麻烦。


2

如果您正在编写Office XML,可以考虑避免使用POI并直接创建XML文件(同时将其进行存档)。对于简单的电子表格,这样做非常简单,并且可以消除许多变量。

请注意,如果您想要创建超过65k行的大型电子表格,则需要使用POI的OOXML支持中的流模式。


是的,它运行得非常好,我正在将其与Spark XML一起使用,用于对象=> XML的转换。很简单。 - Thomas Decaux

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接