最近在完成一个从mysql中导出数据到excel中的功能,通过使用smarty已经成功实现了少量数据的导出。但在这里也出现了问题:因为文件的编码缘故,导出的中文出现了乱码现象。查看导出功能页面和所用的XML模板的编码,导出功能页面是ANSI编码,XML模板编码为UTF8。将XML模板编码通过写字板改为ANSI后,在执行导出页面,成功导出excel文件(.xls),但打开时出现问题,excel报错,说表错误。用写字板打开观察代码,发现XML模板正常,中文也没有乱码现象。在观察文件编码,发现为ANSI格式,另存为UTF8格式后,在用excel程序(我的是2007)打开,发现可以正常打开!中文也可以正常表示,无乱码,奇怪。于是尝试将导出功能页面和XML模板的编码格式都该为UTF8格式,在执行导出功能页面,这时服务器弹出警告信息,大意是文件的输出格式已经在模板中定义了。定义在导出功能页面中的“header("Content-type: application/vnd.ms-excel");header("Content-Disposition: attachment; filename=test.xls");”无法执行。观察模板,发现所说的输出格式是“x="urn:schemas-microsoft-com:office:excel"”。将导出功能页面编码格式重新改为ANSI时,该错误消失,格式为UTF8时错误出现。恢复导出功能页面和模板的编码,数据库连接后使用语句“SET NAMES 'UTF8'”,希望用这种方法来达到这样的目的:保证导出excel文件为utf8编码的同时,让mysql输出的数据中的中文不出现乱码,但在实际运行中发现无效。
      求php高手提供解决方案。

解决方案 »

  1.   

    http://download.csdn.net/source/2302195
    这是我上传的一个PHP导出excel表公共类,它经常被使用。乱码问题要注意从数据库,到PHP处理文件,到页面,到浏览器编码要统一才行
      

  2.   

    非常感谢你的帮助,因为我所工作的平台上php版本为4,所以你所提供的类我无法使用,另外,乱码问题的解决我已知道,我想知道的是为什么同样的XML内容,excel2007对ANSI编码报错,而可以正常打开UTF8编码格式。
      

  3.   

    你最好将数据库,xml模板,PHP操作页的编码都设成一致。
    是要将文件编码改了,而不仅仅是加个header(),来设定输出编码
      

  4.   

    3个文件的编码设成一致来进行操作已经做过了。碰到了2个问题:如果编码设成ANSI的话,可以正常导出数据,中文也没有乱码。但是excel2007打开导出的excel文件时报错,说表有错误。用写字板打开这个xml型excel文件,将其另存为utf8编码格式,用excel2007则可以正常打开,数据正常。请问这是为什么?
    另外如果将编码都设成utf8的话,执行导出页面时报错。以下为报错信息:
    Warning: Cannot modify header information - headers already sent by (output started at /webpages/mngwebsite/website/admin_working/cgxmba/mysqltoexcelsmarty.php:1) in /webpages/mngwebsite/website/admin_working/cgxmba/mysqltoexcelsmarty.php on line 71Warning: Cannot modify header information - headers already sent by (output started at /webpages/mngwebsite/website/admin_working/cgxmba/mysqltoexcelsmarty.php:1) in /webpages/mngwebsite/website/admin_working/cgxmba/mysqltoexcelsmarty.php on line 72
     zzy d 2009-10-15T10:53:07Z 2010-05-31T06:22:42Z Microsoft China 12.00 7425 11700 120 120 1 False False *采购合同编号 *合同名称 *委托采购人单位 *委托采购人单位性质 *委托采购人单位级别 *委托采购人所属系统 *采购机构 社会代理机构 *采购方式 *组织形式 组织形式-其他 *采购日期 经办人 备注 采购数量合计 采购预算金额合计 实际采购金额合计 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 531 ��ľ����11-26�����������Թ��У��Ե����� 75474701-2 �Ĵ��޺����������������޹�˾ ����11-26�Թ� lenovo 2010-05-06T00:00:00.000 20 160000 160000 9 600 600 0 2 2 2 2 0 3 1 2 0 3 False False *采购合同编号 *明细序号 *品目 *产地类型 计量单位 产品类别 产品品牌 产品型号 产品属性 重点统计指标 *采购数量 *采购预算资金总计 *采购预算财政性资金 *采购预算其他资金 *实际采购资金总计 *实际采购财政性资金 *实际采购其他资金 国库集中支付 供应商名称 供应商规模 供应商所在区域 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 00000002 1 电脑 nation tai lenovoThinkPad sh1 jieneng 20 160000 100000 60000 160000 100000 60000 160000 dell big beijing 9 600 600 0 2 2 3 3 0 3 1 2 2 0 20 False False 
    /webpages/mngwebsite/website/admin_working/cgxmba/mysqltoexcelsmarty.php:1处语句为:
    <?php
    /webpages/mngwebsite/website/admin_working/cgxmba/mysqltoexcelsmarty.php行71和72处为:
    header("Content-type: application/vnd.ms-excel");
    header("Content-Disposition: attachment; filename=test.xls");
      

  5.   

    你设置为utf-8的编码时,是否也保存了bom头???
      

  6.   

    bom头是什么?怎么查看和设置bom头呢?
      

  7.   

    在dw里ctrl+j - 页面/编码 - 编码-选择unicode utf-8 
    把下面的“包括unicode 签名(BOM)”取消了
      

  8.   

    谢谢。我用ue把导出功能页面另存为不包含BOM头的utf8格式后,可以正常运行导出功能页面。虽然导出功能页面和XML模板的编码已经一致,但是mysql的编码我并不能把它整体变为utf8,因为以前做好的很多功能都是使用的ansi编码的数据库内容。mysql数据编码与页面的不一致,中文乱码问题是肯定会出现的。这样的话我需要将mysql的数据以utf8格式导出,上网查询资料后,加入了mysql_query("SET NAMES 'UTF8'")语句,希望通过这个语句使本次导出的数据为utf8格式。以下为设置部分代码:
    connect_mysql();
    mysql_query("SET NAMES 'UTF8'");
    $query = "select * from cgrecord ";
    $result = mysql_query($query);
    导出数据后,发现并没有实现所想要的结果,中文乱码问题并没有消除,请问有什么方法来解决这个问题呢?期待你的回复。