首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >PHPExcel如何解决读取文件时的编码问题

PHPExcel如何解决读取文件时的编码问题
EN

Stack Overflow用户
提问于 2018-03-23 17:32:08
回答 2查看 8.8K关注 0票数 5

我正在开发PHP,其中我需要上传一个.csv或.xlsx文件,并使用PHPExcel(现在已被弃用,但我坚持使用它,因为新的PhpSpreadsheet需要PHP5.6或更高版本),并返回数据数组。

这是API函数中使用的代码

代码语言:javascript
复制
public function actionUpload()
{
    $params = $_FILES['uploadFile'];
    if($params)
    {
        $data = array();
        $model = new UploadForm();
        $model->uploadFile = $_FILES['uploadFile'];
        $file =  UploadedFile::getInstanceByname('uploadFile');
        $inputFileName = $model->getpath($file,$data);
        //  Read your Excel workbook
        try
        {
            $inputFileType = \PHPExcel_IOFactory::identify($inputFileName['link']);
            $objReader = \PHPExcel_IOFactory::createReader($inputFileType);
            if($inputFileType == 'CSV')
            {   


                if (mb_check_encoding(file_get_contents($inputFileName['link']), 'UTF-8'))
                {
                    $objReader->setInputEncoding('UTF-8');
                }
                else
                {
                     $objReader->setInputEncoding('Windows-1255');
                     //$objReader->setInputEncoding('ISO-8859-8');
                }


            }
            $objPHPExcel = $objReader->load($inputFileName['link']);
        }
        catch(Exception $e)
        {
            die('Error loading file "'.pathinfo($inputFileName['link'],PATHINFO_BASENAME).'": '.$e->getMessage());
        }

        //  Get worksheet dimensions
        $sheet = $objPHPExcel->getSheet(0); 
        $highestRow = $sheet->getHighestRow(); 
        $highestColumn = $sheet->getHighestColumn();
        $fileData = array();
        //  Loop through each row of the worksheet in turn
        for ($row = 1; $row <= $highestRow; $row++)
        { 
            //  Read a row of data into an array
            $rowData = $sheet->rangeToArray('A' . $row . ':' . $highestColumn . $row,
                                            NULL,
                                            TRUE,
                                            FALSE);
            array_push($fileData,$rowData[0]);
            //  Insert row data array into your database of choice here
        }
        return $fileData;
    }

}

但是当我们上传一个包含希伯来语数据的excel文件时,会出现编码问题。从上面的代码中可以看到,下面的代码用来解决这个问题

代码语言:javascript
复制
if (mb_check_encoding(file_get_contents($inputFileName['link']), 'UTF-8'))
{
    $objReader->setInputEncoding('UTF-8');
}
else
{
        $objReader->setInputEncoding('Windows-1255');

}

后来,我发现UTF-8Windows-1255并不是可能上传的苍蝇的唯一编码,而是其他编码,如UTF-16或其他取决于用户操作系统的编码。除了使用mb_check_encoding之外,还有没有更好的方法来查找编码

在读取文件中的数据的过程中,常见的错误是:

代码语言:javascript
复制
iconv(): Detected an illegal character in input string

正如您所看到的,上述错误是由于无法检测到文件的适当编码而发生的。有什么变通方法吗?

EN

回答 2

Stack Overflow用户

发布于 2018-06-05 06:48:49

您可以尝试使用mb_detect_encoding来检测文件编码,但我发现结果各不相同。您可能需要手动指定自定义的编码匹配顺序才能获得正确的结果。下面是有问题的if语句的替代示例:

代码语言:javascript
复制
if(inputFileType == 'CSV')
{
    // Try to detect file encoding
    $encoding = mb_detect_encoding(file_get_contents($inputFileName['link']),
                     // example of a manual detection order
                    'ASCII,UTF-8,ISO-8859-15');

    $objReader->setInputEncoding($encoding);
}
票数 2
EN

Stack Overflow用户

发布于 2018-04-03 17:01:07

确保第一次清理页面中的输出缓冲区:

代码语言:javascript
复制
ob_end_clean();
header( "Content-type: application/vnd.ms-excel" );
header('Content-Disposition: attachment; filename="uploadFile.xls"');
header("Pragma: no-cache");
header("Expires: 0");
ob_end_clean();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49446342

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档