PHPのExcelでの凊理ずレポヌト

プロゞェクトの開発時に、レポヌト統蚈を生成する必芁があるこずは珍しくありたせん。 プロゞェクトがDelphi 、 Cたたは、たずえばC ++およびWindowsで開発されおいる堎合、問題はありたせん。 COMオブゞェクトを䜿甚するだけです。 ただし、 PHPでExcel圢匏のレポヌトを生成する必芁がある堎合、状況は異なりたす。 そしお、この䜜成がUNIXラむクなシステムで機胜するようにしたす。 しかし、幞いなこずに、それほど悪くはありたせん。 そしお、これには十分なラむブラリがありたす。 PHPExcelを遞択したした 。 私はこのラむブラリで数幎働いおおり、満足しおいたす。 クロスプラットフォヌムなので、移怍性に問題はありたせん。







PHPExcelを䜿甚するず、Excelにデヌタをむンポヌトおよび゚クスポヌトできたす。 さたざたなデザむンスタむルをレポヌトに適甚したす。 䞀般的に、すべおが䞊にありたす。 数匏を䜿甚するこずもできたす。 すべおの䜜業読み取りおよび曞き蟌みがutf-8゚ンコヌドである必芁があるこずを考慮する必芁があるだけです。







ラむブラリのむンストヌル





動䜜するには、PHPバヌゞョン5.2.0以降が必芁です。 次の拡匵機胜も必芁ですphp_zip、php_xml、php_gd2。 ここからラむブラリをダりンロヌドできたす。







PHPExcelラむブラリを䜿甚するず、次の圢匏でデヌタを曞き蟌むこずができたす。







PHPからExcelにデヌタをむンポヌトする



九九を圢成する䟋を考えおみたしょう。







//      excel require_once('PHPExcel.php'); //        excel require_once('PHPExcel/Writer/Excel5.php'); //    PHPExcel $xls = new PHPExcel(); //     $xls->setActiveSheetIndex(0); //    $sheet = $xls->getActiveSheet(); //   $sheet->setTitle(' '); //     A1 $sheet->setCellValue("A1", ' '); $sheet->getStyle('A1')->getFill()->setFillType( PHPExcel_Style_Fill::FILL_SOLID); $sheet->getStyle('A1')->getFill()->getStartColor()->setRGB('EEEEEE'); //   $sheet->mergeCells('A1:H1'); //   $sheet->getStyle('A1')->getAlignment()->setHorizontal( PHPExcel_Style_Alignment::HORIZONTAL_CENTER); for ($i = 2; $i < 10; $i++) { for ($j = 2; $j < 10; $j++) { //    $sheet->setCellValueByColumnAndRow( $i - 2, $j, $i . "x" .$j . "=" . ($i*$j)); //   $sheet->getStyleByColumnAndRow($i - 2, $j)->getAlignment()-> setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER); } }
      
      





次に、* .xlsファむルを取埗する必芁がありたす。 ここでは、2぀の方法で移動できたす。 あなたがオンラむンストアを持っおいるず仮定し、クラむアントが䟡栌衚をダりンロヌドしたい堎合、この結論に頌る方が良いでしょう







 //  HTTP- header ( "Expires: Mon, 1 Apr 1974 05:00:00 GMT" ); header ( "Last-Modified: " . gmdate("D,d M YH:i:s") . " GMT" ); header ( "Cache-Control: no-cache, must-revalidate" ); header ( "Pragma: no-cache" ); header ( "Content-type: application/vnd.ms-excel" ); header ( "Content-Disposition: attachment; filename=matrix.xls" ); //    $objWriter = new PHPExcel_Writer_Excel5($xls); $objWriter->save('php://output');
      
      











ここで、生成されたデヌタはすぐにブラりザに「吐き出され」たす。 ただし、すぐに「捚おる」のではなくファむルを保存する必芁がある堎合は、 HTTPヘッダヌを衚瀺する必芁はなく、「php//出力」の代わりにファむルのパスを指定する必芁がありたす。 ファむルを䜜成するディレクトリには曞き蟌み暩限が必芁であるこずを忘れないでください。 これはUNIXラむクシステムに適甚されたす。







3぀の䟿利な指瀺の䟋を芋おみたしょう。









たた、レポヌトの操䜜に必芁な次の方法にも泚意しおください。









ご芧のずおり、䞊蚘のメ゜ッドはペアになっおいたす。 したがっお、座暙の文字列たたは数倀衚珟を䜿甚しおセルを操䜜できたす。 もちろん、これは䜜業の远加の利点です。







ExcelでPHPを䜿甚したレポヌト䜜成



非垞に倚くの堎合、レポヌトの䞀郚のデヌタを匷調衚瀺する必芁がありたす。 フォントを遞択するか、䞀郚のセルなどに背景を塗り぀ぶした境界線を適甚したす これにより、最も重芁な情報に集䞭するこずができたす真実は気を散らす可胜性がありたす。 これらの目的のために、PHPExcelラむブラリには、Excelのセルに適甚できる䞀連のスタむルがありたす。 もちろん、このラむブラリにはわずかな「マむナス」がありたす。スタむルを耇数のセルに同時に適甚するこずはできたせんが、個々のセルにのみ適甚できたす。 しかし、これはWebアプリケヌションの開発時に䞍快感を匕き起こすこずはありたせん。







セルのスタむルを蚭定するには、次の3぀の方法がありたす。









泚ぐ

fillパラメヌタヌの倀は、次のオプションパラメヌタヌを持぀配列です。







塗り぀ぶしスタむル
FILL_NONE なし
FILL_SOLID 固い
FILL_GRADIENT_LINEAR 線圢
FILL_GRADIENT_PATH 道
FILL_PATTERN_DARKDOWN 暗闇
FILL_PATTERN_DARKGRAY ダヌクグレヌ
FILL_PATTERN_DARKGRID ダヌクグリッド
FILL_PATTERN_DARKHORIZONTAL 暗い氎平
FILL_PATTERN_DARKTRELLIS darkTrellis
FILL_PATTERN_DARKUP 暗黒
FILL_PATTERN_DARKVERTICAL 暗い垂盎
FILL_PATTERN_GRAY0625 gray0625
FILL_PATTERN_GRAY125 グレヌ125
FILL_PATTERN_LIGHTDOWN ラむトダりン
FILL_PATTERN_LIGHTGRAY lightGray
FILL_PATTERN_LIGHTGRID lightGrid
FILL_PATTERN_LIGHTHORIZONTAL 光の氎平
FILL_PATTERN_LIGHTTRELLIS lightTrellis
FILL_PATTERN_LIGHTUP ラむトアップ
FILL_PATTERN_LIGHTVERTICAL lightVertical
FILL_PATTERN_MEDIUMGRAY mediumGray
塗り぀ぶしの蚭定を指定する䟋

 array( 'type' => PHPExcel_Style_Fill::FILL_GRADIENT_LINEAR, 'rotation' => 0, 'startcolor' => array( 'rgb' => '000000' ), 'endcolor' => array( 'argb' => 'FFFFFFFF' ), 'color' => array( 'rgb' => '000000' ) );
      
      





たたは、次の方法を䜿甚できたす。





$ PHPExcel_Style-> getFill-> setFillTypePHPExcel_Style_Fill :: FILL_GRADIENT_LINEAR;





$ PHPExcel_Style-> getFill-> setRotation0;





$ PHPExcel_Style-> getFill-> getStartColor-> applyFromArrayarray 'rgb' => 'C2FABD';





$ PHPExcel_Style-> getFill-> getEndColor-> applyFromArrayarray 'argb' => 'FFFFFFFF'。







画像挿入

めったにありたせんが、レポヌトに画像を挿入するず䟿利です。 ロゎ、図などを䜿甚できたす。 動䜜するには、次のメ゜ッドが必芁です。







画像挿入アルゎリズムを瀺すコヌドを以䞋に瀺したす







 ... $sheet->getColumnDimension('B')->setWidth(40); $imagePath = dirname ( __FILE__ ) . '/excel.png'; if (file_exists($imagePath)) { $logo = new PHPExcel_Worksheet_Drawing(); $logo->setPath($imagePath); $logo->setCoordinates("B2"); $logo->setOffsetX(0); $logo->setOffsetY(0); $sheet->getRowDimension(2)->setRowHeight(190); $logo->setWorksheet($sheet); } ...
      
      





以䞋は、画像が挿入されたレポヌトです。















フォント

次のオプションパラメヌタを含む配列は、 fontパラメヌタの倀ずしお指定されたす。







䞋線スタむル
UNDERLINE_NONE いや
UNDERLINE_DOUBLE 二重䞋線
UNDERLINE_SINGLE 䞀重䞋線
フォントの蚭定を指定する䟋

 array( 'name' => 'Arial', 'size' => 12, 'bold' => true, 'italic' => false, 'underline' => PHPExcel_Style_Font::UNDERLINE_DOUBLE, 'strike' => false, 'superScript' => false, 'subScript' => false, 'color' => array( 'rgb' => '808080' ) );
      
      





たたは、次の方法を䜿甚したす。





$ PHPExcel_Style-> getFont-> setName 'Arial';





$ PHPExcel_Style-> getFont-> setBoldtrue;





$ PHPExcel_Style-> getFont-> setItalicfalse;





$ PHPExcel_Style-> getFont-> setSuperScriptfalse;





$ PHPExcel_Style-> getFont-> setSubScriptfalse;





$ PHPExcel_Style-> getFont-> setUnderlinePHPExcel_Style_Font :: UNDERLINE_DOUBLE;





$ PHPExcel_Style-> getFont-> setStrikethroughfalse;





$ PHPExcel_Style-> getFont-> getColor-> applyFromArrayarray 'rgb' => '808080';





$ PHPExcel_Style-> getFont-> setSize12。







フレヌム

配列は、次のオプションパラメヌタを含むbordersパラメヌタの倀ずしお指定されたす。







線のスタむル
BORDER_NONE いや
BORDER_DASHDOT ドットが点圚
BORDER_DASHDOTDOT 2぀のドットが点圚
BORDER_DASHED 点線
BORDER_DOTTED ポむント
BORDER_DOUBLE ダブル
BORDER_HAIR ヘアラむン
BORDER_MEDIUM 平均的
BORDER_MEDIUMDASHDOT ドットが点圚
BORDER_MEDIUMDASHDOTDOT 2぀の点を持぀倪い点線
BORDER_MEDIUMDASHED 倪い点線
BORDER_SLANTDASHDOT 点線点線
BORDER_THICK 厚くなった
BORDER_THIN 薄い
フレヌムの蚭定を指定する䟋

 array( 'bottom' => array( 'style' => PHPExcel_Style_Border::BORDER_DASHDOT, 'color' => array( ' rgb' => '808080' ) ), 'top' => array( 'style' => PHPExcel_Style_Border::BORDER_DASHDOT, 'color' => array( 'rgb' => '808080' ) ) );
      
      





次の方法を䜿甚するこずもできたす。





$ PHPExcel_Style-> getBorders-> getLeft-> applyFromArrayarray 'style' => PHPExcel_Style_Border :: BORDER_DASHDOT、 'color' => array 'rgb' => '808080';





$ PHPExcel_Style-> getBorders-> getRight-> applyFromArrayarray 'style' => PHPExcel_Style_Border :: BORDER_DASHDOT、 'color' => array 'rgb' => '808080';





$ PHPExcel_Style-> getBorders-> getTop-> applyFromArrayarray 'style' => PHPExcel_Style_Border :: BORDER_DASHDOT、 'color' => array 'rgb' => '808080';





$ PHPExcel_Style-> getBorders-> getBottom-> applyFromArrayarray 'style' => PHPExcel_Style_Border :: BORDER_DASHDOT、 'color' => array 'rgb' => '808080';





$ PHPExcel_Style-> getBorders-> getDiagonal-> applyFromArrayarray 'style' => PHPExcel_Style_Border :: BORDER_DASHDOT、 'color' => array 'rgb' => '808080';





$ PHPExcel_Style-> getBorders-> setDiagonalDirectionarray 'style' => PHPExcel_Style_Border :: BORDER_DASHDOT、 'color' => array 'rgb' => '808080'







アラむメント

アラむンメントパラメヌタ倀は、4぀のオプションパラメヌタを入力ずしお受け入れる配列です。







氎平方向の配眮
HORIZONTAL_GENERAL メむン
HORIZONTAL_LEFT å·Š
HORIZONTAL_RIGHT 右ぞ
HORIZONTAL_CENTER 䞭倮に
HORIZONTAL_CENTER_CONTINUOUS 遞択䞭心
HORIZONTAL_JUSTIFY 幅で
垂盎方向の配眮
VERTICAL_BOTTOM 䞋端に沿っお
VERTICAL_TOP 䞊端
VERTICAL_CENTER 䞭倮に
VERTICAL_JUSTIFY 高さで
敎列スタむル蚭定の䟋
 array( 'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER, 'vertical' => PHPExcel_Style_Alignment::VERTICAL_CENTER, 'rotation' => 0, 'wrap' => true, 'shrinkToFit' => false, 'indent' => 5 )
      
      





たたは、次の方法を䜿甚したす。





$ PHPExcel_Style-> getAlignment-> setHorizo​​ntalPHPExcel_Style_Alignment :: HORIZONTAL_CENTER;





$ PHPExcel_Style-> getAlignment-> setVerticalPHPExcel_Style_Alignment :: VERTICAL_JUSTIFY;





$ PHPExcel_Style-> getAlignment-> setTextRotation10;





$ PHPExcel_Style-> getAlignment-> setWrapTexttrue;





$ PHPExcel_Style-> getAlignment-> setShrinkToFitfalse;





$ PHPExcel_Style-> getAlignment-> setIndent5。







デヌタ衚瀺圢匏

numberformatパラメヌタヌは、1぀のパラメヌタヌ code-セルデヌタ圢匏のみを含む配列です。







可胜な圢匏のリスト
FORMAT_GENERAL 党般
FORMAT_TEXT @
FORMAT_NUMBER 0
FORMAT_NUMBER_00 0.00
FORMAT_NUMBER_COMMA_SEPARATED1 、## 0.00
FORMAT_NUMBER_COMMA_SEPARATED2 、## 0.00_-
FORMAT_PERCENTAGE 0
FORMAT_PERCENTAGE_00 0.00
FORMAT_DATE_YYYYMMDD2 yyyy-mm-dd
FORMAT_DATE_YYYYMMDD yy-mm-dd
FORMAT_DATE_DDMMYYYY dd / mm / yy
FORMAT_DATE_DMYSLASH d / m / y
FORMAT_DATE_DMYMINUS dmy
FORMAT_DATE_DMMINUS dm
FORMAT_DATE_MYMINUS 私の
FORMAT_DATE_XLSX14 mm-dd-yy
FORMAT_DATE_XLSX15 d-mmm-yy
FORMAT_DATE_XLSX16 d-mmm
FORMAT_DATE_XLSX17 mmm-yy
FORMAT_DATE_XLSX22 m / d / yy hmm
FORMAT_DATE_DATETIME d / m / yhmm
FORMAT_DATE_TIME1 hmm AM / PM
FORMAT_DATE_TIME2 hmmss AM / PM
FORMAT_DATE_TIME3 hmm
FORMAT_DATE_TIME4 hmmss
FORMAT_DATE_TIME5 mmss
FORMAT_DATE_TIME6 hmmss
FORMAT_DATE_TIME7 isS
FORMAT_DATE_TIME8 hmmss
FORMAT_DATE_YYYYMMDDSLASH yy / mm / dd; @
FORMAT_CURRENCY_USD_SIMPLE "$"、## 0.00 _-; @
FORMAT_CURRENCY_USD $、## 0_-
FORMAT_CURRENCY_EUR_SIMPLE [$ EUR]、## 0.00_-
セルデヌタ圢匏の蚭定䟋
 array( 'code' => PHPExcel_Style_NumberFormat::FORMAT_CURRENCY_EUR_SIMPLE );
      
      





たたは、次の方法を䜿甚できたす。





$ PHPExcel_Style-> getNumberFormat-> setFormatCodePHPExcel_Style_NumberFormat :: FORMAT_CURRENCY_EUR_SIMPLE;







セル保護

保護パラメヌタヌの倀は、2぀のオプションパラメヌタヌを含む配列です。







セル保護のパラメヌタヌの蚭定䟋

 array( 'locked' => true, 'hidden' => false );
      
      





たたは、次の方法を䜿甚したす。







$ PHPExcel_Style-> getProtection-> setLockedtrue;





$ PHPExcel_Style-> getProtection-> setHiddenfalse;







これで、スタむル蚭定ず各スタむルに存圚するパラメヌタヌがわかりたした。 ここで、衚のセルにスタむルを適甚したすが、これは3぀の方法で行いたす。 最初の方法は、蚭定の配列を䜜成するこずです。蚭定の配列は、 PHPExcel_StyleクラスのapplyFromArrayメ゜ッドにパラメヌタヌずしお枡したす。







 $style = array( 'font' => array( 'name' => 'Arial', ), 'fill' => array( 'type' => PHPExcel_Style_Fill::FILL_SOLID, 'color' => array ( 'rgb' => 'C2FABD' ) ), 'alignment' => array ( 'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER ) );
      
      





次に、䜜成したスタむルをExcelセルに適甚したす。



 $sheet->getStyleByColumnAndRow($i - 2, $j)->applyFromArray($style);
      
      





ここで、同じスタむルを適甚したすが、異なる手法を䜿甚したす。







 //  $sheet->getStyleByColumnAndRow($i - 2, $j)->getAlignment()->setHorizontal( PHPExcel_Style_Alignment::HORIZONTAL_CENTER); //   $sheet->getStyleByColumnAndRow($i - 2, $j)->getFont()->setName('Arial'); //   $sheet->getStyleByColumnAndRow($i - 2, $j)->getFill()-> setFillType(PHPExcel_Style_Fill::FILL_SOLID); $sheet->getStyleByColumnAndRow($i - 2, $j)->getFill()-> getStartColor()->applyFromArray(array('rgb' => 'C2FABD'));
      
      





取埗したものは次のずおりです。













特定のセルのスタむルデヌタを取埗するには、PHPExcel_Styleクラスのむンスタンスを返す次のメ゜ッドのいずれかを䜿甚する必芁がありたす。









次に、スタむルを耇補しおセルをスタむル蚭定する3番目の方法を怜蚎したす。 䜿甚䟋を以䞋に瀺したす特定のスタむルがセル「B2」に適甚され、セル「F2F10」の範囲に察しおそれを耇補するこずを想定しおいたす





 $sheet->duplicateStyle($sheet->getStyle('B2'), 'F2:F10');
      
      





コメントを远加

セルにコメントを远加する機䌚を誰かが取る機䌚は少ないず思いたすが、これは玔粋に私の個人的な意芋ですが、そのような機䌚がありたす。 以䞋の䟋からわかるように、セルぞのコメントの远加は非垞に簡単です。







 ... //   $fBold = array('name' => 'Tahoma', 'size' => 10, 'bold' => true); $fNormal = array('name' => 'Tahoma', 'size' => 10); $richText = $sheet->getComment('B2')->getText(); $richText->createTextRun("Lorem ipsum ")->getFont()-> applyFromArray($fNormal); $richText->createTextRun("dolor sit")->getFont()-> applyFromArray($fBold); $richText->createTextRun(" amet consectetuer")->getFont()-> applyFromArray($fNormal); //    $sheet->getComment('B2')->setWidth('250'); //    $sheet->getComment('B2')->setHeight('25'); ...
      
      





createTextRunメ゜ッドを再床呌び出すず、新しいコメントが既存のコメントに远加されたすが、眮き換えられないこずに泚意しおください。 このメ゜ッドは、 PHPExcel_RichText_Runクラスのオブゞェクトを返すこずに泚意しおください。このクラスには、フォントパラメヌタを蚭定および受信するメ゜ッドがありたす。







以䞋にコメントを瀺したす。















リンク挿入

以䞋の䟋からわかるように、セルにリンクを挿入しおも問題は発生したせん。







 ... //   - $sheet->getCell('A2')->getHyperlink()->setUrl('http://www.phpexcel.net'); //       Sheet2 $sheet->getCell('A2')->getHyperlink()->setUrl("sheet://'Sheet2'!D5"); ...
      
      





リンクの圢匏でも䜿甚できたす。たずえば、メヌルアドレスmailtoexample@mail.com。









Excelからのデヌタの読み取り

レポヌトを生成し、それらにスタむルを適甚するこずは確かに玠晎らしいです。 しかし、PHPExcelラむブラリの可胜性はこれで終わりではありたせん。 さお、圌女が他に䜕ができるか芋おみたしょう。 たた、* .xls / * .xlsxファむルからデヌタを読み取るこずもできたす。





PHPExcelラむブラリを䜿甚するず、次の圢匏を読み取るこずができたす。







䜜業には、2぀のクラスのオブゞェクトが必芁です。







デモンストレヌションのために、車に関する情報を含むテヌブルからデヌタを出力したす。













ファむルの読み取りの䟋を以䞋に瀺したす。







 require_once ('PHPExcel/IOFactory.php'); //   $xls = PHPExcel_IOFactory::load('xls.xls'); //     $xls->setActiveSheetIndex(0); //    $sheet = $xls->getActiveSheet();
      
      





最初のオプション





 ... echo "<table>"; //        $rowIterator = $sheet->getRowIterator(); foreach ($rowIterator as $row) { //          $cellIterator = $row->getCellIterator(); echo "<tr>"; foreach ($cellIterator as $cell) { echo "<td>" . $cell->getCalculatedValue() . "</td>"; } echo "</tr>"; } echo "</table>";
      
      





2番目のオプション





 ... echo "<table>"; for ($i = 1; $i <= $sheet->getHighestRow(); $i++) { echo "<tr>"; $nColumn = PHPExcel_Cell::columnIndexFromString( $sheet->getHighestColumn()); for ($j = 0; $j < $nColumn; $j++) { $value = $sheet->getCellByColumnAndRow($j, $i)->getValue(); echo "<td>$value</td>"; } echo "</tr>"; } echo "</table>";
      
      











最初のオプションでは、反埩子を䜿甚しおセルからデヌタを読み取りたす。 2番目の方法では、むンデックスのアドレス指定を䜿甚しお、シヌトのセルにアクセスしおデヌタを取埗したす。 行ず列の数に関するデヌタを取埗するには、 PHPExcel_Worksheetクラスの次のメ゜ッドを䜿甚したす。







たた、 PHPExcel_Cellクラスの䞀郚であるcolumnIndexFromStringメ゜ッドの助けがなければ実行できたせん。 このメ゜ッドを䜿甚するず、シンボル衚珟によっお列のむンデックスを決定できたす。





デモ機胜を䜿甚しお、Excel圢匏のファむル圢匏でレポヌトを生成および読み取るこずができたす。 たた、スタむルを操䜜するためのほがすべおの可胜な方法が瀺されたした。








All Articles