Эффективное чтение запись в память данных .csv и .xlsx

#mysql #excel #csv

#mysql #excel #csv

Вопрос:

Я хочу реализовать эффективное чтение и запись в память файлов .xlsx /.csv.

В настоящее время я использую PHPExcel, и у меня возникают проблемы с большими файлами. (Известная проблема)

Я нашел следующую библиотеку для чтения:https://github.com/nuovo/spreadsheet-reader

Кажется, что это сработает.

Для записи файлов в настоящее время я создаю массив, а затем зацикливаю массив для вывода файла. Поэтому он использует много памяти? Каков наилучший способ не использовать много памяти при записи csv / xlsx при получении данных из базы данных mysql с помощью code igniter?

Это то, что я делаю сейчас:

 /* 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 =amp; 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;
}
  

Комментарии:

1. О каком размере вы говорите? 100 МБ? 4 ГБ? Если вы говорите о GBS, это, очевидно, будет медленно, и есть ряд возможных проблем, одна из которых заключается в том, что у вас проблемы с вводом-выводом. Если на Linux, вы могли бы попробовать ionice. Проблема в том, что создание замедляется после определенного момента?

2. 1-5 Мб — это размер файла, с которым я работаю