PHPでDBからデータを抽出してcsv出力するプログラムを書いています。
try{ // SQLの組み立て $sql = "SELECT * FROM tbl_customer WHERE DATE_FORMAT(birthday, '%c')= '" .$month. "'" . "AND birthday <> '1700-01-01'" ; // ヘッダ部分挿入 $list = "\"顧客ID" . "\",\"顧客名" . "\",\"顧客名ヨミ" . "\"\n"; // 「prepare」メソッドでSQL文を作成 $stmt = $conn->prepare($sql); // 「execute」メソッドでSQL文をデータベースへ発行 $stmt->execute(); while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ $list .= $row['customerId'] . ","; $list .= $row['customerName'] . ","; $list .= $row['customerYomi']. "\n"; } // 文字化け対策にSJISへエンコード $list = mb_convert_encoding($list, "SJIS", "utf-8"); $size = strlen($list); $filename = 'dat_customer.csv'; header("Content-Disposition: inline; filename=\"".basename($filename)."\""); header("Content-Length: ".$size); header("Content-Type: text/csv"); // ファイル出力 echo ($list); }catch (PDOException $e){ print("Error:".$e->getMessage()); die(); }
csvファイルは出力されるのですが、Excelで開こうとすると
「ファイルが破損しているため開くことができません。」
と表示され、Excelで開けません。
このファイルをエディターで開いたのが以下のものです。(一部です)
よく見ると1行目に変な文字と改行が入っています。
水平タブと改行のようです。
これを削除するとExcelで開くことができました。
そこで以下のような制御コードを削除するコードを加えてみましたが、
1行目の変な文字と改行をとることができませんでした。
$list = preg_replace('/[\x00-\x09\x0B\x0C\x0E-\x1F\x7F]/', '', $list);
そこで、この変な文字(改行はあってもかまいませんが)を削除して
csvファイルを出力するにはどうしたらよいでしょうか。
または、そもそもこの不要な文字を発生させないでcsv出力するには
どうしたらよいでしょうか。
ご指導ください。よろしくお願い致します。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/10/14 07:05