Создание Excel из SQL через PHP

Я использую следующий код для создания excel из sql через php. Это модифицированная версия рабочего кода.

РАБОЧИЙ КОД (БЕЗ ОШИБКИ)

<?php
//documentation on the spreadsheet package is at:
//http://pear.php.net/manual/en/package.fileformats.spreadsheet-excel-writer.php
chdir('phpxls');
require_once 'Writer.php';
chdir('..');

$sheet1 =  array(
  array('eventid','eventtitle'       ,'datetime'           ,'description'      ,'notes'      ),
  array('5'      ,'Education Seminar','2010-05-12 08:00:00','Increase your WPM',''           ),
  array('6'      ,'Work Party'       ,'2010-05-13 15:30:00','Boss\'s Bday'     ,'bring tacos'),
  array('7'      ,'Conference Call'  ,'2010-05-14 11:00:00','access code x4321',''           ),
  array('8'      ,'Day Off'          ,'2010-05-15'         ,'Go to Home Depot' ,''           ),
);

$sheet2 =  array(
  array('eventid','funny_name'   ),
  array('32'      ,'Adam Baum'    ),
  array('33'      ,'Anne Teak'    ),
  array('34'      ,'Ali Katt'     ),
  array('35'      ,'Anita Bath'   ),  
  array('36'      ,'April Schauer'),
  array('37'      ,'Bill Board'   ),
);

$workbook = new Spreadsheet_Excel_Writer();

$format_und =& $workbook->addFormat();
$format_und->setBottom(2);//thick
$format_und->setBold();
$format_und->setColor('black');
$format_und->setFontFamily('Arial');
$format_und->setSize(8);

$format_reg =& $workbook->addFormat();
$format_reg->setColor('black');
$format_reg->setFontFamily('Arial');
$format_reg->setSize(8);

$arr = array(
      'Calendar'=>$sheet1,
      'Names'   =>$sheet2,
      );

foreach($arr as $wbname=>$rows)
{
    $rowcount = count($rows);
    $colcount = count($rows[0]);

    $worksheet =& $workbook->addWorksheet($wbname);

    $worksheet->setColumn(0,0, 6.14);//setColumn(startcol,endcol,float)
    $worksheet->setColumn(1,3,15.00);
    $worksheet->setColumn(4,4, 8.00);

    for( $j=0; $j<$rowcount; $j++ )
    {
        for($i=0; $i<$colcount;$i++)
        {
            $fmt  =& $format_reg;
            if ($j==0)
                $fmt =& $format_und;

            if (isset($rows[$j][$i]))
            {
                $data=$rows[$j][$i];
                $worksheet->write($j, $i, $data, $fmt);
            }
        }
    }
}

$workbook->send('test.xls');
$workbook->close();

//-----------------------------------------------------------------------------
?>

ИЗМЕНЕННЫЙ КОД ДЛЯ ПОЛУЧЕНИЯ ДАННЫХ ИЗ БАЗЫ ДАННЫХ (КОТОРЫЙ ПОКАЗЫВАЕТ ОШИБКУ)

<?php

    $numrow12 = mysql_query("SELECT * FROM mastertable WHERE pdfstatus = 1 ORDER BY tstamp DESC"); 

    mysql_select_db("brainoidultrafb", $link);
    chdir('phpxls');
    require_once 'Writer.php';
    chdir('..');

    while($row = mysql_fetch_array($numrow12)) {
        $sheet1 =  array(
      array('StudentID','Students Email' ,'Diagnosis','TimeStamp' ,),
      array($row['student_id'] ,$row['email_id'],$row['diagnosis'],$row['tstamp'],),
    );

    } 



    $workbook = new Spreadsheet_Excel_Writer();

    $format_und =& $workbook->addFormat();
    $format_und->setBottom(2);//thick
    $format_und->setBold();
    $format_und->setColor('black');
    $format_und->setFontFamily('Arial');
    $format_und->setSize(8);

    $format_reg =& $workbook->addFormat();
    $format_reg->setColor('black');
    $format_reg->setFontFamily('Arial');
    $format_reg->setSize(8);

    $arr = array(
          'Calendar'=>$sheet1,
              );

    foreach($arr as $wbname=>$rows)
    {
        $rowcount = count($rows);
        $colcount = count($rows[0]);

        $worksheet =& $workbook->addWorksheet($wbname);

        $worksheet->setColumn(0,0, 6.14);//setColumn(startcol,endcol,float)
        $worksheet->setColumn(1,3,15.00);
        $worksheet->setColumn(4,4, 8.00);

        for( $j=0; $j<$rowcount; $j++ )
        {
            for($i=0; $i<$colcount;$i++)
            {
                $fmt  =& $format_reg;
                if ($j==0)
                    $fmt =& $format_und;

                if (isset($rows[$j][$i]))
                {
                    $data=$rows[$j][$i];
                    $worksheet->write($j, $i, $data, $fmt);
                }
            }
        }
    }

    $workbook->send('Submissions.xls');
    $workbook->close();

    //-----------------------------------------------------------------------------
    ?>

Он показывает следующие ошибки

Предупреждение: mysql_fetch_array() ожидает, что параметр 1 будет ресурсом, логическим значением, заданным в /home/content/58/9508458/html/psychiatric/subexcel.php в строке 13.

Предупреждение: нельзя изменить информацию заголовка — заголовки уже отправлены (вывод начался в /home/content/58/9508458/html/psychiatric/subexcel.php:13) в /home/content/58/9508458/html/psychiatric/phpxls/ Writer.php в строке 67

Предупреждение: нельзя изменить информацию заголовка — заголовки уже отправлены (вывод начался в /home/content/58/9508458/html/psychiatric/subexcel.php:13) в /home/content/58/9508458/html/psychiatric/phpxls/ Writer.php в строке 68

Предупреждение: нельзя изменить информацию заголовка — заголовки уже отправлены (вывод начался в /home/content/58/9508458/html/psychiatric/subexcel.php:13) в /home/content/58/9508458/html/psychiatric/phpxls/ Writer.php в строке 69

Предупреждение: нельзя изменить информацию заголовка — заголовки уже отправлены (вывод начался в /home/content/58/9508458/html/psychiatric/subexcel.php:13) в /home/content/58/9508458/html/psychiatric/phpxls/ Writer.php в строке 70

Предупреждение: нельзя изменить информацию заголовка — заголовки уже отправлены (вывод начался в /home/content/58/9508458/html/psychiatric/subexcel.php:13) в /home/content/58/9508458/html/psychiatric/phpxls/ Writer.php в строке 71


person Tom    schedule 05.07.2012    source источник
comment
Этот запрос: SELECT * FROM mastertable WHERE pdfstatus = 1 ORDER BY tstamp DESC вероятно, не удался. mastertable существует?   -  person Ry-♦    schedule 05.07.2012
comment
да... работает нормально... этот запрос был взят с другой страницы, все работало нормально   -  person Tom    schedule 05.07.2012


Ответы (2)


Прямо сейчас вы выбираете базу данных после попытки запроса к базе данных:

$numrow12 = mysql_query("SELECT * FROM mastertable WHERE pdfstatus = 1 ORDER BY tstamp DESC");

mysql_select_db("brainoidultrafb", $link);

Это не сработает. Просто поменяйте порядок, чтобы выбрать базу данных, затем запросить ее:

mysql_select_db("brainoidultrafb", $link);

$numrow12 = mysql_query("SELECT * FROM mastertable WHERE pdfstatus = 1 ORDER BY tstamp DESC");

Что касается вашей второй проблемы, вы перезаписываете $sheet1 на каждой итерации цикла. Сделайте это вместо этого:

$sheet1 = array(
    array('StudentID','Students Email' ,'Diagnosis','TimeStamp' ,)
);

while($row = mysql_fetch_array($numrow12)) {
    $sheet1[] = array($row['student_id'], $row['email_id'], $row['diagnosis'], $row['tstamp'],);
}
person Ry-♦    schedule 05.07.2012
comment
Извините, перепутал .. Эй, спасибо, все работает нормально, но показывает только одну строку таблицы в файле excel - person Tom; 05.07.2012
comment
@Tom Я думаю, что в цикле while вы снова присваиваете значение sheet1 новому массиву. SO он будет содержать только последнее значение в выполнении цикла while. Вы можете проверить это - person Sabari; 05.07.2012
comment
@Tom: вы перезаписываете $sheet1 каждый раз в цикле; см. редактирование. - person Ry-♦; 05.07.2012
comment
но когда я добавил цикл while внутри первого массива, я показал ошибку, так как это не формат массива? Как я могу это исправить ? Я надеюсь, вы понимаете, какой вывод необходим - person Tom; 05.07.2012
comment
@minitech ЭТО РАБОТАЕТ ОТЛИЧНО, КАК Я ХОТЕЛА .. СПАСИБО :) :) - person Tom; 05.07.2012
comment
@Tom: Рад, что ты разобрался :) В чем была проблема в прошлый раз? - person Ry-♦; 05.07.2012
comment
$sheet1 = array( array('StudentID','Email для учащихся','Diagnosis','TimeStamp',) while($row = mysql_fetch_array($numrow12)) { $sheet1[] = array($row['student_id' ], $row['email_id'], $row['диагноз'], $row['tstamp'],); } ); - person Tom; 05.07.2012

Для второй задачи используйте: $sheet1[] =

Чтобы добавить элементы в массив $sheet1. В настоящее время вы заменяете его после каждой итерации цикла.

Вы, вероятно, захотите инициализировать $sheet1 вне цикла while, чтобы также избежать предупреждений. $sheet1 = array();

person Koobz    schedule 05.07.2012