使用Scala读取Excel文件

Ali*_*ead 2 testing automation scala apache-poi

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

想法是转到网站>点击注册>阅读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("")
Run Code Online (Sandbox Code Playgroud)

Edg*_*erg 8

就像一张纸条,我正在使用poi 3.17.所以我的build.sbt有

"org.apache.poi" % "poi" % "3.17"
"org.apache.poi" % "poi-ooxml" % "3.17"
Run Code Online (Sandbox Code Playgroud)

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

这是我的示例excel文件:

在此输入图像描述

首先,进口:

import org.apache.poi.ss.usermodel.{ DataFormatter, WorkbookFactory, Row }
import java.io.File
import collection.JavaConversions._ // lets you iterate over a java iterable
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用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.
Run Code Online (Sandbox Code Playgroud)

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

for (row <- sheet) {
    // Do things
}
Run Code Online (Sandbox Code Playgroud)

只要你不需要从循环中返回任何东西.如果你需要这样做,你应该能够做到

sheet.map { row => }
Run Code Online (Sandbox Code Playgroud)

接下来,要获得格式化程序所需的单元格的实际值:

val formatter = new DataFormatter()
Run Code Online (Sandbox Code Playgroud)

然后拉A柱,您拨打getCellrow索引0:

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))
Run Code Online (Sandbox Code Playgroud)

那么我假设你只想做一些事情,如果你有这两个单元格,在这种情况下你可以利用这两个来理解:

val maybeEmailAndPass = for {
    a <- maybeA
    b <- maybeB
} yield {
    val email = formatter.formatCellValue(a) 
    val pass = formatter.formatCellValue(b)
    (email, pass)
}
println(maybeEmailAndPass)
Run Code Online (Sandbox Code Playgroud)

然后,如果你有什么东西,你可以做任何你想做的事情.

而上面的例子就是我的例子

Some((Row1 Email,Row1 Pass))
Some((Row2 Email,Row2 Pass))
Run Code Online (Sandbox Code Playgroud)

  • 这个答案被低估了。想要投票+10。 (2认同)