2017-01-16 138 views
1

我正嘗試使用自定義DSL在Apache POI DSL加載和讀取Excel文件。爲excel文件打印單元格值

我想提供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) 
    } 
} 

這是輸出。

[email protected] 
one 
two 
[email protected] 

我想找到工作表的內部結構並打印出來。我該怎麼做 ?

這是供您參考的excel文件。

c1 c2 
1 100 
2 200 
3 300 
4 400 
5 500 
+0

你在答案中需要一些更具體的內容,或者你可以接受嗎? – tkachuko

+0

我接受答案,因信譽而不能滿意。現在我需要把這個excel轉換成數據框,但是這個超出了這個問題的範圍,如果有的話,建議任何有用的鏈接。 –

+0

如果您接受答案,您能否將其標記爲正確的(帶綠色勾號)? – tkachuko

回答

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) 

正如你可以看到它打印的細胞類型,內容和工作表名稱。

希望它有幫助!