web页面中导出Excel (方法六) 后端php导出CSV

使用后端 php 来实现导出Excel

优点:兼容 所有 PHP 版本。超快,适合大数据量。Excel 能直接打开。 如果不需要复杂格式,CSV 是最轻量的方案。

缺点: 导出的不是Excel格式 。 不支持复杂格式(颜色、公式等)

html

<a href='javascript:void(0)' class='easyui-linkbutton' iconCls='icon-excel' plain='true' onclick='ToExcel()' <{$ToExcel_disabled}> >导出</a> 

js

function ToExcel(){
       var where="";
       var order="";
       var query=Select_Parameter();// 查询条件
       var url='Ajax-index.php?module=<{$module_name}>&action=Ajax_GridView_Select&assigned_user_id=<{$assigned_user_id}>&start_time=<{$start_date}>&stop_time=<{$stop_date}>';         
       /* 获取 where 条件 */
        $.ajax({
                  url: url,
                  type: "post",
                  data: query,
                  dataType: "json",
                  success: function (data) {
                      //alert(data.where); alert(data.total);
                      where=data.where;//将条件 传出
                      order=data.order;//排序
                      //alert(where);
                      if(where==""){
                            $.messager.alert('消息','没有要导出的数据,请点击查询,再试! ','info');
                            return;
                      }
                      location.href=encodeURI('modules/<{$module_name}>/ToExcel_CSV.php?where='+where +"&order=" +order);
                  }
         }); 
    }

重点在这句上,其它的是为了获取查询条件

location.href=encodeURI('modules/<{$module_name}>/ToExcel_CSV.php?where='+where +"&order=" +order);

ToExcel_CSV.php

<?php
error_reporting(E_ALL^E_NOTICE);//Notice不显示 ^E_DEPRECATED
set_time_limit(0);//不设 php 超时限制

require_once('../../config.php'); 
require_once('../../Log/LogHelper2.php');
require_once('../../myClass/myDBHelper2.php'); 
 
    $table_name='woke_order_repair';  
    $arr_result = array(); //返回值  
    $where='';//查询条件  
    $order="";

    if(!empty($_GET['where'])){ 
        if($_GET['where']!=""){
            $where=$_GET['where'];
            if(!empty($_GET['order'])){//$_GET['order'] 存在则赋值 不存在则默认为""
                $order=$_GET['order'];
            }
        }else{
            $where=' 1=0 ';//查不到的数据    
        }
    }else{
        $where=' 1=0 ';//查不到的数据    
    }
     

    $where=stripslashes($where);
    $order=stripslashes($order);
    
    $col=" id,contact_name,contact_callerid, date_entered , contact_source,media_name,media_date,contact_province,contact_city,contact_address,order_type,order_status ";
    $col.=" ,product_name,repair_date_appointment,repair_date,install_office,repair_worker,description,repair_description,assigned_user_name ";
    $col.=" ,serivce_money,product_parts_money,sum_money,received_money,pay_date,pay_description,cashier_name  ";
    $sql = "select {$col} from {$table_name} where ".$where .$order ;//." limit $offset,$rows ";  deleted=0 
    //WriteLog($sql);
 
    $row = array(); 
    $row[]="编号";//0
    $row[]="姓名";
    $row[]="电话号码";
    $row[]="创建时间";
    $row[]="客户来源";
    $row[]="媒体名称";//media_name 媒体名称 
    $row[]="媒体时间";//media_date  媒体时间
    $row[]="省份";
    $row[]="城市";
    $row[]="地址";
    $row[]="工单类型";
    $row[]="工单状态";//11

    $row[]="机器名称";
    $row[]="预约维修时间"; //repair_date_appointment
    $row[]="实际维修时间"; //换芯时间 repair_date
    $row[]="办事处";
    $row[]="维修人员"; //repair_worker  
    $row[]="工单备注";//description
    $row[]="维修备注";//repair_description
    $row[]="客服";//19
    
    $row[]="服务费";//serivce_money
    $row[]="配件金额";//product_parts_money
    $row[]="总金额";//sum_money
    $row[]="实收金额";//实收金额 received_money
    $row[]="收款时间";//收款时间 pay_date
    $row[]="收款备注";//收款备注 pay_description
    $row[]="出纳";//26 出纳 cashier_name
    
    $row[]="配件名称";// 
    $row[]="单价";// 
    $row[]="数量";// 
    $row[]="小计";


    $items = array(); 
    array_push($items, $row);
    
    $result=$db->query($sql); 
    while($row_order=$db->fetch_array($result)){
            //查明细表 woke_order_change_core_detail 表 根据 order_change_core_id  取  
            $col_detail=" part_name ,price ,number ,subtotal "; //实收金额
            $order=" order by date_entered desc ";
            $sql_detail = "select {$col_detail} from woke_order_repair_detail where order_repair_id='".$row_order['id'] ."' " .$order; 
            //WriteLog($sql_detail);
            $result_detail=$db->query($sql_detail); 
            $i=26; 
            while($row_detail=$db->fetch_array($result_detail)){
                $i++;  //WriteLog($i);
                $row_order[$i]=$row_detail[0]; 
                $i++; 
                $row_order[$i]=$row_detail[1];
                $i++; 
                $row_order[$i]=$row_detail[2]; 
                $i++; 
                $row_order[$i]=$row_detail[3]; 
                 
            }

        array_push($items, $row_order);  
    } 

  //Excel文件名
  $date_now=date("YmdHis",strtotime("now"));
  $fileName="Book".$date_now; 
  
  exportCSV($fileName,$items);

  return;

//
function exportCSV($fileName, $data) {
    header('Content-Type: text/csv; charset=GBK');
    header('Content-Disposition: attachment; filename="' . $fileName . '.csv"');
    $output = fopen('php://output', 'w');
    // 使用 create_function 替代匿名函数
    $convertToGBK = create_function('$item', 'return iconv("UTF-8", "GBK//IGNORE", $item);');
    foreach ($data as $row) {
        $convertedRow = array_map($convertToGBK, $row);
        fputcsv($output, $convertedRow);
    }
    fclose($output);
    exit;
}
 
?> 

兼容 PHP 4.0.1+

function exportCSV($fileName, $data) {
    header('Content-Type: text/csv; charset=GBK');
    header('Content-Disposition: attachment; filename="' . $fileName . '.csv"');
    $output = fopen('php://output', 'w');
    // 使用 create_function 替代匿名函数
    $convertToGBK = create_function('$item', 'return iconv("UTF-8", "GBK//IGNORE", $item);');
    foreach ($data as $row) {
        $convertedRow = array_map($convertToGBK, $row);
        fputcsv($output, $convertedRow);
    }
    fclose($output);
    exit;
}

普通 foreach 循环(兼容所有 PHP 版本)

function exportCSV($fileName, $data) {
    header('Content-Type: text/csv; charset=GBK');
    header('Content-Disposition: attachment; filename="' . $fileName . '.csv"');

    $output = fopen('php://output', 'w');
    
    foreach ($data as $row) {
        $convertedRow = array();
        foreach ($row as $item) {
            $convertedRow[] = iconv('UTF-8', 'GBK//IGNORE', $item);
        }
        fputcsv($output, $convertedRow);
    }
    
    fclose($output);
    exit;
}

提前定义转换函数(兼容 PHP 4+)

function convertToGBK($item) {
    return iconv('UTF-8', 'GBK//IGNORE', $item);
}

function exportCSV($fileName, $data) {
    header('Content-Type: text/csv; charset=GBK');
    header('Content-Disposition: attachment; filename="' . $fileName . '.csv"');

    $output = fopen('php://output', 'w');
    
    foreach ($data as $row) {
        $convertedRow = array_map('convertToGBK', $row);
        fputcsv($output, $convertedRow);
    }
    
    fclose($output);
    exit;
}

最佳兼容性(PHP 5.2 及以下)

function exportCSV($fileName, $data) {
    header('Content-Type: text/csv; charset=GBK');
    header('Content-Disposition: attachment; filename="' . $fileName . '.csv"');

    $output = fopen('php://output', 'w');
    
    foreach ($data as $row) {
        $convertedRow = array();
        foreach ($row as $item) {
            $convertedRow[] = iconv('UTF-8', 'GBK//IGNORE', $item);
        }
        fputcsv($output, $convertedRow);
    }
    
    fclose($output);
    exit;
}

PHP 5.2 以上 需要使用 array_map() 在 PHP 5.2 及以下版本 不支持匿名函数

function exportCSV($fileName, $data) {
    header('Content-Type: text/csv; charset=GBK');
    header('Content-Disposition: attachment; filename="' . $fileName . '.csv"');

    $output = fopen('php://output', 'w');
    // 不需要 BOM,直接转码
    foreach ($data as $row) {
        $convertedRow = array_map(function($item) {
            return iconv('UTF-8', 'GBK//IGNORE', $item);
        }, $row);
        fputcsv($output, $convertedRow);
    }
    fclose($output);
    exit;
}

强制使用 UTF-8 BOM 

function exportCSV($fileName, $data) {
    header('Content-Type: text/csv; charset=utf-8');
    header('Content-Disposition: attachment; filename="' . $fileName . '.csv"');

    // 直接输出 BOM 头(确保在 fopen 之前)
    echo "\xEF\xBB\xBF";

    $output = fopen('php://output', 'w');
    foreach ($data as $row) {
        fputcsv($output, $row);
    }
    fclose($output);
    exit;
}

 

posted @ 2025-04-04 09:13  海乐学习  阅读(27)  评论(0)    收藏  举报