Экспорт таблицы MYSQL в Excel - PullRequest
       1

Экспорт таблицы MYSQL в Excel

0 голосов
/ 27 ноября 2010

У меня есть PHP-скрипт для экспорта таблицы MYSQL в формат Excel, но у меня возникают проблемы после экспорта таблицы.Данные, которые получают из БД, показывают только одну строку.

Это следующий скрипт:

$dbc=mysql_connect(_SRV,_ACCID,_PWD) or die(_ERROR15.": ".mysql_error());
$db=mysql_select_db("qdbase",$dbc) or die(_ERROR17.": ".mysql_error());

$sQuery = "SELECT id, Line, Model,Lot_no,
                  COUNT( Serial_number ) AS Qty,
                  SUM(S), SUM(A), SUM(B), SUM(C),
                  (SUM(S) + SUM(A) + SUM(B)*0.4 + SUM(C)*0.1) / COUNT(Serial_number) AS QP,
                  ROUND((SUM(S) + SUM(A) + SUM(B)*0.4 + SUM(C)*0.1) / COUNT(Serial_number)*1000,2) AS PPM
            FROM  `inspection_report`";

$rResult = mysql_query( $sQuery) or die();
$count = mysql_num_fields($rResult);

// fetch table header
$header = '';
for ($i = 0; $i < $count; $i++){
       $header .= mysql_field_name($rResult, $i)."\t";
       }
// fetch data each row, store on tabular row data
while($row = mysql_fetch_row($rResult)){
       $line = '';
       foreach($row as $value){
              if(!isset($value) || $value == ""){
                     $value = "\t";
              }else{
                     $value = str_replace('"', '""', $value);
                     $value = '"' . $value . '"' . "\t";
                     }
              $line .= $value;
              }
       $data .= trim($line)."\n";
       $data = str_replace("\r", "", $data);

if ($data == "") {
       $data = "\nno matching records found\n";
       }

header("Content-type: application/vnd.ms-excel; name='excel'");
header("Content-Disposition: attachment; filename=exportfile.xls");
header("Pragma: no-cache");
header("Expires: 0");

// output data
echo $header."\n".$data;
?>

Кроме того, как сделать некоторую границу для этой таблицы?

Ответы [ 3 ]

5 голосов
/ 27 ноября 2010

если я хочу сделать: echo ""; какое правильное место положить это, что не может сделать мой сценарий стать ошибка?

Если вы собираетесь сделать это в виде таблицы html, я бы просто вывел вывод, что вы обычно правите таблицу ... например, вы могли бы сделать:

$rResult = mysql_query( $sQuery) or die();
$count = mysql_num_fields($rResult);

$html = '<table border="1"><thead><tr>%s</tr><thead><tbody>%s</tbody></table>';
$thead = '';
$tbody = '';
$line = '<tr>%s</tr>';
for ($i = 0; $i < $count; $i++){      
  $thead .= sprintf('<th>%s</th>',mysql_field_name($rResult, $i));
}


while(false !== ($row = mysql_fetch_row($rResult))){
  $trow = '';

  foreach($row as $value){
   $trow .= sprintf('<td>%s</td>', $value);
  }

  $tbody .= sprintf($line, $trow);

}


header("Content-type: application/vnd.ms-excel; name='excel'");
header("Content-Disposition: attachment; filename=exportfile.xls");
header("Pragma: no-cache");
header("Expires: 0");

print sprintf($html, $thead, $tbody);
exit;

Вы получаете только одну строку, потому что вы используете агрегатные функции без предложения GROUP BY. Попробуйте добавить GROUP BY к чему-то, что связывает каждую из этих «записей» с определенной группой, например Lot_no или с тем, о чем вы пытаетесь сообщить.

Что касается границы, вы не можете сделать это с CSV, который, хотя readbale в Excel, на самом деле не является файлом формата Excel со всеми дополнительными функциями, такими как форматирование для границ. Чтобы использовать такие вещи, как форматирование, вам нужно вывести собственный Excel или HTML-таблицу, которую можно загрузить в Excel. Посмотрите на phpexcel, если вам нужно это сделать.

1 голос
/ 04 декабря 2010

попробуйте этот код, он работает для меня:

<?php
$db_name     = "db_name";
$db_password = "pass";
$db_link     = mysql_connect("localhost", "root", $db_password);
mysql_select_db($db_name, $db_link);
mysql_query("SET NAMES UTF8");
$table = "table_name";
function assoc_query_2D($sql, $id_name = false){
  $result = mysql_query($sql);
  $arr = array();
  $row = array();
  if($result){
    if($id_name == false){
      while($row = mysql_fetch_assoc($result))
        $arr[] = $row;
    }else{
      while($row = mysql_fetch_assoc($result)){
        $id = $row['id'];
        $arr[$id] = $row;
      }
    }
  }else return 0;

  return $arr;
}

function query_whole_table($table, $value = '*'){
    $sql = "SELECT $value FROM $table";
  return assoc_query_2D($sql);
}

$export_str = "";
$result = query_whole_table($table);

foreach($result as $record){
  $export_str .= implode(";",$record) . "\n";
}
// add time to fileName
$date = time(); 
file_put_contents($date.'_'.$table."_export.csv", $export_str);
?>
1 голос
/ 27 ноября 2010

Вы на самом деле ничего не вытаскиваете из-за столов. У вас есть только один запрос, и он вытягивает информацию заголовка. Запустите оператор sql, например «select * from tableName», чтобы получить остальное, а затем выполните цикл while и for с этим запросом. PHP / браузеры обычно не работают хорошо с элементами вне языков программирования, XML и CSV. Я бы посмотрел больше на один из них. XML читается более новыми версиями Excel (и открывается в Internet Explorer в форме XML), в то время как csv более широко используется для обмена между различными типами баз данных / электронных таблиц. Для примера вывода XML перейдите к http://www.ibm.com/developerworks/opensource/library/os-phpexcel/index.html, а для вывода CSV вам придется использовать функцию fputcsv () для массива. Например:

 $query = mysql_fetch_row($rResult);//the query of the table
             // use 'select * from table' to list everything
 $xls = fopen('file.csv', 'a'); //opens document for writing and attempts to create if file does not exist
 foreach ($list as $fields) {
      fputcsv($fp, $fields);
 }
 fclose($xls); //always close the file when done

Оба являются грязными способами экспорта, но работают.

...