如何使用cakephp导出txt文件 [英] How to use cakephp export txt file

查看:42
本文介绍了如何使用cakephp导出txt文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用cakephp框架。我想以两种格式导出客户端下载的数据库表。一种是 .csv,另一种是 .txt .CSV,我已经通过 csvHelper解决了现在,我想知道如何导出 .txt。抱歉,我的英语不好,但是我想您会明白我的意思的,谢谢!

I'm using cakephp framework.I want to export a database table of a client download in two formats.One is '.csv', the other is a '.txt'.CSV which I have passed 'csvHelper' resolved.Now I want to know how to export '.txt'.Sorry for my poor English, but I think you'll see what I mean, thanks!

推荐答案

基本上,您可以为文件名设置标头,例如:

Basically you set the header for the filename, like this:

        $this->response->type('Content-Type: text/csv');
    $this->response->download('myfilename.txt');

以下是我放入appController中的一些功能,因此任何控制器都可以在需要时输出CSV文件:

Here are some functions I put in my appController, so that any controller can output a CSV file if required:

    /**
 * Flattens the data that is returned from a find() operation, and puts it into CSV format
 * @param $data
 * @return string
 */
public function _arrayToCsvFile($data){
    $flattenedData = array();
    $exportKeyPair = array();
    foreach($data as $datumKey => $datumDetails){
        $flattenedDatum = Hash::flatten($datumDetails, '.');
        $flattenedData[] = $flattenedDatum;

        // Find all keys
        if($datumKey == 0){
            $exportKeys = array_keys($flattenedDatum);
            $exportKeyPair = array_combine($exportKeys, $exportKeys);
        }
        else {
            $datumKeys = array_keys($flattenedDatum);

            $datumKeyPair = array_combine($datumKeys, $datumKeys);

            // Add the datum keys to the exportKeyPair if it's not already there
            $exportKeyPair = array_merge($exportKeyPair, $datumKeyPair);
        }
    }

    $exportKeyMap = array();
    foreach($exportKeyPair as $exportKey => $exportValue){
        $exportKeyMap[$exportKey] = "";
    }


    $outputCSV = '';

    $outputCSV .= $this->_arrayToCsvLine($exportKeyPair);

    foreach($flattenedData as $flattenedDatumKey => $flattenedDatumDetails){

        // Add any extra keys
        $normalisedDatumDetails = array_merge($exportKeyMap, $flattenedDatumDetails);

        $outputCSV .= $this->_arrayToCsvLine($normalisedDatumDetails);
    }

    return $outputCSV;
}

    /**
 * arrayToCsvLine function - turns an array into a line of CSV data.
 *
 * @access public
 * @param mixed $inputLineArray the input array
 * @param string $separator (default: ")
 * @param string $quote (default: '"')
 * @return string
 */
function _arrayToCsvLine($inputLineArray, $separator = ",", $quote = '"') {
    $outputLine = "";

    $numOutput = 0;

    foreach($inputLineArray as $inputLineKey => $inputLineValue) {
        if($numOutput > 0) {
            $outputLine .= $separator;
        }

        $outputLine .= $quote . str_replace(array('"', "\n", "\r"),array('""', "", ""), $inputLineValue) . $quote;
        $numOutput++;
    }

    $outputLine .=  "\n";

    return $outputLine;

}

/**
 * Serves some CSV contents out to the client
 * @param $csvContents
 * @param array $options
 */
public function _serveCsv($csvContents, $options = array()){

    $defaults = array(
        'modelClass' => $this->modelClass,
        'fileName' => null
    );

    $settings = array_merge($defaults, $options);

    if(empty($settings['fileName'])){
        $settings['fileName'] = strtolower( Inflector::pluralize( $settings['modelClass'] ) ) . '_' . date('Y-m-d_H-i') . '.csv';
    }

    $this->autoRender = false;

    $this->response->type('Content-Type: text/csv');
    $this->response->download($settings['fileName']);
    $this->response->body($csvContents);
}

现在在任何控制器中都可以执行此操作(请注意,您可以传递文件名到_serveCsv(如果需要)):

Now in any controller you can do this (note that you can pass the filename to _serveCsv if required):

/**
 * admin_export_csv method
 *
 * @return void
 */
public function admin_export_csv() {
    $this->Order->recursive = 0;

    $conditions = array();

    $orders = $this->Order->find('all', array('conditions' => $conditions));


    $csvContents = $this->_arrayToCsvFile($orders); // Function in AppController

    $this->_serveCsv($csvContents, array('filename' => 'export.txt')); // Function in AppController
}

这篇关于如何使用cakephp导出txt文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆