PhpSpreadsheet 使用循环填充单元格
PhpSpreadsheet Populate cells using a loop
我正在使用 PHP 库 PhpSpreadsheet 并希望使用来自 MySQL table 的数据填充电子表格 (xlsx),使用循环遍历单元格和行,类似于此:
.------------------------.
|ID first_name last_name |
|1 John Smith |
|2 John Doe |
`------------------------`
我的 table 的第一行将是 header(粗体文本),下面的行将是来自 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' );
我也认为这些循环是解决这个问题的粗略方法,如果您有任何改进的想法请分享!
我得到的结果是:
每一行都是相同的行数据,就好像外循环并没有真正循环遍历项目一样。
请指教
谢谢
问题出在你的循环上。
$rows = [
['id'=> 1, 'first_name'=> 'John', 'last_name'=> 'Smith'],
['id'=> 2, 'first_name'=> 'Jane', 'last_name'=> 'Doe'],
];
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;
$value = $row['id'];
break;
}
case 'B': {
// $value = $row->first_name;
$value = $row['first_name'];
break;
}
case 'C': {
// $value = $row->last_name;
$value = $row['last_name'];
break;
}
}
print $v.$i.' : '. $value . "\n";
}
print '--------' . "\n";
}
}
return
A2 : 1
B2 : John
C2 : Smith
--------
A3 : 1
B3 : John
C3 : Smith
--------
A2 : 2
B2 : Jane
C2 : Doe
--------
A3 : 2
B3 : Jane
C3 : Doe
--------
编辑
想不到这里是解决方案
$i = 2;
foreach( $rows as $row ) {
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;
}
}
print $v.$i.' : '. $value . "\n";
}
$i++;
}
输出
A2 : 1
B2 : John
C2 : Smith
A3 : 2
B3 : Jane
C3 : Doe
我知道有点晚了,但我想分享我对同一问题的解决方法。我从您已经从数据库中获取数据的地方开始:
$header_row_array = ['ID', 'First Name', 'Last Name'];
$spreadsheet->getActiveSheet()->fromArray( $header_row_array);
因为它是您在电子表格中插入的第一行,所以不必将所有参数传递给 fromArray()
,只需传递包含每个列的 header 的数组即可。
接下来要做的是遍历 $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++;
}
就像插入 header 行时所做的那样,我只是传递当前行中第一列 (A
) 的单元格(记住 $count
从 [=19 开始=]), 该方法将相关数据放在同一行的连续单元格中。计数器从 2 开始,因为 A1
已被 header 行使用,因此它从 A2
开始并从那里求和。
希望对您有所帮助!
我正在使用 PHP 库 PhpSpreadsheet 并希望使用来自 MySQL table 的数据填充电子表格 (xlsx),使用循环遍历单元格和行,类似于此:
.------------------------.
|ID first_name last_name |
|1 John Smith |
|2 John Doe |
`------------------------`
我的 table 的第一行将是 header(粗体文本),下面的行将是来自 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' );
我也认为这些循环是解决这个问题的粗略方法,如果您有任何改进的想法请分享!
我得到的结果是:
每一行都是相同的行数据,就好像外循环并没有真正循环遍历项目一样。
请指教
谢谢
问题出在你的循环上。
$rows = [
['id'=> 1, 'first_name'=> 'John', 'last_name'=> 'Smith'],
['id'=> 2, 'first_name'=> 'Jane', 'last_name'=> 'Doe'],
];
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;
$value = $row['id'];
break;
}
case 'B': {
// $value = $row->first_name;
$value = $row['first_name'];
break;
}
case 'C': {
// $value = $row->last_name;
$value = $row['last_name'];
break;
}
}
print $v.$i.' : '. $value . "\n";
}
print '--------' . "\n";
}
}
return
A2 : 1
B2 : John
C2 : Smith
--------
A3 : 1
B3 : John
C3 : Smith
--------
A2 : 2
B2 : Jane
C2 : Doe
--------
A3 : 2
B3 : Jane
C3 : Doe
--------
编辑
想不到这里是解决方案
$i = 2;
foreach( $rows as $row ) {
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;
}
}
print $v.$i.' : '. $value . "\n";
}
$i++;
}
输出
A2 : 1
B2 : John
C2 : Smith
A3 : 2
B3 : Jane
C3 : Doe
我知道有点晚了,但我想分享我对同一问题的解决方法。我从您已经从数据库中获取数据的地方开始:
$header_row_array = ['ID', 'First Name', 'Last Name'];
$spreadsheet->getActiveSheet()->fromArray( $header_row_array);
因为它是您在电子表格中插入的第一行,所以不必将所有参数传递给 fromArray()
,只需传递包含每个列的 header 的数组即可。
接下来要做的是遍历 $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++;
}
就像插入 header 行时所做的那样,我只是传递当前行中第一列 (A
) 的单元格(记住 $count
从 [=19 开始=]), 该方法将相关数据放在同一行的连续单元格中。计数器从 2 开始,因为 A1
已被 header 行使用,因此它从 A2
开始并从那里求和。
希望对您有所帮助!