首页 新闻 会员 周边 捐助

使用phpexcel导入excel表格数据到MYSQL,乱码怎么解决?

0
悬赏园豆:140 [已解决问题] 解决于 2014-09-03 00:14

1、用phpexcel读取excel的数据,显示在网页的同时存入数据库;

读取数据,添加MYSQL:

include('conn.php');
require_once 'PHPExcel.php';
require_once 'PHPExcel/IOFactory.php';
$reader = PHPExcel_IOFactory::createReader('Excel5');
//$reader = PHPExcel_IOFactory::createReader('Excel2007'); // 查\Classes\PHPExcel\Reader
//$resource = 'upload/201405-cda.xlsx';
$resource = 'upload/201405-cda.xls';
if (!file_exists($resource)) {
  exit("$resource is not exists.\n");
}

$PHPExcel = $reader->load($resource); // 文件名称
$sheet = $PHPExcel->getSheet(0); // 读取第一个工作表从0读起
$highestRow = $sheet->getHighestRow(); // 取得总行数
$highestColumn = $sheet->getHighestColumn(); // 取得总列数,不过是最大列的字母
$highestColumn = PHPExcel_Cell::columnIndexFromString($highestColumn); // 转换字母为对应的统计数字;
// getCellByColumnAndRow(0,1),第一列为0,第一行为1;
echo $highestRow . "、" . $highestColumn . "、" . $sheet->getCellByColumnAndRow(0, 1)->getCalculatedValue() . "(数量统计结束,换行)<br />";
// 每次读取一行,再在行中循环每列的数值
$excelArray = array();
for ($row = 1; $row <= $highestRow; $row++) {
    $val = $sheet->getCellByColumnAndRow(0, $row)->getCalculatedValue();
    if ($val == "") return;

    for ($column = 0; $column < $highestColumn; $column++) {
        
        $isDate = 0;
        $isDate = PHPExcel_Shared_Date::isDateTime($sheet->getCellByColumnAndRow($column, $row));
        if ($isDate > 0)
        {
            $val = PHPExcel_Shared_Date::ExcelToPHPObject($sheet->getCellByColumnAndRow($column, $row)->getCalculatedValue())->format('Y/m/d');
        }else {
            $val = $sheet->getCellByColumnAndRow($column, $row)->getCalculatedValue();
        }
        $excelArray[$row][] = $val;
        echo "<strong>" . $column . ")" . $val . "</strong>";
        echo "<br />";
    }
    echo "<br />已读完第<strong>" . $row . "</strong>行数据:" . $excelArray[$row][3] . "<hr>";
    //在这儿使用SQL语句,取$excelArray[$row][3]、$excelArray[$row][4]、$excelArray[$row][5]存入数据库对应字段
    $tmpDepartment = $excelArray[$row][1];
    $tmpName = $excelArray[$row][2];
    $sql="insert into mywage (fdepartment,fname) values ('$tmpDepartment','$tmpName')";
    //mysql_query("set names 'UTF-8'");
    if (@mysql_query($sql))
    {
        echo "添加数据记录:" . $excelArray[$row][2] . "成功";
    }else {
        echo "tmpName - > ". $tmpName;
        echo "失败";
    }
}

后面MYSQL查看数据记录:

2、在上传文件的页面读取存入的数据记录,并显示在网页上;

<?php
$sql="select * from mywage where fname = '张三' and fdepartment <> ''";
$li_site=mysql_fetch_array(mysql_query($sql));
$cknum=mysql_num_rows(@mysql_query($sql));
if ($cknum > 0)
{
    echo "oh, my god";
}else {
    echo "wa o, guai guai";
}
echo "上传文件大小限制:" . ini_get('upload_max_filesize');
?>
<strong><?php echo $li_site['fdepartment'] . "、" . $li_site['fname']; ?></strong>

上面是查询出来的结果。

这是数据库的相关信息:

问题是:在MYSQL后台管理查看到的中文数据全是乱码,我自己的php文件是UTF-8编码,MYSQL数据库表、字段的整理是:utf8_unicode_ci,这个该怎么解决,才能在PHPMYADMIN后台看见正常显示的中文数据?

主要是心里不踏实,因为内容能正常查询和条件判断,但是毕竟布署在生产环境 ,担心出问题。

sfrost的主页 sfrost | 初学一级 | 园豆:9
提问于:2014-05-14 09:17
< >
分享
最佳答案
1

统一三码:

1、php文件使用UTF-8编码。

2、header("Content-Type:text/html;charset=utf-8");

     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

3、mysql字符集使用utf8,程序增删查改前都需要set names 'UTF-8',建议写在db类的构造函数里面。

 

针对LZ从EXCEL导入的出现乱码问题,还需要加一条:

含有中文字符的单元格的值需要转换编码,$s = iconv('GBK', 'UTF-8', $s);

iconv比mb_convert_encoding效率高,一般情况下用前者就够了。

收获园豆:140
小伍2013 | 小虾三级 |园豆:1291 | 2014-05-15 08:44
<?php
header("Content-Type:text/html;charset=utf-8");
if ($_FILES["file"]["error"] > 0)
{
    echo "错误: " . $_FILES["file"]["error"] . "<br />";
}else {
    echo "文件名: " . $_FILES["file"]["name"] . "<br />";
    echo "类型: " . $_FILES["file"]["type"] . "<br />";
    echo "大小: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />"; 

    if (file_exists("upload/" . $_FILES["file"]["name"]))
    {
        echo $_FILES["file"]["name"] . " 文件已经存在. ";
    }else {
        move_uploaded_file($_FILES["file"]["tmp_name"],
        "upload/" . $_FILES["file"]["name"]);
        echo "文件已经被存储到: " . "upload/" . $_FILES["file"]["name"];
        echo "文件传输完成,下面开始读取记录……";
    } 
}
echo "<hr>";

其实在这个文件的前面,是加了设置头部编码的,我的php文件编码也肯定是UTF-8,而也根据你的建议,增加了导入时的编码处理:

    $tmpDepartment = iconv('GBK','UTF-8',$excelArray[$row][1]);
    $tmpName = iconv('GBK','UTF-8',$excelArray[$row][2]);
    $sql="insert into mywage (fdepartment,fname) values ('$tmpDepartment','$tmpName')";
    mysql_query("set names 'UTF-8'");
    if (@mysql_query($sql))
    {
        echo "添加数据记录:" . $excelArray[$row][2] . "成功";

不过结果不太理想,仍然是原来的问题,phpMyadmin中查看到的还是乱码。

sfrost | 园豆:9 (初学一级) | 2014-05-16 09:46

@sfrost: 

mysql_query("set names 'UTF-8'");
$sql="insert into mywage (fdepartment,fname) values ('$tmpDepartment','$tmpName')"; 
小伍2013 | 园豆:1291 (小虾三级) | 2014-05-18 11:11
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册