使用 Scala 读取 Excel 文件

Posted

技术标签:

【中文标题】使用 Scala 读取 Excel 文件【英文标题】:Reading Excel file with Scala 【发布时间】:2018-02-15 15:50:50 【问题描述】:

我正在编写一个快速测试,使用电子表格中的数据注册用户。

这个想法是转到网站>点击注册>阅读excel行A1和B1以获取电子邮件和密码>在注册站点上使用此数据>完成注册>注销>使用A2和B2行的信息注册一个新用户> 继续,直到电子表格中的行为空。

我已经设法使用随机用户信息自动执行注册过程,现在我只需要使用从电子表格中获取的特定电子邮件和密码进行相同的操作。

我尝试过使用 Apache Poi,但不完全确定如何使用它以及如何让它自行循环,直到电子表格结束。

这是我目前所拥有的,但我认为这是错误的:

val myData = new File("/desktop/files.file.xmls")

val fis = new FileInputStream(myData)

val myWorkbook = new HSSFWorkbook(fis)

val mySheet = myWorkbook.getSheetAt(0)

val rowIterator = mySheet.iterator()

while(rowIterator.hasNext)

val row = rowIterator.next()

  val cellIterator = row.cellIterator()

  while(cellIterator.hasNext) 
    val cell = cellIterator.next()
      cell.getCellType match 
        case Cell.CELL_TYPE_STRING => 
          print(cell.getStringCellValue + "\t")
        
        case Cell.CELL_TYPE_NUMERIC => 
          print(cell.getNumericCellValue + "\t")
        

        case Cell.CELL_TYPE_BLANK => 
          print("null" + "\t")
        

      
  
  println("")

【问题讨论】:

我刚刚用 apache poi 做了一些有趣的工作。您是否尝试过查看 poi.apache.org/spreadsheet/quick-guide.html#NewWorkbook ?这可能是指南中最有用的参考,无需深入研究 javadoc 本身 你试过poi.apache.org/spreadsheet/quick-guide.html#Iterator 吗? 还有poi.apache.org/poi-jvm-languages.html#Scala+example ? 【参考方案1】:

请注意,我使用的是 poi 3.17。所以我的 build.sbt 有

"org.apache.poi" % "poi" % "3.17"
"org.apache.poi" % "poi-ooxml" % "3.17"

在里面。如果您使用的是其他版本,请在问题中说明,我会更新我的答案。

这是我的示例 excel 文件:

首先,导入:

import org.apache.poi.ss.usermodel. DataFormatter, WorkbookFactory, Row 
import java.io.File
import collection.JavaConversions._ // lets you iterate over a java iterable

然后您可以使用 WorkbookFactory 拉入您的文件并获取您的工作表:

val f = new File("Example.xlsx")
val workbook = WorkbookFactory.create(f)
val sheet = workbook.getSheetAt(0) // Assuming they're in the first sheet here.

接下来,如果注意Sheet的类型 您会注意到它实现了Iterable<Row>,这意味着您可以只使用for 来遍历所有行:

for (row <- sheet) 
    // Do things

当然,前提是您不需要从循环中返回任何内容。如果你需要这样做,你应该能够做到

sheet.map  row => 

接下来,要获取单元格的实际值,您需要一个格式化程序:

val formatter = new DataFormatter()

然后要拉出 A 列,请在索引 0 处的 row 上调用 getCell

val maybeA = Option(row.getCell(0, Row.MissingCellPolicy.RETURN_BLANK_AS_NULL)) // lift null to None
val maybeB = Option(row.getCell(1, Row.MissingCellPolicy.RETURN_BLANK_AS_NULL))

那么我假设你只想在你同时拥有这两个单元格的情况下做某事,在这种情况下你可以利用对这两个单元格的理解:

val maybeEmailAndPass = for 
    a <- maybeA
    b <- maybeB
 yield 
    val email = formatter.formatCellValue(a) 
    val pass = formatter.formatCellValue(b)
    (email, pass)

println(maybeEmailAndPass)

如果你有东西,你可以用它做任何你想做的事情。

上面运行在我的例子上给了我

Some((Row1 Email,Row1 Pass))
Some((Row2 Email,Row2 Pass))

【讨论】:

这个答案被低估了。想要投票 +10。

以上是关于使用 Scala 读取 Excel 文件的主要内容,如果未能解决你的问题,请参考以下文章

easy Excel是分片写入嘛

使用 Scala/Spark 读取 Json 文件

如何使用 spark(scala)读取和写入(更新)同一个文件

使用 scala 从 HDFS 读取输入 xml 数据

delphi 如何写入Excel

Azure Datalake Store Gen2 使用 scala spark 库从 Databricks 读取文件