php pack不支持中文,php pack导出数据倒excel表中文乱码问题

需要用php将数据导出倒excel表中,用的是php的pack函数将字符打包成二进制,然后写入Excel表格文件,英文字符导入正常,现在中文字符全部乱码了,不知道哪里设置的问题呢?

title = $title;

$this->col = 0;

$this->row = 0;

$this->data = '';

$this->bofMarker();

}

/**

* Transmits the proper headers to cause a download to occur and to identify the file properly

* @return nothing

*/

function headers() {

header("Content-Type: application/force-download");

header("Content-Type: application/octet-stream");

header("Content-Type: application/download");

header("Content-Type: application/vnd.ms-excel; charset=iso-8859-1");

header("Content-Disposition: attachment;filename=" . Excel::filename($this->title) . ".xls ");

header("Content-Transfer-Encoding: binary ");

}

function send() {

$this->eofMarker();

// $this->headers();

echo $this->data;

}

/**

* Writes the Excel Beginning of File marker

* @see pack()

* @return nothing

*/

private function bofMarker() {

$this->data .= pack("ssssss", 0x809, 0x8, 0x0, 0x10, 0x0, 0x0);

}

/**

* Writes the Excel End of File marker

* @see pack()

* @return nothing

*/

private function eofMarker() {

$this->data .= pack("ss", 0x0A, 0x00);

}

/**

* Moves internal cursor left by the amount specified

* @param optional integer $amount The amount to move left by, defaults to 1

* @return integer The current column after the move

*/

function left($amount = 1) {

$this->col -= $amount;

if($this->col < 0) {

$this->col = 0;

}

return $this->col;

}

/**

* Moves internal cursor right by the amount specified

* @param optional integer $amount The amount to move right by, defaults to 1

* @return integer The current column after the move

*/

function right($amount = 1) {

$this->col += $amount;

return $this->col;

}

/**

* Moves internal cursor up by amount

* @param optional integer $amount The amount to move up by, defaults to 1

* @return integer The current row after the move

*/

function up($amount = 1) {

$this->row -= $amount;

if($this->row < 0) {

$this->row = 0;

}

return $this->row;

}

/**

* Moves internal cursor down by amount

* @param optional integer $amount The amount to move down by, defaults to 1

* @return integer The current row after the move

*/

function down($amount = 1) {

$this->row += $amount;

return $this->row;

}

/**

* Moves internal cursor to the top of the page, row = 0

* @return nothing

*/

function top() {

$this->row = 0;

}

/**

* Moves internal cursor all the way left, col = 0

* @return nothing

*/

function home() {

$this->col = 0;

}

/**

* Writes a number to the Excel Spreadsheet

* @see pack()

* @param integer $value The value to write out

* @return nothing

*/

function number($value) {

$this->data .= pack("sssss", 0x203, 14, $this->row, $this->col, 0x0);

$this->data .= pack("d", $value);

}

/**

* Writes a string (or label) to the Excel Spreadsheet

* @see pack()

* @param string $value The value to write out

* @return nothing

*/

function label($value) {

$length = strlen($value);

// ob_iconv_handler()

// $value = iconv('UTF-8','gbk',$value);

// file_put_contents('a.txt', 'test: '.)

$this->data .= pack("ssssss", 0x204, 8 + $length, $this->row, $this->col, 0x0, $length);

$this->data .= $value;

}

}

下面是我的调用测试代码:

$value) {

$xls->home();

foreach ($value as $row) {

// $xls->home();

$xls->label($row);

$xls->right();

// $xls->label($row);

}

$xls->down();

}

ob_start();

$xls->send();

$data = ob_get_clean();

file_put_contents(__DIR__ .'/report.xls', $data);

回复内容:

需要用php将数据导出倒excel表中,用的是php的pack函数将字符打包成二进制,然后写入Excel表格文件,英文字符导入正常,现在中文字符全部乱码了,不知道哪里设置的问题呢?

title = $title;

$this->col = 0;

$this->row = 0;

$this->data = '';

$this->bofMarker();

}

/**

* Transmits the proper headers to cause a download to occur and to identify the file properly

* @return nothing

*/

function headers() {

header("Content-Type: application/force-download");

header("Content-Type: application/octet-stream");

header("Content-Type: application/download");

header("Content-Type: application/vnd.ms-excel; charset=iso-8859-1");

header("Content-Disposition: attachment;filename=" . Excel::filename($this->title) . ".xls ");

header("Content-Transfer-Encoding: binary ");

}

function send() {

$this->eofMarker();

// $this->headers();

echo $this->data;

}

/**

* Writes the Excel Beginning of File marker

* @see pack()

* @return nothing

*/

private function bofMarker() {

$this->data .= pack("ssssss", 0x809, 0x8, 0x0, 0x10, 0x0, 0x0);

}

/**

* Writes the Excel End of File marker

* @see pack()

* @return nothing

*/

private function eofMarker() {

$this->data .= pack("ss", 0x0A, 0x00);

}

/**

* Moves internal cursor left by the amount specified

* @param optional integer $amount The amount to move left by, defaults to 1

* @return integer The current column after the move

*/

function left($amount = 1) {

$this->col -= $amount;

if($this->col < 0) {

$this->col = 0;

}

return $this->col;

}

/**

* Moves internal cursor right by the amount specified

* @param optional integer $amount The amount to move right by, defaults to 1

* @return integer The current column after the move

*/

function right($amount = 1) {

$this->col += $amount;

return $this->col;

}

/**

* Moves internal cursor up by amount

* @param optional integer $amount The amount to move up by, defaults to 1

* @return integer The current row after the move

*/

function up($amount = 1) {

$this->row -= $amount;

if($this->row < 0) {

$this->row = 0;

}

return $this->row;

}

/**

* Moves internal cursor down by amount

* @param optional integer $amount The amount to move down by, defaults to 1

* @return integer The current row after the move

*/

function down($amount = 1) {

$this->row += $amount;

return $this->row;

}

/**

* Moves internal cursor to the top of the page, row = 0

* @return nothing

*/

function top() {

$this->row = 0;

}

/**

* Moves internal cursor all the way left, col = 0

* @return nothing

*/

function home() {

$this->col = 0;

}

/**

* Writes a number to the Excel Spreadsheet

* @see pack()

* @param integer $value The value to write out

* @return nothing

*/

function number($value) {

$this->data .= pack("sssss", 0x203, 14, $this->row, $this->col, 0x0);

$this->data .= pack("d", $value);

}

/**

* Writes a string (or label) to the Excel Spreadsheet

* @see pack()

* @param string $value The value to write out

* @return nothing

*/

function label($value) {

$length = strlen($value);

// ob_iconv_handler()

// $value = iconv('UTF-8','gbk',$value);

// file_put_contents('a.txt', 'test: '.)

$this->data .= pack("ssssss", 0x204, 8 + $length, $this->row, $this->col, 0x0, $length);

$this->data .= $value;

}

}

下面是我的调用测试代码:

$value) {

$xls->home();

foreach ($value as $row) {

// $xls->home();

$xls->label($row);

$xls->right();

// $xls->label($row);

}

$xls->down();

}

ob_start();

$xls->send();

$data = ob_get_clean();

file_put_contents(__DIR__ .'/report.xls', $data);

你中文是什么编码的啊?Excel默认是GB2312的。如果UTF-8就乱码了。

解决办法:要么转成GB2312再写进去。

要么在最后先输出BOM头

ob_start();

$xls->send();

$data = "\xEF\xBB\xBF" . ob_get_clean();

file_put_contents(__DIR__ .'/report.xls', $data);

相关标签:php

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值