PhpSpreadsheet Заполните ячейки с помощью цикла - PullRequest
0 голосов
/ 28 ноября 2018

Я использую библиотеку PHP PhpSpreadsheet и хотел бы заполнить электронную таблицу (xlsx), используя данные из таблицы MySQL, используя цикл для итерации по ячейкам и строкам, что-то похожее на это:

.------------------------.
|ID first_name last_name |
|1  John       Smith     |
|2  John       Doe       |
`------------------------`

Моя таблица будет иметь первую строку в качестве заголовка (полужирный текст), а строки ниже будут данными из MySQL.

Вот сценарий, который я написал для этой цели:

<code>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 '
';} $ writer = new Xlsx ($ электронные таблицы);$ writer-> save ('test.xlsx');

Я также думаю, что эти циклы - грубый способ решить эту проблему, если у вас есть идеи по улучшению, поделитесь!

Результат, который я получаю:
Те же данные строки в каждой строке, как если бы внешний цикл на самом деле не перебирает элементы.

Пожалуйста, сообщите.
Спасибо

1 Ответ

0 голосов
/ 28 ноября 2018

Проблема возникла из ваших циклов.

$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
--------

Edit

Для не думать, вот решение

$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
...