基于php导出到Excel或CSV的详解(附utf8、gbk 编码转换)


Posted in PHP onJune 25, 2013

php导入到excel乱码是因为utf8编码在xp系统不支持所有utf8编码转码一下就完美解决了
utf-8编码案例
Php代码

<?php 
header("Content-Type: application/vnd.ms-excel; charset=UTF-8"); 
header("Pragma: public"); 
header("Expires: 0"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header("Content-Type: application/force-download"); 
header("Content-Type: application/octet-stream"); 
header("Content-Type: application/download"); 
header("Content-Disposition: attachment;filename=11.xls "); 
header("Content-Transfer-Encoding: binary "); 
?> 

Php代码
<?    
$filename="php导入到excel-utf-8编码";    
$filename=iconv("utf-8", "gb2312", $filename);    
echo $filename;    
?>  

gbk编码案例
Php代码
<?php 
header("Content-Type: application/vnd.ms-excel; charset=UTF-8"); 
header("Pragma: public"); 
header("Expires: 0"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header("Content-Type: application/force-download"); 
header("Content-Type: application/octet-stream"); 
header("Content-Type: application/download"); 
header("Content-Disposition: attachment;filename=11.xls "); 
header("Content-Transfer-Encoding: binary "); 
?> 

Php代码
0.<?    
0.$filename="php导入到excel-utf-8编码";    
0.echo $filename;    
0.?>  

访问网站的时候就下载到excel里面
要弄单元格区别的话
用table表格做网页的就可以了
====================== 其他方法 =============================
1、制作简单 Excel
0.<?php   
0.header("Content-type:application/vnd.ms-excel");   
0.header("Content-Disposition:filename=php2excel.xls");   
0.  
0.echo "A1/t B1/t C1/n";   
0.echo "A2/t B2/t C2/n";   
0.echo "A3/t B3/t C3/n";   
0.echo "A4/t B4/t C4/n";   
0.?> 

2、制作简单 CSV 
<?php
$action =$_GET['action'];
if ($action=='make'){
 $fp = fopen("demo_csv.csv","a"); //打开csv文件,如果不存在则创建
 $title = array("First_Name","Last_Name","Contact_Email","Telephone"); //第一行数据
 $data_1 = array("42343","423432","4234","4234"); 
 $data_2 = array("4234","Last_Name","Contact_Email","Telephone"); 
 $title = implode(",",$title); //用 ' 分割成字符串
 $data_1 = implode(",",$data_1); // 用 ' 分割成字符串
 $data_2 = implode(",",$data_2); // 用 ' 分割成字符串
 $data_str =$title."/r/n".$data_1."/r/n".$data_2."/r/n"; //加入换行符
 fwrite($fp,$data_str); // 写入数据
 fclose($fp); //关闭文件句柄
 echo "生成成功";
}
echo "<br>";
echo "<a href='?action=make'>生成csv文件</a>";
?>

也可以做一个封闭函数:
封闭函数一:
function exportToCsv($csv_data, $filename = 'export.csv') {
    $csv_terminated = "/n";
    $csv_separator = ",";
    $csv_enclosed = '"';
    $csv_escaped = "//";
    // Gets the data from the database
    $schema_insert = '';
    $out = '';
    // Format the data
    foreach ($csv_data as $row)
    {
        $schema_insert = '';
        $fields_cnt = count($row);
        //printr($row);
        $tmp_str = '';
        foreach($row as $v)
        {
            $tmp_str .= $csv_enclosed.str_replace($csv_enclosed, $csv_escaped . $csv_enclosed, $v).$csv_enclosed.$csv_separator;
        } // end for        $tmp_str = substr($tmp_str, 0, -1);
        $schema_insert .= $tmp_str;
        $out .= $schema_insert;
        $out .= $csv_terminated;
    } // end while
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Content-Length: " . strlen($out));
    header("Content-type: text/x-csv");
    header("Content-Disposition:filename=$filename");
    echo $out;
}
/*
$csv_data = array(array('Name', 'Address'));
array_push($csv_data, array($row['name'],$row['address']));
...
exportToCsv($csv_data,'new_file.csv');
*/

封闭函数二:
<?
/**
 * Simple class to properly output CSV data to clients. PHP 5 has a built
 * in method to do the same for writing to files (fputcsv()), but many times
 * going right to the client is beneficial.
 *
 * @author Jon Gales
 */
class CSV_Writer {
    public $data = array();
    public $deliminator;
    /**
     * Loads data and optionally a deliminator. Data is assumed to be an array
     * of associative arrays.
     *
     * @param array $data
     * @param string $deliminator
     */
    function __construct($data, $deliminator = ",")
    {
        if (!is_array($data))
        {
            throw new Exception('CSV_Writer only accepts data as arrays');
        }
        $this->data = $data;
        $this->deliminator = $deliminator;
    }
    private function wrap_with_quotes($data)
    {
        $data = preg_replace('/"(.+)"/', '""$1""', $data);
        return sprintf('"%s"', $data);
    }
    /**
     * Echos the escaped CSV file with chosen delimeter
     *
     * @return void
     */
    public function output()
    {
        foreach ($this->data as $row)
        {
            $quoted_data = array_map(array('CSV_Writer', 'wrap_with_quotes'), $row);
            echo sprintf("%s/n", implode($this->deliminator, $quoted_data));
        }
    }
    /**
     * Sets proper Content-Type header and attachment for the CSV outpu
     *
     * @param string $name
     * @return void
     */
    public function headers($name)
    {
        header('Content-Type: application/csv');
        header("Content-disposition: attachment; filename={$name}.csv");
    }
}
/*
//$data = array(array("one","two","three"), array(4,5,6));
$data[] = array("one","two","three");
$data[] = array(4,5,6);
$csv = new CSV_Writer($data);
$csv->headers('test');
$csv->output();
*/

3. 使用excel类
<?php
require_once 'Spreadsheet/Writer.php';
$workbook = new Spreadsheet_Excel_Writer();
/* 生成 CSV
$filename = date('YmdHis').'.csv';
$workbook->send($filename); // 发送 Excel 文件名供下载
*/
// 生成 Excel
$filename = date('YmdHis').'.xls';
$workbook->send($filename); // 发送 Excel 文件名供下载
$workbook->setVersion(8);
$workbook->setBIFF8InputEncoding('UTF-8');
$worksheet =& $workbook->addWorksheet("Sheet-1");
$data[]= array('id','username','company','email','mob','daytime','intent');
$data[] = array(1,'老梁','**工作室','3water.com','1363137966*',time(),'y');
$total_row = count($data);
$total_col = count($data[0]);
for ($row = 0; $row < $total_row; $row ++) {
   for ($col = 0; $col < $total_col; $col ++) {
  $worksheet->writeString($row, $col, $data[$row][$col]); // 在 sheet-1 中写入数据
   }
}
/*
$worksheet =& $workbook->addWorksheet("Sheet-2");
$data[]= array('id','username','company','email','mob','daytime','intent');
$data[] = array(1,'老梁','**工作室','3water.com','1363137966*',time(),'y');
$total_row = count($data);
$total_col = count($data[0]);
for ($row = 0; $row < $total_row; $row ++) {
   for ($col = 0; $col < $total_col; $col ++) {
  $worksheet->writeString($row, $col, $data[$row][$col]); // 在 sheet-2 中写入数据
   }
}
*/
$workbook->close(); // 完成下载
?>

类二
-----函数说明
读取Excel文件
function Read_Excel_File($ExcelFile,$Result)
$ExcelFile    Excel文件名
$Result        返回的结果
函数返回值    正常返回0,否则返回错误信息
返回的值数组
$result[sheet名][行][列] 的值为相应Excel Cell的值

建立Excel文件   
function Create_Excel_File($ExcelFile,$Data)
$ExcelFile    Excel文件名
$Data        Excel表格数据
请把函数写在PHP脚本的开头 
例1:

<?
require "excel_class.php";
Read_Excel_File("Book1.xls",$return);
for ($i=0;$i<count($return[Sheet1]);$i++)
{
    for ($j=0;$j<count($return[Sheet1][$i]);$j++)
    {
        echo $return[Sheet1][$i][$j]."|";
    }
    echo "<br>";
}
?>

例2:
<?
require "excel_class.php";
Read_Excel_File("Book1.xls",$return);
Create_Excel_File("ddd.xls",$return[Sheet1]);
?>

PHP 相关文章推荐
一个简单实现多条件查询的例子
Oct 09 PHP
php escape URL编码
Dec 10 PHP
PHP array_multisort() 函数的深入解析
Jun 20 PHP
php仿QQ验证码的实例分析
Jul 01 PHP
PHP错误Cannot use object of type stdClass as array in错误的解决办法
Jun 12 PHP
php生成百度sitemap站点地图类函数实例
Oct 17 PHP
php 流程控制switch的简单实例
Jun 07 PHP
PHP处理二进制数据的实现方法
Jun 13 PHP
总结PHP如何获取当前主机、域名、网址、路径、端口和参数等
Sep 09 PHP
PHP递归删除多维数组中的某个值
Apr 17 PHP
PHP SPL 被遗落的宝石【SPL应用浅析】
Apr 20 PHP
redis+php实现微博(二)发布与关注功能详解
Sep 23 PHP
执行、获取远程代码返回:file_get_contents 超时处理的问题详解
Jun 25 #PHP
PHP 冒泡排序 二分查找 顺序查找 二维数组排序算法函数的详解
Jun 25 #PHP
使用php判断网页是否gzip压缩
Jun 25 #PHP
解析PHP中的file_get_contents获取远程页面乱码的问题
Jun 25 #PHP
深入file_get_contents函数抓取内容失败的原因分析
Jun 25 #PHP
提升PHP性能的21种方法介绍
Jun 25 #PHP
解析如何通过PHP函数获取当前运行的环境 来进行判断执行逻辑(小技巧)
Jun 25 #PHP
You might like
Protoss兵种对照表
2020/03/14 星际争霸
php下目前为目最全的CURL中文说明
2010/08/01 PHP
PHP中使用sleep函数实现定时任务实例分享
2014/08/21 PHP
php中try catch捕获异常实例详解
2014/11/21 PHP
DOM基础及php读取xml内容操作的方法
2015/01/23 PHP
PHP+ajax分页实例简析
2015/12/07 PHP
Symfony核心类概述
2016/03/17 PHP
php版微信公众号自定义分享内容实现方法
2016/09/22 PHP
jquery ajax提交表单数据的两种实现方法
2010/04/29 Javascript
jQuery EasyUI API 中文文档 - PropertyGrid属性表格
2011/11/18 Javascript
JQuery 常用方法和事件详细介绍
2013/04/18 Javascript
使用jQuery实现星级评分代码分享
2014/12/09 Javascript
了不起的node.js读书笔记之mongodb数据库交互
2014/12/22 Javascript
深入JavaScript高级程序设计之对象、数组(栈方法,队列方法,重排序方法,迭代方法)
2015/12/01 Javascript
基于EasyUI的基础之上实现树形功能菜单
2017/06/28 Javascript
详解使用mpvue开发github小程序总结
2018/07/25 Javascript
vue组件实践之可搜索下拉框功能
2018/11/25 Javascript
[01:55]TI9显影之尘系列 - Evil Geniuses
2019/08/22 DOTA
python中bisect模块用法实例
2014/09/25 Python
Python实现删除Android工程中的冗余字符串
2015/01/19 Python
从零开始学Python第八周:详解网络编程基础(socket)
2016/12/14 Python
Python实现excel转sqlite的方法
2017/07/17 Python
django框架自定义模板标签(template tag)操作示例
2019/06/24 Python
python爬虫 批量下载zabbix文档代码实例
2019/08/21 Python
python实现将字符串中的数字提取出来然后求和
2020/04/02 Python
中专毕业自我鉴定
2013/10/16 职场文书
文秘专业毕业生就业推荐信
2013/11/08 职场文书
残疾人创业典型事迹
2014/02/01 职场文书
一月红领巾广播稿
2014/02/11 职场文书
信息技术课后反思
2014/04/27 职场文书
化工工艺设计求职信
2014/06/25 职场文书
村委会贫困证明范本
2014/09/17 职场文书
婚礼答谢礼品
2015/01/20 职场文书
企业内部管理控制:采购授权审批制度范本
2020/01/19 职场文书
html+css实现文字折叠特效实例
2021/06/02 HTML / CSS
详解JAVA的控制语句
2021/11/11 Java/Android