<?php

namespace app\common\controller;

use think\Controller;
use think\Db; class Csv extends Controller
{
public static function putCsv($condition, $action, $file_name)
{
set_time_limit(0);
switch ($action) {
case "web":
$field = [
'A' => [
"tid",
"Transaction Number"
],
'B' => [
"create_date",
"Time"
],
'C' => [
"full_name",
"Card Name"
],
'D' => [
"face_value",
"Face Value($)"
],
'E' => [
"price_sgd",
"Cost($)"
],
'F' => [
"price_rmb",
"Cost(¥)"
],
'G' => [
"mobile",
"Top-up Number"
],
'H' => [
"Status",
"Status"
],
'I' => [
"ip",
"IP"
],
'J' => [
"email",
"Email"
]
];
$file_name = "web" . $file_name . "order_list";
$builder = Db::table("Transactions")
->field("tid,create_date,menu_id as full_name,tag as face_value,price_sgd,price_rmb,mobile,status,user_ip,email")
->where($condition)
->select();
$list = collection($builder)->each(function ($item) {
            //csv导出数字满15位之后自动省略---科学计算法,加上"\t"则可以完整导出
$item['create_date'] .= "\t";
$item['mobile'] .= "\t";
$product_info = getProdInfoByMenuId($item['full_name'], true);
$item['full_name'] = $product_info['full_name'];
$item['face_value'] = number_format($product_info['card_val'] / 100, 2);
if ($item['status'] == '1') $item['status'] = "Success";
if ($item['status'] == '0') $item['status'] = "Pending";
if ($item['status'] == '102') $item['status'] = "Fail"; unset($item['menu_id']);
return $item;
});
//dump($list);exit;
break;
case "wechat":
$file_name = "wechat" . $file_name . "order_list";
$field = [
'A' => [
"tid",
"Transaction Number"
],
'B' => [
"uid",
"Wechat uid"
],
'C' => [
"create_date",
"Time"
],
'D' => [
"mobile",
"Top-up Number"
],
'E' => [
"pid",
"Product pid"
],
'F' => [
"state",
"Status"
],
'G' => [
"upid_lst",
"Red Packet"
],
'H' => [
"admin_note",
"Remark"
]
];
$builder = Db::table("WXTrans")
->field("tid,uid,create_date,mobile,pid,state,upid_lst,admin_note")
->where("uid <> 13")
->where("uid <> 15")
->where("total_fee > 1")
->where("mode != 1")
->where($condition)
->select();
$list = collection($builder)->each(function ($item) {
$item['tid'] = "wx_" . $item['tid'];
$item['create_date'] .= "\t";
$item['mobile'] .= "\t";
$item['upid_lst'] = str_replace(",", " ", $item['upid_lst']);
if ($item['state'] == 3) $item['state'] = "Success";
if ($item['state'] == 2) $item['state'] = "Pending";
if ($item['state'] == 102) $item['state'] = "Fail";
if ($item['state'] == 200) $item['state'] = "Refund";
return $item;
});
break;
case "client":
$file_name = "API" . $file_name . "order_list";
$field = [
'A' => [
"ctime",
"Time"
],
'B' => [
"full_name",
"Card Name"
],
'C' => [
"face_value",
" Face Value($)" ],
'D' => [
"price_sgd",
"Cost($)"
],
'E' => [
"mobile",
"Top-up Number"
],
'F' => [
"err_code",
"Status"
],
'G' => [
"order_id",
"Transaction Number" ],
'H' => [
"client_id",
"API Client" ],
];
if (isset($condition['client_id'])) {
$file_name = $condition['client_id'] . $file_name . "order_list";
} else {
$file_name = "API" . $file_name . "order_list";
}
$builder = Db::table("ApiTrans")
//->fetchSql(true)
->field("ctime,pid as full_name,amount as face_value,price_sgd,mobile,err_code,tid as order_id,client_tag,client_id")
->where("category = 'topup' or category is NULL")
->whereNotLike("client_id", "%_test%")
->where($condition)
->select();
//echo $builder;exit;
$list = collection($builder)->each(function ($item) {
$item['order_id'] = "Our Transaction Number:" . $item['order_id'] . "\n" . "API Transaction Number:" . $item['client_tag'];
$item['price_sgd'] = number_format($item['price_sgd'] / 100, 2);
$item['ctime'] .= "\t";
$item['mobile'] .= "\t";
if ($item['err_code'] == 0) {
$item['err_code'] = "Success";
} elseif ($item['err_code'] == 311) {
$item['err_code'] = "Pending";
} else {
$item['err_code'] = "Fail";
}
$product_info = getProdInfo($item['full_name'], true);
$item['full_name'] = $product_info['full_name'];
$item['face_value'] = number_format($product_info['card_val'] / 100, 2);
unset($item['client_tag']);
//dump($item);exit;
return $item;
});
break;
case "alipay":
$file_name = "alipay" . $file_name . "order_list";
$field = [
'A' => [
"uid",
"Wechat uid"
],
'B' => [
"tid",
"Transaction Number"
],
'C' => [
"ctime",
"Time"
],
'D' => [
"mobile",
"Top-up Number"
],
'E' => [
"pid",
"Product pid"
],
'F' => [
"state",
"Status"
],
'G' => [
"upid_lst",
"Red Packet"
],
'H' => [
"admin_note",
"Remark"
]
];
$builder = Db::table("cz_alipay_trans")
->field("tid,source_uid as uid,ctime,mobile,pid,state,upid_lst,admin_note")
->where($condition)
->select();
$list = collection($builder)->each(function ($item) {
$item['tid'] = "ap_" . $item['tid'];
$item['ctime'] .= "\t";
$item['mobile'] .= "\t";
$item['upid_lst'] = str_replace(",", " ", $item['upid_lst']);
$item['uid'] = getUidByOpenid($item['uid'])['uid'];
if ($item['state'] == 3) $item['state'] = "Success";
if ($item['state'] == 2) $item['state'] = "Pending";
if ($item['state'] == 102) $item['state'] = "Fail";
if ($item['state'] == 200) $item['state'] = "Refund";
return $item;
});
break;
default:
break;
}
$file_name = $file_name . ".csv";
//$file_name = time() . ".csv"; $file_path= $_SERVER['DOCUMENT_ROOT'] . "/uploads/csv/" . $file_name;
if (file_exists($file_path)) {
unlink($file_path);
}
$file_path="/uploads/csv/" . $file_name;
$fp = fopen("." . $file_path, "a");
$limit = 10000; $calc = 0;
foreach ($field as $k => $v) {
//$tit[] = iconv("UTF-8", "GB2312//IGNORE", $v[1]);
//外国不支持UTF-8,需要转换成utf-8 with bom
$tit[] = "\xEF\xBB\xBF".$v[1];
} fputcsv($fp, $tit);
foreach ($list as $v) {
$calc ++;
if ($limit == $calc) {
ob_flush();
flush();
$calc = 0;
}
foreach ($v as $_v) {
//$tarr[] = iconv("UTF-8", "GB2312//IGNORE", $_v);
$tarr[] = $_v;
}
fputcsv($fp, $tarr);
unset($tarr);
}
unset($list);
fclose($fp); return ["code" => 1, "msg" => "获取成功", "url" => $_SERVER['HTTP_HOST'] . $file_path];
}
}

新建一个类如上,然后在需要用到的地方调用这个类里面的方法即可。

php导出csv并保存在服务器,返回csv的文件路径的更多相关文章

  1. C#操作FTP报错,远程服务器返回错误:(550)文件不可用(例如,未找到文件,无法访问文件)的解决方法

    最近在做项目的时候需要操作ftp进行文件的上传下载,但在调用using (var response = (FtpWebResponse)FtpWebRequest.GetResponse())的时候总 ...

  2. C# FTP远程服务器返回错误:(550) 文件不可用(例如,未找到文件,无法访问文件)

    今天用代码删除FTP服务器上的目录时候,报错:远程服务器返回错误:(550) 文件不可用(例如,未找到文件,无法访问文件). 习惯性的google,不外乎以下几点: 1.URL路径不对,看看有没有多加 ...

  3. js上传文件带参数,并且,返回给前台文件路径,解析上传的xml文件,存储到数据库中

    ajaxfileupload.js jQuery.extend({ createUploadIframe: function(id, uri) { //create frame var frameId ...

  4. SQL2012还原数据库操作在本地服务器上操作和用别的电脑远程连接到服务器进行操作的文件路径差异

    在数据库服务器上想还原一个数据库到某个备份文件时期的,服务器的数据库文件本身是保存在 D:\DEVDB目录 通过开发电脑上的MS manager来连接数据库服务器操作还原 虽发现文件卡项上,原始文件名 ...

  5. django项目部署在Apache服务器中,静态文件路径的注意点

    django Apache部署静态文件的路径注意点 静态文件放在对应的 app 下的 static 文件夹中 或者 STATICFILES_DIRS 中的文件夹中. 当 DEBUG = True 时, ...

  6. 【linux】find命令仅返回文件名 不用返回完整的文件路径

    正常查询 find /apps/swapping -name '*swapping*.jar' 在/apps/swapping 目录下 查找 文件名为 '包含swapping的并且以.java结尾的文 ...

  7. 数据以Excel形式导出导服务器,再将文件读取到客户端另存 以HSSFWorkbook方式实现

    public void exportExcel(List<P2pInfo> repayXist,HttpServletRequest request,HttpServletResponse ...

  8. fft 远程服务器返回错误 550返回码

    "远程服务器返回错误:(550) 文件不可用(例如,未找到文件,无法访问文件)"时,可能是如下原因: 1.URL路径不对,看看有没有多加空格,或者大小写问题 2.权限是否足 3.需 ...

  9. js进阶ajax的XMLHttpRequest对象的status和statustext属性(如果ajax和php联合使用的话:open连接服务器的第二个参数文件路径改成请求php的url即可)

    js进阶ajax的XMLHttpRequest对象的status和statustext属性(如果ajax和php联合使用的话:open连接服务器的第二个参数文件路径改成请求php的url即可) 一.总 ...

随机推荐

  1. 多线程实现奇偶统计v1 - 暴力版

    #include <stdio.h> #include <stdlib.h> #include <time.h> #include "pthread.h& ...

  2. Rabbitmq的延时队列的使用

    配置: spring: rabbitmq: addresses: connection-timeout: username: guest password: guest publisher-confi ...

  3. C#中的元组对象Tuple

    原文:C#中的元组对象Tuple 一.什么是元组 元组就是一些对象的集合,在我们编程时,比如一个人的信息,我们常常创建一个Person类去描述一个人,传统的做法如下: public class Per ...

  4. Pytest参数传递

    import pytest@pytest.fixture()def login_r(open_browser):#调用login时,发现需要先打开浏览器,所以改成先打开浏览器,在登陆 print('输 ...

  5. Dubbo面试常见问题

    一.dubbo是什么? dubbo是⼀个分布式服务框架,提供⾼性能和透明化的RPC远程服务调⽤⽅案,以及SOA服务治理方案.说白了其实dubbo就是一个远程调用的分布式框架. 二.dubbo的核心服务 ...

  6. android5.1 隐藏状态栏

    修改frameworks/base/core/res/res/values/dimens.xml文件中 <!-- Height of the status bar --> <!-- ...

  7. 关于STLINK

    关于STLINK 1.STLIN固件升级 1)打开ST-LINK Utility,选择ST-LINK->Firmware update 2)连接ST-LINK 3)可以看到STLINK当前的软件 ...

  8. Leetcode 200.岛屿的数量 - DFS、BFS

    Leetcode 200 岛屿的数量: DFS利用函数调用栈保证了检索顺序, BFS则需要自己建立队列,把待检索对象按规则入队. class Solution { // DFS解法,8ms/10.7M ...

  9. SSD网络结构

    SSD算法,其英文全名是Single Shot MultiBox Detector. SSD的网络结构流程如下图所示:SSD总共11个block,相比较于之前的VGG16,改变了第5个block的第4 ...

  10. 【转】SpringMVC整合websocket实现消息推送及触发

    1.创建websocket握手协议的后台 (1)HandShake的实现类 /** *Project Name: price *File Name:    HandShake.java *Packag ...