PHPExcel устарел и не поддерживается.Он был заменен новой версией под названием PHPSpreadsheet , и вы должны использовать эту версию.Для меня это было быстрее и надежнее.
Конвертировать легко, потому что большинство функций точно такие же.Там не будет много переписывания требуется.Основное изменение заключается в создании объектов чтения, записи, рабочих книг и листов.
Я останусь с PHPExcel для этого ответа.
Есть несколько вещей, которые вы можете сделать, чтобы оптимизировать код.Во-первых, перехватите активный объект листа для повторного использования вместо повторного вызова setActiveSheetIndex()
и getActiveSheet()
.
// Create new PHPExcel object
$objPHPExcel = new PHPExcel();
// A new workbook always sets the active sheet index to the first sheet
// Capture the "active sheet" object for easy reuse.
$activeSheet = $objPHPExcel->getActiveSheet();
По возможности старайтесь устанавливать блоки значений ячеек, используя массив вместо нескольких вызовов setCellValue()
.Например:
// Add some data
$rowArray = ['TGL_APLIKASI', 'CD_CABANG', 'NAMA_CABANG', 'NIP',
'NAMA_PEGAWAI', 'JABATAN', 'NAMA_NASABAH', 'NO_REK', 'NO_CIF',
'DOB_NASABAH', 'JNS_NASABAH', 'NOMINAL', 'ID_NASABAH', 'PRODUK',
'JNS_PINJAMAN', 'JNS_USAHA', 'LAMA_USAHA', 'JNS_JAMINAN',
'PIC_NASABAH', 'TELP_NASABAH', 'NAMA_TOKO', 'KATEGORI',
'CATATAN', 'KETERANGAN', 'PIC_UNIT', 'TELP_PIC', 'KAT_PRODUK',
'PROGRESS', 'PROGRESS_NOTE'];
//add the array to the activesheet
$activeSheet->fromArray($rowArray, NULL, 'A1');
Подробнее о Установка диапазона ячеек из массива
Вы можете использовать fromArray()
для добавления результатов базы данных, но это потребуетизменение в модели.Ваша модель использует result()
, который возвращает массив объектов.Если вы вернете result_array()
, вместо этого будет легко использовать данные для применения всех строк одним вызовом.
Измените последнюю строку function get_aplikasi_m()
на эту
return $this->db->get()->result_array();
Youхотя есть два осложнения.Во-первых, форматирование даты в первом столбце.Вы можете и, возможно, должны пересмотреть свой запрос, чтобы сделать это во время поиска данных.Но я не буду показывать, как это сделать.
Второе осложнение - добавление элементов $data_pic
.Было бы проще, если бы App_m->detilpic_m()
вернул result_array()
, но я продолжу с этим как есть.
Добавление строк и столбцов из данных модели выглядит следующим образом.
$data_aplikasi = $this->Io_excel_m->get_aplikasi_m();
if (count($data_aplikasi) > 0)
{
//walk through all records to format date and add pic data
foreach ($data_aplikasi as $key => $row_aplikasi)
{
// format the date and make sure the
// main array is updated with the change
$data_aplikasi[$key]['tglaplikasi'] = date("d/m/Y", strtotime($row_aplikasi['tglaplikasi']));
$data_pic = $this->App_m->detilpic_m($row_aplikasi['idpic']);
//make an array from $data_pic values
$pic_data = [$data_pic->nama_user, $data_pic->nomorhp];
//get the index where pic data should be inserted
$index = array_search("keterangan", array_keys($row_aplikasi));
// insert $pic_data into $row_aplikasi at the right place
// and update the model result at the same time
$data_aplikasi[$key] = array_splice($row_aplikasi, $index, 0, $pic_data);
}
//add $data_aplikasi array to the activesheet with one call
$activeSheet->fromArray($data_aplikasi, NULL, 'A2');
}
else
{
$activeSheet->setCellValue('A2', 'No Record Found');
}
Я надеюсь, что комментарии проясняют, что происходит.Вот вся функция, поэтому вы можете увидеть все сразу.
public function download_aplikasi()
{
$this->Weblog_m->save_log_m("Download aplikasi");
// Create new PHPExcel object
$objPHPExcel = new PHPExcel();
// A new workbook always sets the active sheet index to the first sheet
// Capture the "active sheet" object sheet
$activeSheet = $objPHPExcel->getActiveSheet();
// Name the worksheet
$activeSheet->setTitle('Aplikasi');
$activeSheet->getStyle('1:1')->getFont()->setBold(true);
// Add some data
$rowArray = ['TGL_APLIKASI', 'CD_CABANG', 'NAMA_CABANG', 'NIP',
'NAMA_PEGAWAI', 'JABATAN', 'NAMA_NASABAH', 'NO_REK', 'NO_CIF',
'DOB_NASABAH', 'JNS_NASABAH', 'NOMINAL', 'ID_NASABAH', 'PRODUK',
'JNS_PINJAMAN', 'JNS_USAHA', 'LAMA_USAHA', 'JNS_JAMINAN',
'PIC_NASABAH', 'TELP_NASABAH', 'NAMA_TOKO', 'KATEGORI',
'CATATAN', 'KETERANGAN', 'PIC_UNIT', 'TELP_PIC', 'KAT_PRODUK',
'PROGRESS', 'PROGRESS_NOTE'];
//add the array to the activesheet
$activeSheet->fromArray($rowArray, NULL, 'A1');
$data_aplikasi = $this->Io_excel_m->get_aplikasi_m();
if (count($data_aplikasi) > 0)
{
//walk through all records to format date and add pic data
foreach ($data_aplikasi as $key => $row_aplikasi)
{
// format the date and make sure the
// main array is updated with the change
$data_aplikasi[$key]['tglaplikasi'] = date("d/m/Y", strtotime($row_aplikasi['tglaplikasi']));
$data_pic = $this->App_m->detilpic_m($row_aplikasi['idpic']);
//make an array from $data_pic values
$pic_data = [$data_pic->nama_user, $data_pic->nomorhp];
//get the index where pic data should be inserted
$index = array_search("keterangan", array_keys($row_aplikasi));
// insert $pic_data into $row_aplikasi at the right place
// and update the model result at the same time
$data_aplikasi[$key] = array_splice($row_aplikasi, $index, 0, $pic_data);
}
//add $data_aplikasi array to the activesheet with one call
$activeSheet->fromArray($data_aplikasi, NULL, 'A2');
}
else
{
$activeSheet->setCellValue('A2', 'No Record Found');
}
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="Aplikasi_'.$this->input->post("bulan_kinerja").'.xlsx"');
header('Cache-Control: max-age=0');
header('Cache-Control: max-age=1');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past
header('Cache-Control: cache, must-revalidate'); // HTTP/1.1
header('Pragma: public'); // HTTP/1.0
$objWriter = IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save('php://output');
//Don't use exit, let CI finish as designed by letting the controller return
//exit;
}
Я предположил, что $this->Io_excel_m->get_aplikasi_m()
возвращает поля в том порядке, в котором вы использовали их в исходном коде.Если поля расположены не в этом порядке, вам придется либо переставить $data_aplikasi
, либо изменить запрос, чтобы поля находились в нужном вам порядке.Лично я бы сделал второе.
Трудно сказать наверняка, но похоже, что вы могли бы изменить запрос (используя JOIN), чтобы получить поля $data_pic
во время вызова get_aplikasi_m()
,
Поле даты может быть возвращено из запроса также в нужном вам формате.
Эти два изменения модели устранят цикл foreach
, используемый для изменения data_aplikasi
.Выполнение будет быстрее, потому что вы удалите тысячи вызовов базы данных, чтобы получить $data_pic
.Как правило, лучше не делать запросы внутри цикла - это требует много системных ресурсов и времени.
Я не тестировал этот код (нет данных), поэтому вполне возможно, что есть логические и синтаксические ошибки.,Концепция звучит и является техникой, которую я успешно использовал.