Hmm...that's weird. Let's take it back a step, though. What happens if you try to write to a "normal" format (i.e. a text file). Something like what you have commented out in your while loop. That might be illuminating as far as whether it's ODBC giving you bad values, or it's Spreadsheet::WriteExcel interpretting them in some odd-ball way.
A third possibility is that you have to format those cells into which you're putting numeric data to actually be numbers. I seem to remember the S::WE module being fairly smart about that, though...
thor
Feel the white light, the light within
Be your own disciple, fan the sparks of will
For all of us waiting, your kingdom will come