最近、プロジェクトのニーズにより、システム内の一部のデータを PHP を使用して Excel にエクスポートし、変更後にシステムにインポートし直すモジュールを開発する必要がありました。機会があったのでこれについて調べてみましたので、いくつかまとめてみました。
基本的に、エクスポートされるファイルには次の 2 種類があります:
1: Excel に似た形式。これは実際には、従来の意味での Excel ファイルではありません。これは、Excel に強力な互換性があり、正しく開くことができるためです。この種のファイルを変更して保存すると、通常、ファイルを Excel ファイルに変換するかどうかを尋ねるメッセージが表示されます。
利点: シンプル。
欠点: インポートに使用する場合、フォーマットを生成するのが難しく、対応するプログラムを自分で記述する必要があります。
2: Excel 形式。Excel に相当し、この方法で生成されたファイルは実際の Excel 形式に近くなります。
中国語をエクスポートするときに文字化けが発生する場合は、文字列を gb2312 に変換してみてください。たとえば、次の例では $yourStr を utf-8 から gb2312 に変換します。
$yourStr = mb_convert_encoding(”gb2312”, “UTF-8”, $yourStr);
いくつかの方法の詳細を以下に示します。
1. PHP で Excel をエクスポート
1: 最初の推奨事項は、非常に人気のある PHPExcel です。公式 Web サイト: http://www.codeplex.com/PHPExcel
インポートとエクスポートが成功し、Office 2007 形式でエクスポートでき、2003 と互換性があります。
ダウンロードしたパッケージには、自分で学習できるドキュメントと例が含まれています。
段落をコピーする例:
<?php /** * PHPExcel * * Copyright (C) 2006 - 2007 PHPExcel * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * @category PHPExcel * @package PHPExcel * @copyright Copyright (c) 2006 - 2007 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/lgpl.txt LGPL * @version 1.5.0, 2007-10-23 */ /** Error reporting */ error_reporting(E_ALL); /** Include path **/ set_include_path(get_include_path() . PATH_SEPARATOR . ‘../Classes/’); /** PHPExcel */ include ‘PHPExcel.php’; /** PHPExcel_Writer_Excel2007 */ include ‘PHPExcel/Writer/Excel2007.php’; // Create new PHPExcel object echo date(’H:i:s’) . ” Create new PHPExcel object\n”; $objPHPExcel = new PHPExcel(); // Set properties echo date(’H:i:s’) . ” Set properties\n”; $objPHPExcel->getProperties()->setCreator(”Maarten Balliauw”); $objPHPExcel->getProperties()->setLastModifiedBy(”Maarten Balliauw”); $objPHPExcel->getProperties()->setTitle(”Office 2007 XLSX Test Document”); $objPHPExcel->getProperties()->setSubject(”Office 2007 XLSX Test Document”); $objPHPExcel->getProperties()->setDescrīption(”Test document for Office 2007 XLSX, generated using PHP classes.”); $objPHPExcel->getProperties()->setKeywords(”office 2007 openxml php”); $objPHPExcel->getProperties()->setCategory(”Test result file”); // Add some data echo date(’H:i:s’) . ” Add some data\n”; $objPHPExcel->setActiveSheetIndex(0); $objPHPExcel->getActiveSheet()->setCellValue(’A1′, ‘Hello’); $objPHPExcel->getActiveSheet()->setCellValue(’B2′, ‘world!’); $objPHPExcel->getActiveSheet()->setCellValue(’C1′, ‘Hello’); $objPHPExcel->getActiveSheet()->setCellValue(’D2′, ‘world!’); // Rename sheet echo date(’H:i:s’) . ” Rename sheet\n”; $objPHPExcel->getActiveSheet()->setTitle(’Simple’); // Set active sheet index to the first sheet, so Excel opens this as the first sheet $objPHPExcel->setActiveSheetIndex(0); // Save Excel 2007 file echo date(’H:i:s’) . ” Write to Excel2007 format\n”; $objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel); $objWriter->save(str_replace(’.php’, ‘.xlsx’, __FILE__)); // Echo done echo date(’H:i:s’) . ” Done writing file.\r\n”;
2. pear の Spreadsheet_Excel_Writer クラスを使用する
ダウンロードアドレス: http://pear.php.net/package/Spreadsheet_Excel_Writer
このクラスは OLE に依存します。ダウンロード アドレス: http://pear.php.net/package/OLE
エクスポートされた Excel ファイルの形式は比較的古いことに注意してください。変更後、保存時に新しい形式に変換するかどうかを確認するメッセージが表示されます。
しかし、非常に強力なフォーマットを設定することができます。
<?php require_once ‘Spreadsheet/Excel/Writer.php’; // Creating a workbook $workbook = new Spreadsheet_Excel_Writer(); // sending HTTP headers $workbook->send(’test.xls’); // Creating a worksheet $worksheet =& $workbook->addWorksheet(’My first worksheet’); // The actual data $worksheet->write(0, 0, ‘Name’); $worksheet->write(0, 1, ‘Age’); $worksheet->write(1, 0, ‘John Smith’); $worksheet->write(1, 1, 30); $worksheet->write(2, 0, ‘Johann Schmidt’); $worksheet->write(2, 1, 31); $worksheet->write(3, 0, ‘Juan Herrera’); $worksheet->write(3, 1, 32); // Let’s send the file $workbook->close(); ?>
3. Smarty を使用して Excel 仕様に準拠した XML または HTML ファイルを生成します
フォーマットをサポートしており、完璧なエクスポート ソリューションです。ただし、エクスポートされたファイルは基本的に XML ファイルであり、インポートに使用する場合は、個別に処理する必要があります。
エクスポートされたテーブルの行数が不確かな場合は、テンプレート内の「ss:ExpandedColumnCount=”5″ ss:ExpandedRowCount=”21″」などを削除することをお勧めします。
4. Excel 形式をシミュレートする文区切り記号を印刷するには、パック関数を使用します。これは、Office 2003 で変更して保存した後は、プロンプトが表示されなくなります。 。
欠点は、フォーマットがないことです。
<?php // Send Header 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=test.xls “); header(”Content-Transfer-Encoding: binary “); // XLS Data Cell xlsBOF(); xlsWriteLabel(1,0,”My excel line one”); xlsWriteLabel(2,0,”My excel line two : “); xlsWriteLabel(2,1,”Hello everybody”); xlsEOF(); function xlsBOF() { echo pack(”ssssss”, 0×809, 0×8, 0×0, 0×10, 0×0, 0×0); return; } function xlsEOF() { echo pack(”ss”, 0×0A, 0×00); return; } function xlsWriteNumber($Row, $Col, $Value) { echo pack(”sssss”, 0×203, 14, $Row, $Col, 0×0); echo pack(”d”, $Value); return; } function xlsWriteLabel($Row, $Col, $Value ) { $L = strlen($Value); echo pack(”ssssss”, 0×204, 8 + $L, $Row, $Col, 0×0, $L); echo $Value; return; } ?>
しかし、作者は64ビットLinuxシステムで使用したところ失敗し、文の区切り記号がすべて文字化けしてしまいました。
5. タブ文字と改行の使い方
タブ文字「t」を使用すると同じ行内の列を分割でき、改行文字「tn」を使用すると次の行を開くことができます。
<?php header(”Content-Type: application/vnd.ms-execl”); header(”Content-Disposition: attachment; filename=myExcel.xls”); header(”Pragma: no-cache”); header(”Expires: 0″); /*first line*/ echo “hello”.”\t”; echo “world”.”\t”; echo “\t\n”; /*start of second line*/ echo “this is second line”.”\t”; echo “Hi,pretty girl”.”\t”; echo “\t\n”; ?>
6. コムを使用します
PHP で com モジュールを開くことができる場合は、それを使用して Excel ファイルをエクスポートできます
<?PHP $filename = “c:/spreadhseet/test.xls”; $sheet1 = 1; $sheet2 = “sheet2″; $excel_app = new COM(”Excel.application”) or Die (”Did not connect”); print “Application name: {$excel_app->Application->value}\n” ; print “Loaded version: {$excel_app->Application->version}\n”; $Workbook = $excel_app->Workbooks->Open(”$filename”) or Die(”Did not open $filename $Workbook”); $Worksheet = $Workbook->Worksheets($sheet1); $Worksheet->activate; $excel_cell = $Worksheet->Range(”C4″); $excel_cell->activate; $excel_result = $excel_cell->value; print “$excel_result\n”; $Worksheet = $Workbook->Worksheets($sheet2); $Worksheet->activate; $excel_cell = $Worksheet->Range(”C4″); $excel_cell->activate; $excel_result = $excel_cell->value; print “$excel_result\n”; #To close all instances of excel: $Workbook->Close; unset($Worksheet); unset($Workbook); $excel_app->Workbooks->Close(); $excel_app->Quit(); unset($excel_app); ?>
より良い例: http://blog.chinaunix.net/u/16928/showart_387171.html
2. PHP インポート Excel
1: PHPExcel を引き続き使用します (公式 Web サイト: http://www.codeplex.com/PHPExcel)。
2: PHP-ExcelReader を使用します。ダウンロード アドレス: http://sourceforge.net/projects/phpexcelreader
例:
<?php require_once ‘Excel/reader.php’; // ExcelFile($filename, $encoding); $data = new Spreadsheet_Excel_Reader(); // Set output Encoding. $data->setOutputEncoding(’utf8′); $data->read(’ jxlrwtest.xls’); error_reporting(E_ALL ^ E_NOTICE); for ($i = 1; $i <= $data->sheets[0]['numRows']; $i++) { for ($j = 1; $j <= $data->sheets[0]['numCols']; $j++) { echo “\”".$data->sheets[0]['cells'][$i][$j].”\”,”; } echo “\n”; } ?>