【问题标题】:Is there a Scala wrapper for Apache POI?Apache POI 是否有 Scala 包装器?
【发布时间】:2011-06-29 06:15:23
【问题描述】:

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

【问题讨论】:

  • 您是否找到/创建了 Fancy POI 的任何示例?谢谢

标签: excel scala apache-poi


【解决方案1】:

我不知道任何用于这种封装的 Scala 库。

关于使用 apache POI 的大多数问题是about iterators
alexcheng project 确实是import an Excel document,并且有一个test case
但仅此而已。

【讨论】:

    【解决方案2】:

    Fancy POI - 似乎找不到太多信息,但我想这就是你要找的。​​p>

    【讨论】:

    • 这看起来更完整,但是没有文档、示例或单元测试。需要弄清楚,这是如何使用的......
    【解决方案3】:

    这完全没有帮助,但我为 POI 编写了一个 Scala 风格的 DSL。它允许像

    这样的代码
    Workbook{
      Sheet("Multiplication"){
          for(i<-1 to 10){
             Row{
               for(j<-1 to 10){
                 Cell(i*j)
               }
             }
          }
      }
    }.writeToFile("multiplication.xls")
    

    很遗憾,我无法在没有与老板核实的情况下将其发布,但老实说,这并不难做到。您应该能够轻松地从该示例中对大部分内容进行逆向工程。

    【讨论】:

      【解决方案4】:

      如果您正在编写 Office XML,您可以考虑避免 POI 并直接创建 XML(加上将其一起归档)。对于简单的电子表格,操作起来非常简单,而且您消除了很多变量。

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

      【讨论】:

      • 是的,它工作得很好,我将它与 Spark XML 一起用于翻译 Object => XML。很简单。
      【解决方案5】:

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

      代码可以在here找到。

      【讨论】:

      • 这看起来不错,但它只是主要的工作簿,没有额外的功能。所以它需要一些工作。
      • 谢谢。我只是破解了目前需要的东西。欢迎提出拉取请求;)
      【解决方案6】:

      鉴于 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 响应。
      • 感谢您的评论和提问。简单的答案是:与您使用 Apache POI 的方式相同 - 因为您可以将其转换为原始 POI 表(只需调用 com.norbitltd.spoiwo.model.Sheet.convertAsXlsx()),而 Spoiwo 只是一个包装器 :)请让我知道您如何想象它与您的应用程序一起工作,希望我能提出更好的方法。
      • 据我所知,Play Framework 中没有用于 XLSX Worbook 到 HTTP 响应的序列化程序。我使用 hack 来保存文件,然后将其作为文件返回。不过,我不喜欢这个解决方案,因为我需要保存一个文件。这是一个代码:stackoverflow.com/a/28711403/2586315
      • @NorbertRadyk SPOIWO 是否支持以功能样式读取 xsl / xslx 文件,就像创建它们一样? TKS!
      • 很遗憾,截至目前,它只是一个仅用于创建的库。
      猜你喜欢
      • 1970-01-01
      • 2016-03-08
      • 2019-06-20
      • 2012-04-24
      • 1970-01-01
      • 1970-01-01
      • 2013-08-26
      • 2011-09-26
      • 1970-01-01
      相关资源
      最近更新 更多