Extracting tuples from Excel sheet
You are doing the same thing in case of failure at any stage - returning an empty list.  You should use a for comprehension to chain these stages; if any one stage returns None, then the other stages will not be followed.  If you do something like this:

  for {
    wb &lt;- workbook;
    sheet &lt;- Option(wb.getSheetAt(0));
    titleRow &lt;- Option(sheet.getRow(0));
    titleCell &lt;- Option(titleRow.getCell(0)) if titleCell.getStringCellValue == "title";
    priceCell &lt;- Option(titleRow.getCell(1)) if priceCell.getStringCellValue == "price";
  } yield { sheet.get.tail.map{r =&gt; (r.getCell(0).getStringCellValue, r.getCell(1).getNumericCellValue)}.toList
  }


This will return Option[List[(String, Double)]], containing either a real list or None.  If any of those stages returns None, the following stages will not be executed and you just get your None back early.  You can pattern match against this output to return the contents of Some(list) or List() if the output is None. 

Note: I took the annotated val list out of there, so you would either need to have specified the return type for a val to which you assign the output of the for comprehension or put it back into the yield block.

Note how I turned your if...else expression into guards.  Can you see just how much simpler the code is and how each conditional is paired with the appropriate object? Particularly since the else was just returning another empty list.  This way, it fails and returns None.

"for comprehensions" can be overused in Scala, but this really is where they shine.  You correctly chose Option, but possibly the best thing about Option for any Java coder is the way it can remove boilerplate and defensive coding.  Your code still has the defensive coding, while the for comprehension just throws all that away. Learn to be free ;)