Как я должен идти об экспорте данных MYSQL в Excel, используя PHP Excel - PullRequest
1 голос
/ 25 января 2012

Это может быть довольно необычный вопрос, но я действительно застрял здесь. Я читаю данные из базы данных MYSQL и создаю таблицу из этих данных через PHP с помощью Echo. Теперь я хотел бы перейти к следующему шагу и экспортировать эти данные (данные в таблице) в документ Excel. Мне действительно нравится, как работает PHPExcel, и насколько он прост, но мне трудно найти наиболее эффективный способ получения данных и поместить их в документ Excel. Конечно, я не хочу вручную выписывать «A1», «A1 data» вплоть до Z1000 - поймать мою точку зрения? Я считаю, что я должен пройти через все. Теперь вот где вопрос становится сложным; Есть ли какой-то способ (имейте в виду, что это нужно сделать через PHP), чтобы прочитать ячейку таблицы за ячейкой (цикл) и присвоить значения массиву, а затем просто перебрать массив, как A1, arr [0] и т. д.?

Я подумал, что мне придется использовать JavaScript для чтения ячейки таблицы за ячейкой, но как мне назначить данные в массив, чтобы затем использовать их как часть сценария PHP - поскольку PHPExcel написан в PHP.

Имеет ли этот вопрос смысл для кого-либо из вас, или я упускаю здесь много информации? Дайте мне знать, и я смогу отредактировать этот вопрос, чтобы он стал более понятным для всех вас.

Ответы [ 3 ]

3 голосов
/ 25 января 2012

Идеальным решением является создание независимого от платформы файла "Excel", который может быть открыт любой программой для работы с электронными таблицами или текстовым редактором (не только в Excel). Под этим я подразумеваю базовый файл CSV.

К счастью, внешние библиотеки не нужны: в PHP есть несколько встроенных функций для чтения / записи файлов CSV. Итак, шаги по извлечению данных из базы данных в Excel-читаемый CSV-файл:

  1. Запрос БД и итерации по результатам: mysql_result документы
  2. Внутри цикла, который перебирает результаты DB, используйте fputcsv docs для записи файла csv.

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

Допустим, вы хотите, чтобы csv являлся фактическим содержимым создаваемой вами страницы. Я имею в виду, что вы хотите, чтобы браузер обрабатывал файл PHP так, как если бы он сам был файлом CSV .

Хранение файла CSV в памяти, а не на диске

Вместо того, чтобы использовать настоящий дескриптор файла для записи csv в ваших fputcsv операциях, откройте дескриптор файла в памяти, чтобы сделать то же самое. Это имеет преимущество в том, что выполняется быстрее, чем запись на диск. Чтобы открыть дескриптор файла в памяти для использования в fputcsv вызовах, вы должны сделать:

$tmp_handle = fopen('php://temp', 'r+');

Это откроет дескриптор файла в памяти, а не в файловой системе. Обратите внимание, что как только дескриптор файла достигнет значения по умолчанию 2 МБ в файловом размере, PHP переключит его прозрачно во временный файл в файловой системе. Вы можете избежать этого и заставить дескриптор файла оставаться в памяти, используя вместо этого:

$tmp_handle = fopen('php://memory', 'r+');

Затем вы будете использовать этот дескриптор в своих звонках на fputcsv:

fputcsv($tmp_handle, $fields);

Подробнее о php://memory и php://temp вы можете узнать в PHP-справке по теме .

Заставить браузер думать, что это CSV-файл

Последнее, что вам нужно сделать, чтобы убедить браузер, что страница на самом деле является файлом csv после того, как вы сгенерировали данные, это отправить правильные заголовки типа содержимого HTTP вместе с вашими данными:

// generate my csv data here

header('Content-type: text/csv');
header('Content-disposition: attachment;filename=MyVerySpecial.csv');

// reset the file handle's pointer to the beginning of the stream
rewind($tmp_handle);

// output the contents of the file handle to the browser
echo stream_get_contents($tmp_handle);
0 голосов
/ 11 мая 2013
<?php

//EDIT YOUR MySQL Connection Info:
$DB_Server = "localhost";        //your MySQL Server
$DB_Username = "root";                 //your MySQL User Name
$DB_Password = "";                //your MySQL Password
$DB_DBName = "school";                //your MySQL Database Name
$DB_TBLName = "s_question";                //your MySQL Table Name

if(isset($_POST['exp_stdque'])) {
    $exstdid = $_POST['expstd'];

//$DB_TBLName,  $DB_DBName, may also be commented out & passed to the browser
//as parameters in a query string, so that this code may be easily reused for
//any MySQL table or any MySQL database on your server

//DEFINE SQL QUERY:
//edit this to suit your needs
$sql = "Select * from $DB_TBLName WHERE std_id = $exstdid";

//Optional: print out title to top of Excel or Word file with Timestamp
//for when file was generated:
//set $Use_Titel = 1 to generate title, 0 not to use title
$Use_Title = 1;
//define date for title: EDIT this to create the time-format you need
$now_date = DATE('m-d-Y H:i');
//define title for .doc or .xls file: EDIT this if you want
$title = "Dump For Table $DB_TBLName from Database $DB_DBName on $now_date";
/*

Leave the connection info below as it is:
just edit the above.

(Editing of code past this point recommended only for advanced users.)
*/
//create MySQL connection
$Connect = @MYSQL_CONNECT($DB_Server, $DB_Username, $DB_Password)
     or DIE("Couldn't connect to MySQL:<br>" . MYSQL_ERROR() . "<br>" . MYSQL_ERRNO());
//select database
$Db = @MYSQL_SELECT_DB($DB_DBName, $Connect)
     or DIE("Couldn't select database:<br>" . MYSQL_ERROR(). "<br>" . MYSQL_ERRNO());
//execute query
$result = @MYSQL_QUERY($sql,$Connect)
     or DIE("Couldn't execute query:<br>" . MYSQL_ERROR(). "<br>" . MYSQL_ERRNO());

//if this parameter is included ($w=1), file returned will be in word format ('.doc')
//if parameter is not included, file returned will be in excel format ('.xls')
IF (ISSET($w) && ($w==1))
{
     $file_type = "msword";
     $file_ending = "doc";
}ELSE {
     $file_type = "vnd.ms-excel";
     $file_ending = "xls";
}
//header info for browser: determines file type ('.doc' or '.xls')
HEADER("Content-Type: application/$file_type");
HEADER("Content-Disposition: attachment; filename=database_dump.$file_ending");
HEADER("Pragma: no-cache");
HEADER("Expires: 0");

/*    Start of Formatting for Word or Excel    */

IF (ISSET($w) && ($w==1)) //check for $w again
{
     /*    FORMATTING FOR WORD DOCUMENTS ('.doc')   */
     //create title with timestamp:
     IF ($Use_Title == 1)
     {
         ECHO("$title\n\n");
     }
     //define separator (defines columns in excel & tabs in word)
     $sep = "\n"; //new line character

     WHILE($row = MYSQL_FETCH_ROW($result))
     {
         //set_time_limit(60); // HaRa
         $schema_insert = "";
         FOR($j=0; $j<mysql_num_fields($result);$j++)
         {
         //define field names
         $field_name = MYSQL_FIELD_NAME($result,$j);
         //will show name of fields
         $schema_insert .= "$field_name:\t";
             IF(!ISSET($row[$j])) {
                 $schema_insert .= "NULL".$sep;
                 }
             ELSEIF ($row[$j] != "") {
                 $schema_insert .= "$row[$j]".$sep;
                 }
             ELSE {
                 $schema_insert .= "".$sep;
                 }
         }
         $schema_insert = STR_REPLACE($sep."$", "", $schema_insert);
         $schema_insert .= "\t";
         PRINT(TRIM($schema_insert));
         //end of each mysql row
         //creates line to separate data from each MySQL table row
         PRINT "\n----------------------------------------------------\n";
     }
}ELSE{
     /*    FORMATTING FOR EXCEL DOCUMENTS ('.xls')   */
     //create title with timestamp:
     IF ($Use_Title == 1)
     {
         ECHO("$title\n");
     }
     //define separator (defines columns in excel & tabs in word)
     $sep = "\t"; //tabbed character

     //start of printing column names as names of MySQL fields
     FOR ($i = 0; $i < MYSQL_NUM_FIELDS($result); $i++)
     {
         ECHO MYSQL_FIELD_NAME($result,$i) . "\t";
     }
     PRINT("\n");
     //end of printing column names

     //start while loop to get data
     WHILE($row = MYSQL_FETCH_ROW($result))
     {
         //set_time_limit(60); // HaRa
         $schema_insert = "";
         FOR($j=0; $j<mysql_num_fields($result);$j++)
         {
             IF(!ISSET($row[$j]))
                 $schema_insert .= "NULL".$sep;
             ELSEIF ($row[$j] != "")
                 $schema_insert .= "$row[$j]".$sep;
             ELSE
                 $schema_insert .= "".$sep;
         }
         $schema_insert = STR_REPLACE($sep."$", "", $schema_insert);
         //following fix suggested by Josue (thanks, Josue!)
         //this corrects output in excel when table fields contain \n or \r
         //these two characters are now replaced with a space
         $schema_insert = PREG_REPLACE("/\r\n|\n\r|\n|\r/", " ", $schema_insert);
         $schema_insert .= "\t";
         PRINT(TRIM($schema_insert));
         PRINT "\n";
     }
}
}

?>
0 голосов
/ 25 января 2012

У меня есть предложение.Например, если кто-то нажимает кнопку экспорта, вы отправляете запрос POST на страницу PHP и делаете тот же запрос, который вы делали, чтобы получить данные из MySQL.Один вы получаете набор данных.Вы можете просто зациклить их и написать, чтобы преуспеть.В приведенном ниже коде $dataset - это набор результатов MySQL.

$objPHPExcel = new PHPExcel();


$index = 1;
foreach($dataset as $subscriber)
{
    $objPHPExcel->setActiveSheetIndex(0)
        ->setCellValue('A' . $index, $subscriber['Email']);
    $index ++;
}

Если вы разрешаете пользователям изменять данные в таблице вывода на экране.Допустим, у вас есть текстовые поля внутри таблицы, и они также нужны для сохранения в файл Excel.Затем вы называете эти элементы в виде массива.Пример: txtName[] Так что, как только вы получите POST, вы можете обработать это программно.

...