【问题标题】:Reading Excel file with Scala使用 Scala 读取 Excel 文件
【发布时间】: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("")

【问题讨论】:

标签: scala testing automation apache-poi


【解决方案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。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-07
  • 1970-01-01
  • 2012-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多