PhpSpreadsheet 使用循环填充单元格

ode*_*dta 2 php spreadsheet phpspreadsheet

我正在使用 PHP 库PhpSpreadsheet并希望使用 MySQL 表中的数据填充电子表格 (xlsx),使用循环遍历单元格和行,类似于以下内容:

.------------------------.
|ID first_name last_name |
|1  John       Smith     |
|2  John       Doe       |
`------------------------`
Run Code Online (Sandbox Code Playgroud)

我的表将第一行作为标题(粗体文本),下面的行将是来自 MySQL 的数据。

这是我为此目的编写的脚本:

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

$spreadsheet = new Spreadsheet();
$spreadsheet->getActiveSheet()->getStyle('A1:C1')->getFont()->setBold( true );

$header_row_array = ['ID', 'First Name', 'Last Name'];
$spreadsheet->getActiveSheet()->fromArray( $header_row_array, NULL, 'A1' );

global $wpdb;
$query = 'SELECT * FROM custom_table WHERE DATE( ts ) BETWEEN SUBDATE( NOW(), 1) and NOW()';
$rows = $wpdb->get_results( $query, OBJECT );

foreach( $rows as $row ) {
    for( $i = 2; $i <= count( $rows ) + 1; $i++ ) {
        foreach( range( 'A', 'C' ) as $v ) {
            switch( $v ) {
                case 'A': {
                    $value = $row->id;
                    break;
                }
                case 'B': {
                    $value = $row->first_name;
                    break;
                }
                case 'C': {
                    $value = $row->last_name;
                    break;
                }
            }
            $spreadsheet->getActiveSheet()->setCellValue( $v . $i, $value );
        }
    }
    //echo '<pre>';var_dump( $row );echo '</pre>';
}

$writer = new Xlsx( $spreadsheet );
$writer->save( 'test.xlsx' );
Run Code Online (Sandbox Code Playgroud)

我也认为这些循环是解决这个问题的粗略方法,如果您对改进有任何想法,请分享!

我得到的结果是:
每一行都有相同的行数据,就好像外循环并没有真正循环遍历项目。

请指教。
谢谢

小智 5

我知道现在有点晚了,但我想分享我对同样问题的解决方法。我从你已经从数据库中获取数据的地方开始:

$header_row_array = ['ID', 'First Name', 'Last Name'];
$spreadsheet->getActiveSheet()->fromArray( $header_row_array);
Run Code Online (Sandbox Code Playgroud)

由于它是您在电子表格中插入的第一行,因此不需要将所有参数传递给fromArray(),只需将包含每个列标题的数组传递给。

接下来要做的是遍历$rows. 使用一个fromArray()和一个foreach语句,您可以得到这个,只需添加一个counter(不是最优雅的解决方案,但实用)。

$count = 2;
foreach($rows as $row){
    $spreadsheet->getActiveSheet()->fromArray(array($row->id, $row->first_name, $row->last_name), null, 'A'.$count);
    $count++;
}
Run Code Online (Sandbox Code Playgroud)

就像插入标题行时所做的那样,我只是传递A当前行中第一列 ( )的单元格(记住$count从 开始2),该方法将相关数据放在同一行的连续单元格中。计数器从 2 开始,因为A1标题行已经使用了它,所以它A2从那里开始并从那里开始总结。

我希望它有帮助!