#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 Мб — это размер файла, с которым я работаю