eightban's memo

残しておきたい記事をまとめてみました。

PHP

シフトJISのCSVを読込みテンプレートのExcelに書き込む ~ PHP

更新日:

現在でも使用しているシステムの関係でシフトJISを使用していることがあると思いますが、PHPの文字コードはUnicode(UTF-8)であるため、漢字やひらがなの全角文字を読み込むと表示されない場合があります。

今回はfgetcsvとphpspreadsheetを用いたcsv読込を説明します。

あ,い,う
a2,b2,c2
a3,b3,c3

のようなCSVデータと何も入れていないxlsxファイルを用意してください。

 

fgetcsv

全角文字をそのまま読み込むと「FALSE」で表示されてしまいました。これを回避するため、setlocaleとmb_convert_variablesを使います。

Window7ではこれで日本語が表示されたのですが、Windows10ではA1の日本語のセルが「あ」ですがB1のセルは「縺」になってしまいました。2列目移行がうまく変換されないようです。

シフトJISのファイルをfgetcsvで読み込むと文字化けしてしまう場合は、一旦UTF-8の文字コードのファイルに文字コードを変換して出力してからfgetcsvで読み込みこむ方法があります。

phpspreadsheet

phpspreadsheetでもcsvを読み込めます。

 

setInputEncodeingをしないで実行すると、全角文字のセルは書き込まれませんので、日本語を使う場合はいれておいてください。

PHP Fatal error: Uncaught Error: Call to undefined function PhpOffice\PhpSpreadsheet\Reader\mime_content_type() in D:\oss\PHP\PHP726\vendor\phpoffice\phpspreadsheet\src\PhpSpreadsheet\Reader\Csv.php:510

しかし、エラーがでてしまいます。

エラーのファイルと行数が出ているのでcsv.phpのソースファイルを変更します。

public function canRead($pFilename)
{
// Check if file exists
try {
$this->openFile($pFilename);
} catch (Exception $e) {
return false;
}fclose($this->fileHandle);$type = mime_content_type($pFilename);
$supportedTypes = [
'text/csv',
'text/plain',
'inode/x-empty',
];return in_array($type, $supportedTypes, true);
}
public function canRead($pFilename)
{
// Check if file exists
try {
$this->openFile($pFilename);
} catch (Exception $e) {
return false;
}fclose($this->fileHandle);// $type = mime_content_type($pFilename);
// $supportedTypes = [
// 'text/csv',
// 'text/plain',
// 'inode/x-empty',
// ];// return in_array($type, $supportedTypes, true);
return True;
}

これで簡単にexcelテンプレートにcsvのデータを入れることができます。

 

-PHP

Copyright© eightban's memo , 2018 All Rights Reserved Powered by STINGER.