使用 Gridview Yii2 中的数据将数据导出到 excel



嗨,我在这里遇到了问题

在我找到一种从 GridView 检索 ID 数据的方法后,现在我的问题是将数据导出到 Excel。 这是我在控制器中的代码

public function actionCetakdispo()
{
$selection=(array)Yii::$app->request->post('selection');    
$template = Yii::getAlias("@webroot") . "/template/dispo.xlsx";
$spreadsheet = PhpOfficePhpSpreadsheetIOFactory::load($template);
$worksheet = $spreadsheet->getActiveSheet();//typecasting
foreach($selection as $id){
$suratmasuks = Smwp::findOne((int)$id);        
$baserow = 5;
$no = 1;
foreach($suratmasuks as $suratmasuk){
$row = $no + $baserow;
$worksheet->getCell('A'. $row)->setValue($no);
$worksheet->getCell('B'. $row)->setValue($suratmasuk->jenis_surat);
$worksheet->getCell('C'. $row)->setValue($suratmasuk->perihal);
$no++;
}
}
$writer = PhpOfficePhpSpreadsheetIOFactory::createWriter($spreadsheet, 'Xlsx');
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="dispo.xlsx"');
header('Cache-Control: max-age=0');
Yii::$app->session->setFlash('success', 'berhasil download!');
$writer->save('php://output');      
exit;
}

它显示一个错误:试图获取非对象的属性"jenis_surat"。 如果我print_r($surat_Masuks(,它的显示是这样的:

appmodelsSmWp Object (
[_attributes:yiidbBaseActiveRecord:private] => Array (
[id] => 4
[id_mfwp] => 1
[id_user] => 3
[tgl_surat] => 2019-10-08 00:00:00
[tgl_terima] => 2019-10-15 00:00:00
[tgl_cetak] => 2019-10-14 00:00:00
[nomor_surat] => kksksk
[no_agenda] => 992929
[jenis_surat] => 3
[perihal] => balasan surat kami
[lokasi_scan] => 
[ket_dispo] => kerjakan
[index_cetak_dispo] => 0
[index_cetak_reg] => 0
)
[_oldAttributes:yiidbBaseActiveRecord:private] => Array (
[id] => 4
[id_mfwp] => 1
[id_user] => 3
[tgl_surat] => 2019-10-08 00:00:00
[tgl_terima] => 2019-10-15 00:00:00
[tgl_cetak] => 2019-10-14 00:00:00
[nomor_surat] => kksksk
[no_agenda] => 992929
[jenis_surat] => 3
[perihal] => balasan surat kami
[lokasi_scan] => 
[ket_dispo] => kerjakan
[index_cetak_dispo] => 0
[index_cetak_reg] => 0
)
[_related:yiidbBaseActiveRecord:private] => Array ( ) 
[_relationsDependencies:yiidbBaseActiveRecord:private] => Array ( ) 
[_errors:yiibaseModel:private] => 
[_validators:yiibaseModel:private] => 
[_scenario:yiibaseModel:private] => default 
[_events:yiibaseComponent:private] => Array ( ) 
[_eventWildcards:yiibaseComponent:private] => Array ( ) 
[_behaviors:yiibaseComponent:private] => Array ( )
) 

谢谢解释..

编辑:这是我的网格视图代码

<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
['class' => 'yiigridSerialColumn',],
'id',
'kategori',
'nama_wp',
'nama',             
'nomor_surat', 
'tgl_surat',
'perihal',
'ket',
['class' => 'yiigridCheckboxColumn', 'checkboxOptions' => function($model, $key, $index, $widget) {
return ['value' => $model['id'] ];
},],
],
]); ?>

方法findOne将始终只返回 Smwp 模型的一个实例。不是多个模型的数组。

$suratmasuks = Smwp::findOne((int)$id);

因为yiidbActiveRecord实现了IteratorAgregate接口(参见文档(,所以你可以在foreach中使用它,如下所示:

foreach ($suratmasuks as $suratmasuk) {
// ...
}

但是在$suratmasuk中,不会是Smwp的实例,而是findOne加载的那个实例的属性值。

您可以使用以下查找加载所有模型并摆脱外部foreach。

$suratmasuks = Smwp::find()
->where(['id' => $selection])
->all();

您的整个代码可能看起来像

public function actionCetakdispo()
{
$selection=(array)Yii::$app->request->post('selection');    
$template = Yii::getAlias("@webroot") . "/template/dispo.xlsx";
$spreadsheet = PhpOfficePhpSpreadsheetIOFactory::load($template);
$worksheet = $spreadsheet->getActiveSheet();//typecasting
$suratmasuks = Smwp::find()
->where(['id' => $selection])
->all();        
$baserow = 5;
$no = 1;
foreach($suratmasuks as $suratmasuk){
$row = $no + $baserow;
$worksheet->getCell('A'. $row)->setValue($no);
$worksheet->getCell('B'. $row)->setValue($suratmasuk->jenis_surat);
$worksheet->getCell('C'. $row)->setValue($suratmasuk->perihal);
$no++;
}
$writer = PhpOfficePhpSpreadsheetIOFactory::createWriter($spreadsheet, 'Xlsx');
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="dispo.xlsx"');
header('Cache-Control: max-age=0');
Yii::$app->session->setFlash('success', 'berhasil download!');
$writer->save('php://output');      
exit;
}

如果你想继续加载模型,你应该去掉内部foreach,像这样输出它:

$baserow = 5;
$no = 1;
foreach($selection as $id){
$suratmasuks = Smwp::findOne((int)$id);            
$row = $no + $baserow;
$worksheet->getCell('A'. $row)->setValue($no);
$worksheet->getCell('B'. $row)->setValue($suratmasuks->jenis_surat);
$worksheet->getCell('C'. $row)->setValue($suratmasuks->perihal);
$no++;
}

但这意味着您的脚本将对数据库执行更多查询,因此第一种方法更好。

最新更新