2013-06-16 14 views
7

MySQLデータベースのテーブルからXLSファイルを生成しようとしましたが、Excelファイルが正しくフォーマットされていません& Excelファイルが生成されたときにエラーが発生しました。 1つの指定されたものとは異なるフォーマットで "ファイルが開かれると、データのフォーマットが正しく行われません。MySQLからExcelファイルを作成する

アイデアは何ですか?

<?php 
$host = 'XXXXXXX'; 
$dbname = 'XXXXXXXX'; 
$username = 'XXXXXXXX'; 
$password = 'XXXXXXXX'; 

function xlsBOF() { 
    echo pack("ssssss", 0x809, 0x8, 0x0, 0x10, 0x0, 0x0); 
    return; 
} 

function xlsEOF() { 
    echo pack("ss", 0x0A, 0x00); 
    return; 
} 

function xlsWriteLabel($Row, $Col, $Value) { 
    $L = strlen($Value); 
    echo pack("ssssss", 0x204, 8 + $L, $Row, $Col, 0x0, $L); 
    echo $Value; 
    return; 
} 

function xlsWriteNumber($Row, $Col, $Value) { 
    echo pack("sssss", 0x203, 14, $Row, $Col, 0x0); 
    echo pack("d", $Value); 
    return; 
} 

try { 
    $conn = new PDO("mysql:host=$host;dbname=$dbname", $username, $password); 
    echo "Connected to $dbname at $host successfully."; 
    $conn = null; 
} catch (PDOException $pe) { 
    die("Could not connect to the database $dbname :" . $pe->getMessage()); 
} 

$q = "SELECT * FROM tablename"; 
$qr = mysql_query($q) or die(mysql_error()); 

header("Pragma: public"); 
header("Expires: 0"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header("Content-Type: application/force-download"); 
header("Content-Type: application/octet-stream"); 
header("Content-Type: application/download"); 

header("Content-Disposition: attachment;filename=export_".$dbtable.".xls "); 

header("Content-Transfer-Encoding: binary "); 

xlsBOF(); 

$col = 0; 
$row = 0; 

$first = true; 

while($qrow = mysql_fetch_assoc($qr)) 
{ 
    if($first) 
    { 
     foreach($qrow as $k => $v) 
     { 
     xlsWriteLabel($row, $col, strtoupper(ereg_replace("_" , " " , $k))); 
     $col++; 
     } 

     $col = 0; 
     $row++; 
     $first = false; 
    } 

    // go through the data 
    foreach($qrow as $k => $v) 
    { 
     // write it out 
     xlsWriteLabel($row, $col, $v); 
     $col++; 
    } 
    // reset col and goto next row 
    $col = 0; 
    $row++; 
} 

xlsEOF(); 
exit(); 
+1

"正しくフォーマットされていません" について教えてください。 – Mark

+1

存在する偉大なphp-excelライブラリの1つを使用しないでください –

+0

@DoulatKhanあなたの編集に注意してください - Stack Snippetsはブラウザ*で実行できるコードサンプル、スタックオーバーフローページ - JavaScript、HTML、およびCSSを実行し、必要なすべての部分を実行します。 PHPはブラウザー内の言語ではありません。そして、あなたの不要なタイトルの編集は実際にスペルミスを追加しました( "genrate"ではなく "generate")。 –

答えて

4

私はxxについてはわかりませんが、CSVテーブルとしてMySQL結果を出力します。 fputcsv機能はあまり大騒ぎせずにそれをしない:

// Clear any previous output 
ob_end_clean(); 
// I assume you already have your $result 
$num_fields = mysql_num_fields($result); 

// Fetch MySQL result headers 
$headers = array(); 
$headers[] = "[Row]"; 
for ($i = 0; $i < $num_fields; $i++) { 
    $headers[] = strtoupper(mysql_field_name($result , $i)); 
} 

// Filename with current date 
$current_date = date("y/m/d"); 
$filename = "MyFileName" . $current_date . ".csv"; 

// Open php output stream and write headers 
$fp = fopen('php://output', 'w'); 
if ($fp && $result) { 
    header('Content-Type: text/csv'); 
    header('Content-Disposition: attachment; filename='.$filename); 
    header('Pragma: no-cache'); 
    header('Expires: 0'); 
    echo "Title of Your CSV File\n\n"; 
    // Write mysql headers to csv 
    fputcsv($fp, $headers); 
    $row_tally = 0; 
    // Write mysql rows to csv 
    while ($row = mysql_fetch_array($result, MYSQL_NUM)) { 
    $row_tally = $row_tally + 1; 
    echo $row_tally.","; 
     fputcsv($fp, array_values($row)); 
    } 
    die; 
} 
3

使用http://phpexcel.codeplex.com/

セラヴィ最優秀ソリューションgénérerアンfichierが優れて注ぐ Vousのpouvezミームクレエplusieurs feuilles DANSルfichierらフォーマッタレcellules(クルール、警察、bordure、...)

グーグル翻訳:

を。これは、Excelを生成するための最適なソリューションですファイルファイル内に複数のシートを作成してセル(カラー、フォント、枠線、など)をフォーマットすることもできます

+0

ファイルを開いたときに最初に表示されるエラーは、「開こうとしているファイルがファイル拡張子で指定されたものとは異なる形式です」 –

+0

ファイルを開いたときに最初に表示されるエラーは、オープンは、ファイル拡張子で指定されたものとは異なる形式です。 2番目のエラーは、テーブルのフィールドが各行と列に別々にダウンロードされていないことです。最初の列に表示されます。それぞれのフィールドの間に次の文字が表示されます。 '' –

+0

基本的には、この機能をWordPressページテンプレートに追加し、DBにクエリを実行してXLSファイルをダウンロードまたはメールで利用できるようにするため、このソリューションが必要です。 PHPExcelのようなサードパーティ関数を使用したくないので、これをできるだけ簡単にしたいと思います。助言がありますか? –

2
<?php 
//download.php page code 
//THIS PROGRAM WILL FETCH THE RESULT OF SQL QUERY AND WILL DOWNLOAD IT. (IF YOU HAVE ANY QUERY CONTACT:[email protected]) 
//include the database file connection 
include_once('database.php'); 
//will work if the link is set in the indx.php page 
if(isset($_GET['name'])) 
{ 
    $name=$_GET['name']; //to rename the file 
    header('Content-Disposition: attachment; filename='.$name.'.xls'); 
    header('Cache-Control: no-cache, no-store, must-revalidate, post-check=0, pre-check=0'); 
    header('Pragma: no-cache'); 
    header('Content-Type: application/x-msexcel; charset=windows-1251; format=attachment;'); 
    $msg=""; 
    $var=""; 
    //write your query  
    $sql="select * from tablename"; 
    $res = mysql_query($sql); 
    $numcolumn = mysql_num_fields($res); //will fetch number of field in table 
    $msg="<table><tr><td>Sl No</td>"; 
    for ($i = 0; $i < $numcolumn; $i++) { 
     $msg.="<td>"; 
     $msg.= mysql_field_name($res, $i); //will store column name of the table to msg variable 
     $msg.="</td>"; 

    } 
    $msg.="</tr>"; 
    $i=0; 
    $count=1; //used to print sl.no 
    while($row=mysql_fetch_array($res)) //fetch all the row as array 
    { 

     $msg.="<tr><td>".$count."</td>"; 
     for($i=0;$i< $numcolumn;$i++) 
     { 
      $var=$row[$i]; //will store all the values of row 
      $msg.="<td>".$var."</td>"; 
     } 
     $count=$count+1; 
     $msg.="</tr>"; 
    } 

    $msg.="</table>"; 
    echo $msg; //will print the content in the exel page 
} 
?> 

<?php 
//index.php page 
$name="any file name"; 
echo "<a href='download.php?name=".$name."'>Click to download</a>"; //link to download file 
?> 
+3

答えを説明してください – Machavity

関連する問題