从PHP导入/导出文件

时间:2017-04-05 09:10:59

标签: php download export-to-csv

当我提出问题(问题)时,我想我的解释并不干净。 我有一个项目PHP,我没有本地环境,我正在线上工作:我通过Netbeans更改我的文件,我部署它而不在本地测试它。我的服务器是生产的。我的数据库(MySQL - phpMyadmin)也在服务器上。 我将数据从我的磁盘导入到项目中。然后PHP通过HighChart利用它。用户可以根据许多选择(日期,城市,客户......)查看这些数据,最后他可以将此最终结果下载到文件csv中。 这里的问题我无法下载所有数据,例如:在图表14Million中的营业额显示但在文件csv中显示的营业额较少。

这是我的代码:

class Export{
    private $_dataIN=[];
    private $_author;
    private $_filepath;

    public function __construct(array $dataIN) {
        $this->_dataIN = $dataIN;
        $this->setFilepath();
        $this->prepareFile();
    }
    public function setFilepath() {
        $date = new \DateTime();
        $this->_filepath='../DATA/ExportFiles/ExportData'.$date->getTimestamp();
    }
    public function prepareFile(){
        $file = fopen($this->_filepath, 'w');
        fputcsv($file, array('Piece', 'Client', 'Libelle Client', 'Facturation','OTP','Typcde','Cdecli','Cdesap','Article','Designation','Dev','Montant_fac_dev_ht','Montant_fac_eur','Avion','Nature','Repsite','Zone','LRU','Contract'),';');        
        foreach ($this->_dataIN as $key => $statement) {
            fputcsv($file, array($statement->getId(), $statement->getCustomerId(), $statement->getCustomerName(), $statement->getDate(), $statement->getOTP(), $statement->getCdetype(), $statement->getCdecustomer(), $statement->getSAPcode(), $statement->getArticle(), $statement->getDesigniation(), $statement->getCurrency(), $statement->getAmount(), $statement->getAmountEur(), $statement->getAircraft(), $statement->getNature(), $statement->getRepsite(), $statement->getZone(), $statement->getLru(),$statement->getContract()),';');
        }
    }

    public  function download() {        

        header('Content-Description: File Transfer');
        header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');//octet-stream' 
        header('Content-Disposition: attachment; filename='.basename($this->_filepath).'.csv'); 
        header('Expires: 0');
        header('Cache-Control: must-revalidate');
        header('Pragma: public');
        header('Content-Length: ' . filesize($this->_filepath) . 'Giga'); //Kilo
        readfile($this->_filepath);
        exit();

我希望这次我的解释很干净,你可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

最好不要存储这样使用:

public function __construct($dataIN = array()) {
    $this->_dataIN = $dataIN;
    $this->prepareFile();
}

public function prepareFile(){

    $header[] = array('Piece', 'Client', 'Libelle Client', 'Facturation','OTP','Typcde','Cdecli','Cdesap','Article','Designation','Dev','Montant_fac_dev_ht','Montant_fac_eur','Avion','Nature','Repsite','Zone','LRU','Contract');        

    $data = array();

    foreach ($this->_dataIN as $key => $statement) {
        $data[] = array($statement->getId(), $statement->getCustomerId(), $statement->getCustomerName(), $statement->getDate(), $statement->getOTP(), $statement->getCdetype(), $statement->getCdecustomer(), $statement->getSAPcode(), $statement->getArticle(), $statement->getDesigniation(), $statement->getCurrency(), $statement->getAmount(), $statement->getAmountEur(), $statement->getAircraft(), $statement->getNature(), $statement->getRepsite(), $statement->getZone(), $statement->getLru(),$statement->getContract());
    }

    $final_data = array_merge($header, $data);

    $this->array_to_csv($final_data, 'report.csv');
}


function array_to_csv($array, $download = "")
{   
    if ($download != "")
    {    
        header('Content-Description: File Transfer');
        header("Content-type: application/vnd.ms-excel");
        header('Content-Disposition: attachement; filename="' . $download . '"');
        header('Content-Transfer-Encoding: binary');
    }        

    ob_start();
    $f = fopen('php://output', 'w') or show_error("Can't open php://output");
    $n = 0;        
    foreach ($array as $line)
    {
        $n++;
        if ( ! fputcsv($f, $line))
        {
            show_error("Can't write line $n: $line");
        }
    }
    fclose($f) or show_error("Can't close php://output");
    $str = ob_get_contents();
    ob_end_clean();

    if ($download == "")
    {
        return $str;    
    }
    else
    {    
        print "\xEF\xBB\xBF"; // UTF-8 BOM
        print $str;
    }        
}