*【封装php函数】--导入、导出、生成文件

生成文件:

$data = [
    ['name' => '西瓜','age'=>26],
    ['name' => '西瓜1','age'=>26],
];
$fileName = 'e.xml';
$filePath = "D:/phpStudy/WWW/test/";
echo createXml($data,$fileName,$filePath);        //调用示例


/**
 * 生成xml
 * @param $data         要放到xml中的数据,是个二维数组
 * @param $fileName     要生成的文件名
 * @param $filePath     在哪个目录下生成
 * @return string  返回该文件所在的目录和文件名
 */
function createXml($data,$fileName,$filePath){

    $xml = "<?xml version='1.0' encoding='utf-8'?>\n";
    $xml .= "<article>\n";
    foreach ($data as $v) {
        $xml .= "<item>\n";
        $xml .= "<name>"."<![CDATA[{$v['name']}]]>"  ."</name>\n";
        $xml .= "<age>" . "<![CDATA[{$v['age']}]]>" . "</age>\n";
        $xml .= "</item>\n";
    }
    $xml .= "</article>\n";

    file_put_contents($filePath.$fileName,$xml);
    return $filePath.$fileName;
}

 

/**
 * 自带下载功能,导出TXT格式
 * @param $finame  文件名。数据类型为字符串
 * @param $content 文件要写入的内容。数据类型为字符串
 * @param string $postfix 要生成什么格式。只有2种.txt和.doc可选。如果是.doc可以生成,里面没有图片和链接的word格式
 */
function createTxt($finame,$content,$postfix='.txt'){
    //第一步:处理中文文件名
    $ua = $_SERVER["HTTP_USER_AGENT"];      //用的是什么浏览器
    $filename = $finame.$postfix;             //一定要记得拼.txt。不然程序不知道下载什么格式
    $encoded_filename = urlencode($filename);      //url编码
    $encoded_filename = str_replace("+", "%20", $encoded_filename); //把 + 替换成 %20

    //第二步:生成TXT文件
    header("Content-Type: application/octet-stream");
    if (preg_match("/MSIE/", $_SERVER['HTTP_USER_AGENT']) ) {
        header('Content-Disposition:  attachment; filename="' . $encoded_filename . '"');
    } elseif (preg_match("/Firefox/", $_SERVER['HTTP_USER_AGENT'])) {
        header('Content-Disposition: attachment; filename*="utf8' .  $filename . '"');
    } else {
        header('Content-Disposition: attachment; filename="' .  $filename . '"');
    }
    echo $content;     //拼接数据并以echo 返回
}

 

/**
 * 将数据导出到txt && 下载
 * downTxt('hello','D:\phpStudy\WWW\test\down\\',['第1列','第2列','第3列'],$data); //调用示例
 * @param $fileName     要生成的文件名
 * @param $savePath     保存到服务器的地址  'D:\phpStudy\WWW\test\down\\'
 * @param $tableHeader  表头,传个一维数组   ['第1列','第2列','第3列']
$data = [
    '男装'=>['上衣','裤子'],
    '女装'=>['泡泡袖','连衣裙']
];
 * @param $data         数据,传个二维数组   $data
 */
function downTxt($fileName,$savePath,$tableHeader,$data){
    $name = $fileName . date('Y-m-d_H-i-s', time()). ".txt";    //文件名
    $path =  $savePath . $name;    //保存到服务器上的路径
    $html = "\xEF\xBB\xBF";     //解决乱码问题

    //输出表头
    foreach ($tableHeader as $v) {
        $html .= $v . "\t|";
    }
    $html .= "\r\n";

    //遍历二维数组,输出内容
    foreach ($data as $key => $value) {
        $html .= $key."\t|";
        foreach ($value as $kk => $vv) {
            $html .= $vv."\t|";
            if($kk != end($value)){       //当前key 不等于 该数组中的最后一个key
                $html .= "\r\n";          //回车,换行
            }
        }
    }

    //保存文件
    $txtFile = fopen($path,'a+');
    fwrite($txtFile,$html);
    fclose($txtFile);
    downloadFile($name,$path);    //调下载文件的方法
}
/***
 * @@@@ 下载
 */
function downloadFile($sTitle, $sFilePath){
    $charset = 'UTF-8';
    $attachmentHeader = "Content-Disposition: attachment; filename=\"{$sTitle}\"; charset=\"{$charset}\"";
// var_dump($attachmentHeader);die;
    ob_end_clean();
    ob_start();
    header("Content-Type: application/force-download");
    header("Content-Type: application/octet-stream");
    header("Content-Type: application/download");
    header($attachmentHeader);
    //ie 无法下载 来自 无法打开该internet 站点 的问题
    header("Pragma: public");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Cache-Control: public");
    header("Content-Description: File Transfer");
    header("Content-Transfer-Encoding: binary");
    echo file_get_contents($sFilePath);

}

 

 

 

/**
 * 自带下载功能,导出csv格式
 * @param $taheader	表格头部,传个一维数组
 * @param $data		表格数据,传个二维数组
 * @return string
 */
function createCSV($taheader,$data){
    $tableheader = $taheader;
    $tablelength = count($tableheader);
    /*输入到CSV文件 解决乱码问题*/
    $html = "\xEF\xBB\xBF";

    /*输出表头*/
    foreach ($tableheader as $value) {
        $html .= $value . "\t ,";
    }
    $html .= "\n";

    /*遍历二维数组,输出内容*/
    foreach ($data as $value) {
        for ($i = 0; $i < $tablelength; $i++) {
            $html .= $value[$i] . "\t ,";
        }
        $html .= "\n";
    }

    /*输出CSV文件*/
    header("Content-type:text/csv");
    header("Content-Disposition:attachment; filename=全部数据.csv");
    return $html;
}

 

 

/**
 * 导出 CSV get方式,直接下载
 * @access public
 * @param  array $nameArr 要 array('导出的表中的字段名'=>'中文命名','导出的表中的字段名'=>'中文命名') 一维数组,表头
 * @return array  $sqlArr  数据库查出的数据。二维数组
 * @return string $name    导出CSV 时的命名
 *
 * 调用示例
    $arr = ['name'=>'姓名','age'=>'年龄'];
    $res = [['name'=>'西瓜','age'=>25],['name'=>'杨熙','age'=>26]];
    var_dump($arr);
    csv($arr,$res,'西瓜');
 */
function csv($nameArr = "", $sqlArr = "", $name = "")
{
    foreach ($nameArr as $key => $value) {
        iconv('utf-8', 'gbk', $value); //转为中文
        $str[] = $value;
    }
    $str = implode(',', $str);
    $str .= "\n"; //用引文逗号分开
    foreach ($sqlArr as $key => $value) {
        $array = array_change_key_case($value, CASE_LOWER); //返回字符串键名全为小写或大写的数组
        $chanJi = array_diff_key($array, $nameArr);         //使用键名比较计算数组的差集
        $jiaoji[] = array_diff_key($array, $chanJi);
    }

    $jiaoji = array_values($jiaoji);                        //只取值
    foreach ($jiaoji as $key => $value) {
        $arrValues[] = implode(',', $value);
    }
    $string = implode("\n", $arrValues);
    $str .= $string;
//    var_dump($str);exit;
    $str = iconv('utf-8', 'gbk//TRANSLIT', $str); //转为中文
    /*去除特殊符号*/
    $regex = "/\/|\~|\!|\|\#|\\$|\%|\^|\&|\*|\(|\)|\_|\+|\{|\}|\<|\>|\?|\[|\]|\|\.|\/|\;|\'|\=|\\\|\|/";
    $str = preg_replace($regex, "", $str);
    $filename = "$name" . date('YmdHis') . '.csv'; //设置文件名
    $data = $str;
    header("Content-type:text/csv");
    header("Content-Disposition:attachment;filename=" . $filename);
    header('Cache-Control:must-revalidate,post-check=0,pre-check=0');
    header('Expires:0');
    header('Pragma:public');
    echo $data;exit;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值