2016-06-06 5 views
0

У меня есть PersonMapper, который считывает данные из БД и создает объекты Person (PHP Слим Framework 3):Создание PHPExcel из массива объектов

<?php 
class PersonMapper extends Mapper { 

    public function getPersons() { 
     $stmt = $this->db->query("SELECT p.id, p.firstname, p.pastname FROM persons p"); 
     $results = []; 
     while($row = $stmt->fetch()) { 
      $results[] = new Person($row); 
     } 
     return $results; 
    } 
} 

class Person implements ArrayAccess { 
    protected $id; 
    protected $firstname; 
    protected $lastname; 

    public function __construct(array $data) { 
     // no id if we're creating 
     if(isset($data['id'])) { $this->id = $data['id']; } 
     $this->firstname= $data['firstname']; 
     $this->lastname= $data['lastname']; 
    } 

    public function getId() { return $this->id; } 
    public function getFirstname() { return $this->firstname; } 
    public function getLastname() { return $this->lastname; } 

    public function offsetExists($offset) { 
     return array_key_exists($offset, $this->asArray()); 
    } 

    public function offsetGet($offset) { 
     return $this->offsetExists($offset) ? $this->asArray()[$offset]:NULL; 
    } 

    public function offsetSet($offset, $value) { 
     $this->asArray()[$offset] = $value; 
    } 

    public function offsetUnset($offset) { 
     if ($this->offsetExists($offset)) { 
      $_array = $this->asArray(); 
      unset($_array[$offset]); 
     } 
    } 

    public function asArray() { 
     return array(
      'id' => $this->id, 
      'firstname' => $this->firstname, 
      'kurzbezeichnung' => $this->lastname); 
    } 
} 

Теперь я могу получить массив объектов человека:

$mapper = new PersonMapper($this->db); 
$persons= $mapper->getPersons(); 

Теперь я хочу, чтобы поместить список лиц в файл Excel:

$excelDoc = new PHPExcel(); 
    $excelDoc->setActiveSheetIndex(0); 
    $excelDoc->getActiveSheet()->fromArray($persons, null, 'A1'); 

    $writer = PHPExcel_IOFactory::createWriter($excelDoc, 'Excel2007'); 
    $writer->save("persons.xlsx"); 

к сожалению, PHPExcel не может га ndle такой тип структуры данных:

Catchable fatal error: Object of class Person could not be converted to 
string in /path/to/src/vendor/phpoffice/phpexcel/Classes/ 
PHPExcel/Cell/DefaultValueBinder.php on line 65 

Любая помощь очень ценится!

+0

Я не думаю, что PHP предлагает любой способ преобразования объекта в массив автоматически. Каждый отдельный «человек» является объектом, поэтому вам, вероятно, необходимо преобразовать каждый «человек» в массив, прежде чем добавлять массив людей. – apokryfos

+0

Метод 'fromArray()' работает с массивами или массивом массивов, а не с массивом объектов (если эти объекты не реализуют [ArrayAccess] (http://www.php.net/manual/en/class.arrayaccess .php)) –

+0

Итак, класс Person должен реализовать ArrayAccess? –

ответ

0

Пожалуйста, попробуйте: As per oficial documentation, вам нужно сначала сохранить файл с объектным писателем

Пожалуйста, дайте мне знать, если это то, что вы хотели

<?php 
date_default_timezone_set('America/Los_Angeles'); 

require_once('PHPExcel.php'); 

$sheet = array(
    array(
     'a1 data', 
     'b1 data', 
     'c1 data', 
     'd1 data', 
    ) 
); 

    $doc = new PHPExcel(); 
    $doc->setActiveSheetIndex(0); 

    $doc->getActiveSheet()->fromArray($sheet, null, 'A1'); 
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); 
header('Content-Disposition: attachment;filename="your_name.xls"'); 
header('Cache-Control: max-age=0'); 

    // Do your stuff here 
    $writer = PHPExcel_IOFactory::createWriter($doc, 'Excel5'); 

$writer->save('php://output'); 
?> 
+0

Я могу написать идеальный файл excel, пока я не пытаюсь помещать пользовательские объекты в файл. Я предполагаю, что мне нужно позаботиться о том, чтобы объекты были преобразованы в массивы (см. Комментарии к моему оригинальному сообщению). –

0

После реализации ArrayAccess вам нужно всего лишь перебрать каждый из ваших лиц и передать человека из массива в массив.

я протестирована со следующими строками кода, и она работала:

Заменить эту часть $excelDoc->getActiveSheet()->fromArray($persons, null, 'A1'); с этим

$i = 1; 
foreach ($persons as $person) { 
    $excelDoc->getActiveSheet()->fromArray((array)$person, null, "A" . $i++); 
} 

Это будет вставить ID, Firstname и kurzbezeichnung в клетках А, В и С для каждого person

Смежные вопросы