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

0

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

Это следующее script:

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

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

Теги:
export-to-excel

3 ответа

5
Лучший ответ

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

Если youre goign делает это как html-таблицу, тогда я буду jsut output liek вы обычно правы таблицы... например, вы могли бы сделать:

$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, если вам нужно это сделать.

  • 0
    если я хочу сделать: echo "<table border = 1>"; какое правильное место, чтобы положить его, что не может сделать мой сценарий стать ошибкой?
  • 0
    да ... я хочу сделать так
Показать ещё 5 комментариев
1

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

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

На самом деле вы ничего не вытаскиваете из таблиц. У вас есть только один запрос, и он извлекает информацию заголовка. Запустите sql-оператор, например "select * from tableName", чтобы получить остальное, а затем выполните цикл while и for с этим запросом. PHP/браузеры обычно не работают хорошо за пределами языков программирования, XML и CSV. Я бы посмотрел больше на одну из них. XML читается более новыми версиями excel (и открыт в Internet Explorer в форме XML), в то время как csv более широко используется для совместного использования между различными типами баз данных/электронных таблиц. Для примера вывода XML goto 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

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

  • 1
    +1 для phpexcel, это довольно солидная библиотека для работы с документами Excel в PHP.
  • 0
    Это хорошая идея. Но я хочу играть только со сценарием. :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню