我使用解析器将xls转换为csv http://code.google.com/p/php-excel-reader/

<?php
set_time_limit(300);
require_once 'excel_reader2.php';
$data = new Spreadsheet_Excel_Reader("file.xls", false, 'UTF-8');

$f = fopen('file.csv', 'w');
for($row = 1; $row <= $data->rowcount(); $row++)
{
    $out = '';
    for($col = 1; $col <= $data->colcount(); $col++)
    {
        $val = $data->val($row,$col);

        // escape " and \ characters inside the cell
        $escaped = preg_replace(array('#”#u', '#\\\\#u', '#[”"]#u'), array('"', '\\\\\\\\', '\"'), $val);
        if(empty($val))
            $out .= ',';
        else
            $out .= '"' . $escaped . '",';
    }
    // remove last comma (,)
    fwrite($f, substr($out, 0, -1));
    fwrite($f, "\n");
}
fclose($f);

?>

由于某些奇怪的原因,它会跳过带有特殊符号(例如°或®)的单元格。如何解决?

最佳答案

utf8_decodehtml_entity_decode对我有效:

<?php
set_time_limit(300);
require_once 'excel_reader2.php';
$data = new Spreadsheet_Excel_Reader("file.xls", false, 'UTF-8');

$f = fopen('file.csv', 'w');
for($row = 1; $row <= $data->rowcount(); $row++)
{
    $out = '';
    for($col = 1; $col <= $data->colcount(); $col++)
    {
        $val = $data->val($row,$col);

        // escape " and \ characters inside the cell
        $escaped = preg_replace(array('#”#u', '#\\\\#u', '#[”"]#u'), array('"', '\\\\\\\\', '\"'), $val);
        $escaped = utf8_decode($escaped);
        //$escaped = html_entity_decode($escaped);
        if(empty($val))
            $out .= ',';
        else
            $out .= '"' . $escaped . '",';
    }
    // remove last comma (,)
    fwrite($f, substr($out, 0, -1));
    fwrite($f, "\n");
}
fclose($f);

?>

输出:
"1","2","3","4","5"
"a","b","c","d","e"
"6","7","°","9","10"
"q","w","e","r","t"
"®","12","13","14","15"
"z","x","c","v","b"

10-08 00:57