忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

PHP PhpSpreadsheet エクセルのワークシートのセルへ漢字(全角文字)の設定について


今回は PhpSpreadsheet で行う「ワークシート」の 「セル」への漢字(全角文字)の設定 について説明したいと思います。




■ワークシートの「セル」への漢字(全角文字)の設定の簡単なプログラム(エラー発生)

ワークシートの setCellValue() メソッドで全角文字列を指定すれば問題無いであろうとも思って、以下の様なソースを実行しました。

<?php
// ライブラリ読込
require '../vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

// Spreadsheetオブジェクト生成
$objSpreadsheet = new Spreadsheet();
// ワークシートオブジェクト
$objSheet = $objSpreadsheet->getActiveSheet();
// [A1]セルに文字列設定
$objSheet->setCellValue('A1', 'あいうえお漢字全角ABCDE');

// [test5-1.xlsx]:Excel2007形式で保存する
$objWriter = new Xlsx($objSpreadsheet);
$objWriter->save('test5-1.xlsx');
exit();
?>

しかし、実際のエクセルファイル[test5-1.xlsx]を開くと以下の様な表示になります。 全角文字列がうまく反映していない様です。




■エラー発生したソースの文字コードの確認

上記のソースの文字コードを確認したら Shift-JIS コードになっていました。 これを UTF-8 に変更しプログラムを実行後、エクセルファイル(「test5-2.xlsx」としました)を開いてみると正しく文字が設定されました。




■ワークシートのデフォルトスタイルを使用したフォント設定

ワークシートの全てのセルに同じスタイルを設定したい場合に、デフォルトスタイルを設定します。

Spreadsheetオブジェクト のデフォルトスタイルを取得し(getDefaultStyle()メソッド)、 さらにそのスタイルからフォントオブジェクト取得します(getFont()メソッド)。
フォントオブジェクトの setName() メソッドでフォント名を設定し、 setSize() メソッドでフォントサイズを設定します。

セルの縦位置の設定には、デフォルトスタイルからアライメントオブジェクトを取得し setVertical() メソッドでセルの縦方向の設定をします。

<?php
// ライブラリ読込
require '../vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Style\Alignment;

// Spreadsheetオブジェクト生成
$objSpreadsheet = new Spreadsheet();
// ワークシートオブジェクト
$objSheet = $objSpreadsheet->getActiveSheet();

// デフォルトスタイルオブジェクト取得
$objDefaultStyle = $objSpreadsheet->getDefaultStyle();
// フォントオブジェクト取得
$objFont = $objDefaultStyle->getFont();
// フォント名設定
$objFont->setName('MS Pゴシック');
// フォントサイズ設定
$objFont->setSize(12);
// アライメントオブジェクトでセルの縦方向の設定
$objDefaultStyle->getAlignment()->setVertical(Alignment::VERTICAL_CENTER);

// [A1]セルに文字列設定
$objSheet->setCellValue('A1', 'あいうえお漢字全角ABCDE');
// [A2]セルに[A1]と同じ文字列設定
$objSheet->setCellValue('A2', 'あいうえお漢字全角ABCDE');
// [A3]セルに数値設定
$objSheet->setCellValue('A3', '123456789');
// [test5-3.xlsx]:Excel2007形式で保存する
$objWriter = new Xlsx($objSpreadsheet);
$objWriter->save('test5-3.xlsx');
exit();
?>

出力されたエクセルファイルを見てみると以下の様になります。


これは余談ですが、上記のソースでオブジェクトを変数で受けて処理していますが、以下の様に一気に書いてしまっても問題はありません。

<?php
// ライブラリ読込
require '../vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Style\Alignment;

// Spreadsheetオブジェクト生成
$objSpreadsheet = new Spreadsheet();
// ワークシートオブジェクト
$objSheet = $objSpreadsheet->getActiveSheet();

// フォント名設定
$objSpreadsheet->getDefaultStyle()->getFont()->setName('MS Pゴシック');
// フォントサイズ設定
$objSpreadsheet->getDefaultStyle()->getFont()->setSize(12);
// アライメントオブジェクトでセルの縦方向の設定
$objSpreadsheet->getDefaultStyle()->getAlignment()->setVertical(Alignment::VERTICAL_CENTER);

// [A1]セルに文字列設定
$objSheet->setCellValue('A1', 'あいうえお漢字全角ABCDE');
// [A2]セルに[A1]と同じ文字列設定
$objSheet->setCellValue('A2', 'あいうえお漢字全角ABCDE');
// [A3]セルに数値設定
$objSheet->setCellValue('A3', '123456789');
// [test5-3.xlsx]:Excel2007形式で保存する
$objWriter = new Xlsx($objSpreadsheet);
$objWriter->save('test5-3.xlsx');
exit();
?>












PR

コメント

コメントを書く