I took a look at this for you, and from what I can discern (in attempting to reproduce a similar file with Excel), Excel is producing a UTF-8 with BOM (byte order mark). Thankfully, you should be able to detect this and fairly easily remove it (below is your code above with modifications):
import csv
from StringIO import StringIO
logger = system.util.getLogger("import_recipe_parameters")
file_bytes = event.file.getBytes()
# Check to see if this is UTF-8 with BOM
if bytearray.fromhex("ef bb bf") == bytearray(file_bytes[0:3]):
# Strip first three bytes
file_bytes = file_bytes[3:]
try:
# Read in from file_bytes.tostring() now...
reader = csv.reader(StringIO(file_bytes.tostring()), delimiter=";")
header = reader.next()
converted_data = [[column.replace(',', '.') for column in row] for row in reader]
self.view.custom.table.data = system.dataset.toDataSet(header, converted_data)
except:
import traceback
logger.error("Error: %s" % traceback.format_exc())