php生成淘宝csv文件下载,PHP 生成.csv 文件并下载到浏览器

近期做了一个项目须要把订单的信息显示出来。而且可以把相关信息放到一个.csv 文件里,下载到浏览器。首先我要说明的是.csv 文件,PHP 有专门的函数去解析该类型的文件,相关函数大家可以去官网查看。注意.csv 文件内容的编码格式是gbk格式的,所以有必要对字符格式进行转码。

文件的样式例如以下。

272fbace15a626c8084433929ae86b3b.png

一、首先要定义header 头

// 输出Excel文件头。可把user.csv换成你要的文件名称

header ( 'Content-Type: application/vnd.ms-excel' );

header ( 'Content-Disposition: attachment;filename="订单数据.csv"' );

header ( 'Cache-Control: max-age=0' );

// 打开PHP文件句柄,php://output 表示直接输出到浏览器

$fp = fopen ( 'php://output', 'a' );

// 输出Excel列名信息

二 、以下是文件的头部

$head = array ('订单号','','订单名称','','业务ID','','渠道ID','','渠道类型','','产品线名称','','原始订单号','','订单金额',

'','From值','','订单时间','','收款合同号','','渠道名称','','付款合同号','','供应商名称','','运营平台','','产品类型',

'','记账时间','','渠道成本比例','','渠道成本','','应收账款','','结算比例','','应付结算','','是否已回款','','是否已提批次',

'','备注');

foreach ( $head as $i => $v ) {

// CSV的Excel支持GBK编码,一定要转换,否则乱码

$head [$i] = iconv ( 'utf-8', 'gbk', $v );

}

// 将数据通过fputcsv写到文件句柄

fputcsv ( $fp, $head );

三、以下是文件的内容。以我的样例是从数据库读出来的,看不懂没关系,原理是把结果查出来放到数组中,循环数组,把每一个结果放到一个新的数组而且进行编码。忘了告诉你我用的是CI(codeignite)框架

if ($this->input->get () != false) {

// 从数据库中获取数据,为了节省内存,不要把数据一次性读到内存。从句柄中一行一行读就可以

$sql = "select Charge_final.charge_id,

Charge_final.product_name,

Charge_final.business_id,

Charge_final.channel_id,

Charge_final.channel_type,

bass_productline.product_line_name,

Charge_final.business_linkid,

Charge_final.fee,

Charge_final.msgfrom,

Charge_final.charge_time,

Charge_final.income_contract,

Charge_final.income_channel_name,

Charge_final.payment_contract,

Charge_final.merchant_name,

Charge_final.platform,

Charge_final.product_type,

Charge_final.bill_time,

Charge_final.channel_rate,

Charge_final.channel_fee,

(Charge_final.fee-Charge_final.channel_fee) as account,

Charge_final.payment_rate,

Charge_final.payment_fee,

Charge_final.income_id,

Charge_final.payment_id,

Charge_final.note

from {$this->Charge_final} as Charge_final left join

{$this->bass_productline} as bass_productline

on Charge_final.channel_id=bass_productline.channel_id and

Charge_final.channel_type=bass_productline.channel_type

where 1=1 $conditions order by Charge_final.charge_time desc";

$query = $this->db->query ( $sql );

// 计数器

$cnt = 0;

// 每隔$limit行。刷新一下输出buffer。不要太大,也不要太小

$limit = 8000;

foreach ( $query->result_array () as $row ) {

$cnt ++;

if ($limit == $cnt) { // 刷新一下输出buffer,防止因为数据过多造成问题

ob_flush ();

flush ();

$cnt = 0;

}

$income_id=$row['income_id']==0?

'未回款':'回款';

$payment_id=$row['payment_id']==0?'未提':'已提';

// 读取表数据

$content = array ();

$content [] = iconv ( 'utf-8', 'gbk', $row ['charge_id'] . "\t" );

$content [] = '';

$content [] = iconv ( 'utf-8', 'gbk', $row ['product_name'] );

$content [] = '';

$content [] = iconv ( 'utf-8', 'gbk', $row ['business_id'] . "\t" );

$content [] = '';

$content [] = iconv ( 'utf-8', 'gbk', $row ['channel_id'] . "\t" );

$content [] = '';

$content [] = iconv ( 'utf-8', 'gbk', $row ['channel_type'] );

$content [] = '';

$content [] = iconv ( 'utf-8', 'gbk', $row ['product_line_name'] );

$content [] = '';

$content [] = iconv ( 'utf-8', 'gbk', $row ['business_linkid'] );

$content [] = '';

$content [] = iconv ( 'utf-8', 'gbk', $row ['fee'] );

$content [] = '';

$content [] = iconv ( 'utf-8', 'gbk', $row ['msgfrom'] );

$content [] = '';

$content [] = iconv ( 'utf-8', 'gbk', $row ['charge_time'] . "\t" );

$content [] = '';

$content [] = iconv ( 'utf-8', 'gbk', $row ['income_contract'] );

$content [] = '';

$content [] = iconv ( 'utf-8', 'gbk', $row ['income_channel_name'] );

$content [] = '';

$content [] = iconv ( 'utf-8', 'gbk', $row ['payment_contract'] );

$content [] = '';

$content [] = iconv ( 'utf-8', 'gbk', $row ['merchant_name'] );

$content [] = '';

$content [] = iconv ( 'utf-8', 'gbk', $row ['platform'] );

$content [] = '';

$content [] = iconv ( 'utf-8', 'gbk', $row ['product_type'] );

$content [] = '';

$content [] = iconv ( 'utf-8', 'gbk', $row['bill_time'].'\t');

$content [] = '';

$content [] = iconv ( 'utf-8', 'gbk', $row ['channel_rate'] );

$content [] = '';

$content [] = iconv ( 'utf-8', 'gbk', $row ['channel_fee'] );

$content [] = '';

$content [] = iconv ( 'utf-8', 'gbk', $row ['account'] );

$content [] = '';

$content [] = iconv ( 'utf-8', 'gbk', $row ['payment_rate'] );

$content [] = '';

$content [] = iconv ( 'utf-8', 'gbk', $row ['payment_fee'] );

$content [] = '';

$content [] = iconv ( 'utf-8', 'gbk', $income_id );

$content [] = '';

$content [] = iconv ( 'utf-8', 'gbk', $payment_id);

$content [] = '';

$content [] = iconv ( 'utf-8', 'gbk', $row ['note'] );

fputcsv ( $fp, $content );

}

三、文件的尾部

$sql="select sum(Charge_final.fee) as amountorder,

sum(Charge_final.channel_fee) as sumchannel_fee,

sum(Charge_final.fee-Charge_final.channel_fee) as sumaccout,

sum(Charge_final.payment_fee) as sumpayfee

from {$this->Charge_final} as Charge_final

left join {$this->bass_productline} as bass_productline on

Charge_final.channel_id=bass_productline.channel_id and

Charge_final.channel_type=bass_productline.channel_type

where 1=1 $conditions";

$querys = $this->db->query ( $sql );

$ro = $querys->result_array ();

$this->data ['ro'] = $ro;

$amountorder=$ro['0']['amountorder'];

$sumchannel_fee=$ro['0']['sumchannel_fee'];

$sumaccout=$ro['0']['sumaccout'];

$sumpayfee=$ro['0']['sumpayfee'];

$foot = array ('统计','','','','','','','','','','','','','',"$amountorder",

'','','','','','','','','','','','','','','','',

'','','','','',"$sumchannel_fee",'',"$sumaccout",'','','',"$sumpayfee",'','','','',

'','');

foreach ($foot as $i => $v ) {

// CSV的Excel支持GBK编码。一定要转换,否则乱码

$foot[$i] = iconv ( 'utf-8', 'gbk', $v );

}

// 将数据通过fputcsv写到文件句柄

fputcsv ( $fp, $foot);

}

}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值