在php中用phpword库生成word文档的时候,会出现乱码,我在网上查找过很多这方面的资料,按照上面的步骤,修改了template.php中的
public function setValue($search, $replace) {
if(substr($search, 0, 2) !== '${' && substr($search, -1) !== '}') {
$search = '${'.$search.'}';
}
if(!is_array($replace)) {
// $replace = utf8_encode($replace);
$replace =iconv('gbk', 'utf-8', $replace);
}
把里面 的 utf8_encode 换成 iconv('gbk','utf-8',$replace);也对文本进行了转码,在从数据库读取出的数据也转码了,写入word文档中的时候还是转码了,可是在生成word的时候中文变成了乱码,转码的时候都是从gbk转成utf-8。
请各位大侠帮小弟支两招,谢谢啊。
public function setValue($search, $replace) {
if(substr($search, 0, 2) !== '${' && substr($search, -1) !== '}') {
$search = '${'.$search.'}';
}
if(!is_array($replace)) {
// $replace = utf8_encode($replace);
$replace =iconv('gbk', 'utf-8', $replace);
}
把里面 的 utf8_encode 换成 iconv('gbk','utf-8',$replace);也对文本进行了转码,在从数据库读取出的数据也转码了,写入word文档中的时候还是转码了,可是在生成word的时候中文变成了乱码,转码的时候都是从gbk转成utf-8。
请各位大侠帮小弟支两招,谢谢啊。
$table->addCell(1000, $styleCell)->addText('站码', $fontStyle);
$table->addCell(1000, $styleCell)->addText(iconv('utf-8','gbk','站名'), $fontStyle);
$table->addCell(1000, $styleCell)->addText('河系', $fontStyle);
$table->addCell(2500, $styleCell)->addText('来报时间', $fontStyle);
$table->addCell(1000, $styleCell)->addText('水位', $fontStyle);
$table->addCell(1000, $styleCell)->addText('水势', $fontStyle);
$conn = mssql_connect($config['mssql']['host'],$config['mssql']['user'],$config['mssql']['password']);
mssql_select_db($config['mssql']['dbname'],$conn);
$sql = "exec HNow05_getZZSpace '','".$tm."','',1";
//$sql=mb_convert_encoding($sql,'UTF-8','GBK');
$res=mssql_query($sql);
while($arr = mssql_fetch_array($res)){
$table->addRow();
$table->addCell(1000)->addText(iconv('gbk','utf-8',$arr["STCD"]));
$table->addCell(1000)->addText(iconv('utf-8','gbk',$arr["STNM"]));
$table->addCell(1000)->addText($arr["RVNM"]);
$table->addCell(2500)->addText(iconv('gbk','utf-8',$arr["TM"]));
$table->addCell(1000)->addText(iconv('gbk','utf-8',$arr["Z"]));
//$table->addCell(1000)->addText(iconv('gbk','utf-8',$arr["WPTN"]));
if($arr["WPTN"] == 6){
$table->addCell(1000)->addText(iconv('utf-8','gbk','平'));
}else if($arr["WPTN"] == 5){
$table->addCell(1000)->addText(iconv('gbk','utf-8','涨'));
}else if($arr["WPTN"] == 4){
$table->addCell(1000)->addText(iconv('gbk','utf-8','落'));
}
}
}
addText的时候是否会调用setValue方法呢?
字符串--数组 如果用的是gbk的话 就得把字符串转换成数组 // 造成乱码的原因是 gbk 在转换的时候 数据类型的转换:字符--数组 所以 出现了乱码
foreach($orders as $key1 => $order)
{
$orders[$key1]['order_goods'] = '';
if($orders[$key1]['add_time'])
{$orders[$key1]['add_time'] = date('Y-m-d H:i:s', $orders[$key1]['add_time']);}
if($orders[$key1]['pay_time'])
{$orders[$key1]['pay_time'] = date('Y-m-d H:i:s', $orders[$key1]['pay_time']);}
if($orders[$key1]['ship_time'])
{$orders[$key1]['ship_time'] = date('Y-m-d H:i:s', $orders[$key1]['ship_time']);}
if($orders[$key1]['finished_time'])
{$orders[$key1]['finished_time'] = date('Y-m-d H:i:s', $orders[$key1]['finished_time']);}
if($orders[$key1]['evaluation_time'])
{$orders[$key1]['evaluation_time'] = date('Y-m-d H:i:s', $orders[$key1]['evaluation_time']);}
}本来在数据库里字段是字符串,但 导出数据时若是以gbk方式导出的话 就得转换数据类型。
若是 utf-8 就不需要了。
iconv('utf-8','gb2312',$text);
然后添加到你的word文档中。或者,有时候出现乱码的原因是由于ob缓冲区的原因,在写入word文档之前加上ob_clean()试试。。
ob_clean()也试过,没反应
把utf8_encode哪一行改为$replace=iconv('gbk','utf-8',$replace);
之后就可以输出中文了,而且没有乱码。你的数据库是utf-8格式编码的。可以这样:
1.如果你的程序也是utf-8格式的话,建议把$replace=iconv('gbk','utf-8',$replace);也注释掉,这样不用转码。2。如果你的程序时gbk编码,你从数据库取出来需要先iconv('utf-8','gbk',$value);同时template。php中的$replace=iconv('gbk','utf-8',$replace);需要加上。试一试吧。祝你好运
数据库的的编码也改了,然后自己看看是不是乱码。数据库读取编码方式要在连接之前设置。
。
如果你这么干了,一般来说就不会乱码了。如果还是乱码只能说明还有页面你么有改过来,或者失败了。
不要怕烦,我也在这上面烦过很久。
找到 Section.php 的 addText 函数, 将
$givenText = utf8_encode($text);
改成
$givenText = iconv('gbk', 'utf-8', $text);
然后 section->addText (iconv('utf-8', 'gbk', 'your string') 就可以了,相当于先转换成 gbk 再转换成 utf-8。
说明:PHP 文件已经是 utf-8 编码了,不知道要这样转才可以
受到楼上的启发,做了一下修改,就成功了。
大致归纳了一下:
1.phpword 有个模板功能,template.php这个文件
按照楼主说的,
public function setValue($search, $replace) {
if(substr($search, 0, 2) !== '${' && substr($search, -1) !== '}') {
$search = '${'.$search.'}';
}
if(!is_array($replace)) {
// $replace = utf8_encode($replace);
$replace =iconv('gbk', 'utf-8', $replace);
}
把里面 的 utf8_encode 换成 iconv('gbk','utf-8',$replace);
在使用模板中替换变量成中文的时候,就可以解决乱码问题2.phpword中有个表格功能
要在添加表格值得时候输入中文:
$table->addCell(1000, $styleCell)->addText('站码', $fontStyle);
就需要去修改文件:PHPWord\Section\Table\Cell.php中的addText()方法
public function addText($text, $styleFont = null, $styleParagraph = null) {
//$text = utf8_encode($text);
$text = new PHPWord_Section_Text($text, $styleFont, $styleParagraph);
$this->_elementCollection[] = $text;
return $text;
}
把这行$text = utf8_encode($text);注释掉就可以了
还有直接需要加入中文文本的,就按照楼上说的。总结来下就是,phpword在添加内容,或者替换内容的方法中,基本都对输入的字符串做了utf8_encode处理。
如果输入的编码是ISO-8859-1的字符集,就不用做任何修改,如果是其他的字符集,就需要把这句语句用iconv函数替换掉,把字符集改成utf8理论上来说,你可以再输入的时候,直接把字符集改成ISO-8859-1,这样就不需要去动后台的phpword的代码了。