内存高效读取+ .csv和.xlsx数据的写入

时间:2014-07-01 20:55:16

标签: mysql excel csv

我希望实现内存有效的.xlsx / .csv文件的读写。

我目前正在使用phpExcel并且遇到大文件问题。 (已知问题)

我找到了以下阅读库:https://github.com/nuovo/spreadsheet-reader

这似乎可行。

对于当前编写文件,我创建了一个数组,然后循环数组以输出文件。这是为什么它会占用大量内存?在使用代码点火器从mysql数据库获取数据时编写csv / xlsx时不使用大量内存的最佳方法是什么?

这就是我现在所做的:

/* added for excel expert */
function excel_export() {
    $data = $this->Customer->get_all($this->Customer->count_all())->result_object();
    $this->load->helper('report');
    $rows = array();

    $header_row = $this->_excel_get_header_row();
    $header_row[] = lang('customers_customer_id');
    $rows[] = $header_row;

    foreach ($data as $r) {
        $row = array(
            $r->first_name,
            $r->last_name,
            $r->email,
            $r->phone_number,
            $r->address_1,
            $r->address_2,
            $r->city,
            $r->state,
            $r->zip,
            $r->country,
            $r->comments,
            $r->account_number,
            $r->taxable ? 'y' : '',
            $r->company_name,
            $r->person_id
        );
        $rows[] = $row;
    }

    $content = array_to_spreadsheet($rows);
    force_download('customers_export.'.($this->config->item('spreadsheet_format') == 'XLSX' ? 'xlsx' : 'csv'), $content);
    exit;
}

function array_to_spreadsheet($arr)
{   
    $CI =& get_instance();

    $objPHPExcel = new PHPExcel();

    //Default all cells to text
    $objPHPExcel->getDefaultStyle()->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_TEXT);

    for($k = 0;$k < count($arr);$k++)
    {
        for($j = 0;$j < count($arr[$k]); $j++)
        {
            $objPHPExcel->getActiveSheet()->setCellValueExplicitByColumnAndRow($j, $k+1, $arr[$k][$j]);
        }
    }

    if ($CI->config->item('spreadsheet_format') == 'XLSX')
    {
        $objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);       
    }
    else
    {
        $objWriter = new PHPExcel_Writer_CSV($objPHPExcel);
    }

    ob_start();
    $objWriter->save('php://output');
    $excelOutput = ob_get_clean();

    return $excelOutput;
}

0 个答案:

没有答案
相关问题