我正在尝试使用Apache POI DSL上的自定义DSL加载和读取Excel文件。
我想为spark提供Excel支持,并且我正在使用Apache POI。我在Scala中找到了上面的DSL存储库。我试图找到一种方法来读取单元格并使用Scala打印它们。
object XlsLoader{
def f1(): Unit ={
val path = "/Users/shashi/data311.xlsx"
val res = Workbook(path)
val res1 = res.getOrElse(null)
println(res1)
println("one")
val q = res1.map {
x =>
println("hello")
println(x)
println("sheetmap -- "+x.sheetMap)
println("flatten -- "+x.sheetMap.toList)
println("keys -- "+x.sheetMap.keys.toList)
println("1he")
x.sheetMap.keys.toList.foreach(n => println(n))
println("2he")
println("toString -- "+x.toString())
}
println("two")
println(q)
}
}
这是输出。
scalaz.effect.IO$$anon$7@1a8e246b
one
two
scalaz.effect.IO$$anon$7@34ccc2af
我想找到纸张的内部结构并打印出来。我该怎么做?
这是excel文件供您参考。
c1 c2
1 100
2 200
3 300
4 400
5 500
答案 0 :(得分:1)
所以我使用了以下依赖项:
"info.folone" %% "poi-scala" % "0.18"
现在,您的代码中唯一缺少的是调用.run
和.unsafePerformIO
(或更安全的替代方法)。
我还创建了一个小的示例,它将逐步解释并向控制台提供给定.xls
文件的一般结构,希望它有用:
import java.io.InputStream
import info.folone.scala.poi._
import scalaz.{-\/, \/-}
object ReadExcelFile {
def main(args: Array[String]): Unit = {
val readResult = Workbook(xlsFile)
.map(workbook => workbook.sheets)
.run
.unsafePerformIO()
readResult match {
case -\/(exception) => throw new RuntimeException("Could not read file", exception)
case \/-(sheets) => sheets.foreach(printSheet)
}
}
def printSheet(sheet: Sheet): Unit = {
println(s"------------ ${sheet.name} ------------\n")
sheet.rows.foreach(printRow)
}
def printRow(row: Row): Unit = println(row.cells.toList.sortBy(_.index).mkString(", ") + "\n")
def xlsFile: InputStream = ReadExcelFile.getClass.getResourceAsStream("/test.xls")
}
输出将如下所示:
------------ Sample-spreadsheet-file ------------
FormulaCell(0, "=A1+1"), StringCell(1, "1.7 Cubic Foot Compact "Cube" Office Refrigerators"), StringCell(2, "Barry French"), NumericCell(3, 293.0), NumericCell(4, 457.81), NumericCell(5, 208.16), NumericCell(6, 68.02), StringCell(7, "Nunavut"), StringCell(8, "Appliances"), NumericCell(9, 0.58)
如您所见打印单元格类型,内容和工作表名称。
希望它有所帮助!