私は最近 PHP に触れることができましたが、結局のところ、それは C++ に非常に似ていますが、実際の難しさはごく単純なところにあります。 PHP のさまざまな拡張
ここ数日間、PHPExcel を勉強したことをまとめて説明したのは、主にインターネット上の例を学習の主軸として見てきたからです。公式 PDF ドキュメント付き。
以下は最近の学習の概要です。
1 . 構造:
PHPExcel は、次の学習に非常に重要です。
ワークブック: ワークブックと呼ばれます。公式ドキュメントでは、PHPExcel の PHPExcel クラスに対応しています。
Worksheet は、PHPExcel のシート フォームに対応しています。ただし、getSheet を通じて取得できます。セル。データを保存する最小単位です。
上記の 3 つの概念は上から順に、リレーションシップを含み、ワークブックにはワークシートが含まれます。
もちろん、他にも読み取りと書き込みという 2 つの重要な抽象概念があります。 PHPExcel では、読み取りと書き込みの 2 つのアクションがクラスに抽象化されており、テーブルを読み取る必要がある場合は、リーダー クラスのオブジェクトを使用してファイルを読み込みます。オブジェクトを開くには、ライター クラスを使用するだけです。
2. クラスとメソッド
PHPExcel には、最近いくつかしか使用していません。
PHPExcel_Writer
PHPExcel_Reader
PHPExcel_IOFactory (これは、ライタークラスのオブジェクトまたはリーダークラスのオブジェクトを構築する呼び出しメソッドによる、伝説的なファクトリ設計パターンです。)
私が出会った PHPExcel のメソッド
PHPExcel_IOFactory::load Excel ファイルをロードします。リーダー クラスのメソッドがデフォルトで呼び出され、返されるのは PHPExcel Class オブジェクトです。
PHPExcel_IOFactory::createWriter(PHPExcel, "Excel5")これは、既存の PHPExcel クラス オブジェクトの書き込みクラスを作成するために使用されます。一般的に使用されるパラメータは Excel007 です。
PHPExcel->getActiveSheet デフォルトで現在アクティブ化されているシートを取得します。
PHPExcel->getSheet(index) インデックスに基づいてシートを取得します
PHPExcel->removeSheetByIndex インデックスに基づいてシートを削除します
PHPExcel->addSheet( ) 新しいシートを追加します
PHPExcel->addExternalSheet () 外部テーブルを追加します。このメソッドについて言えば、clone というキーワードも必要になります。このキーワードは、テーブルのコピーを作成することができます。PHPExcel では、列の添え字が計算されることに注意してください。 0 から始まり、行の添え字は 1 から計算されます。
Sheet->getHighestRow() 現在のテーブルの最大行数を取得します
Sheet->getHighestColumn() 現在のテーブルの最大列数を取得しますtable
PHPExcel_Cell::columnIndexFromString() 現在の列数を取得した後、この列は文字の形式で存在するため、非常に使いにくいため、この関数を使用すると、文字の列を数値に変換できます
Sheet->getCell(A1) パラメータはこれに似ています。Cell の内容を取得することもできます。
Sheet->setCellValueByColumnAndRow(column , row, value) 列で参照されるセルの値を更新します。 and row to value
Sheet->getRowIterator() 現在の行のイテレータを取得します
PHPExcel_Cell- >setValue() 現在の Cell の値を設定します。
PHPExcel は Excel ファイルを出力するだけでなく、PDF ファイルなども出力できることに注意してください。これまで理解していなかったので、これから説明します。
以下は私が設計して実装した小さな例です。もちろん、実装されているものには厳密な制限はありません。基本的な関数ですが、学生が PHPExcel を理解するのに役立つと思います
Excel のテーブルの形式は次のとおりです:
名前 備考
<html><head><title> 号码管理系统</title><meta http-equiv="Content-Type" Content="text/html; charset=utf-8"/></head><body><center> <h1>号码管理系统<h1></center><h4> 注意如果需要插入操作,需要姓名和号码都不为空</h4><form method="POST" action="<?php echo $_SERVER["PHP_SELF"]; ?>"> <br>姓名 : <input type="text" name="name"/> <br>号码 : <input type="text" name="num"/> <br>备注 : <textarea name="addition" rows="5" cols="20"> </textarea> <br><input type="submit" name="search" value="查询"/> <input type="submit" name="insert" value="插入"/> <input type="submit" name="delete" value="删除" /><p><?php//设置全局的错误报告error_reporting(E_ALL);//将PHPExcel包含到PHP的include路径中set_include_path(get_include_path().PATH_SEPARATOR."../Classes");//加载PHPExcel的文件require_once("PHPExcel.php");require_once("PHPExcel/IOFactory.php");$filename = "phonelist.xls";//加载Excel文件$phpexcel = PHPExcel_IOFactory::load($filename);$sheet = $phpexcel->getActiveSheet();//获取行数和列数$data_phone = array(array());$row_phone = $sheet->getHighestRow();$column_str = $sheet->getHighestColumn();$column_phone = PHPExcel_Cell::columnIndexFromString($column_str);//建立一个表格用来打印电话号码和用户名function table(){ echo "<br><table border=1 cellpading=20>"; echo "<tr>"; echo "<td width=80>姓名</td>"; echo "<td width=150>号码</td>"; echo "</tr>";}//用来打印有色字体function font($str, $color){ echo "<font color=".$color.">"; echo $str; echo "</font>"; echo "</br>";}//判断如果是查找if (!empty($_POST["search"])){ for ($i = 1; $i <= $row_phone; $i++) { for ($j = 0; $j < $column_phone; $j++) { //遍历行列,将获取到的内容添加到一个预先定义好的数组中 $data_phone[$i - 1][$j] = $sheet->getCellByColumnAndRow($j, $i)->getValue(); } }// var_dump($data_phone); table(); for ($i = 1; $i < $row_phone; $i++) { //将数组内容整合成一个字符串,然后进行子串比对 $phone_item = implode($data_phone[$i]); //名字匹配 if (!empty($_POST["name"])) { if (0 != substr_count($phone_item, $_POST["name"])) { echo "<tr>"; echo "<td>".$data_phone[$i][0]."</td>"; echo "<td>".$data_phone[$i][1]."</td>"; echo "</tr>"; } } //号码匹配 else if (!empty($_POST["number"])) { if (0 != substr_count($phone_item, $_POST["number"])) { echo "<tr>"; echo "<td>".$data_phone[$i][0]."</td>"; echo "<td>".$data_phone[$i][1]."</td>"; echo "</tr>"; } } } echo "</table>";}//如果是插入操作else if (!empty($_POST["insert"])){ if (!empty($_POST["name"]) && !empty($_POST["num"])) { $had = FALSE; $name; $num; //确保将要插入的条目当前系统中不存在 for ($i = 2; $i <= $row_phone; $i++) { $name = $sheet->getCellByColumnAndRow(0, $i)->getValue(); $num = $sheet->getCellByColumnAndRow(1, $i)->getValue(); if (strcmp($_POST["name"], $name) == 0 && strcmp($_POST["num"], $num) == 0) { $had = TRUE; break; } } table(); //如果不存在,则插入 if (FALSE== $had) { font("插入成功", "green"); $sheet->insertNewRowBefore($row_phone + 1, 1); $sheet->setCellValueByColumnAndRow(0, $row_phone + 1, $_POST["name"]); $sheet->setCellValueByColumnAndRow(1, $row_phone + 1, $_POST["num"]); //此处纠结了好久,原来就只是用writer把当前对象加载一下,就可以保存了. $phpwriter = PHPExcel_IOFactory::createWriter($phpexcel, "Excel5"); $phpwriter->save($filename); echo "<tr>"; echo "<td>".$_POST["name"]."</td>"; echo "<td>".$_POST["num"]."</td>"; echo "</tr>"; } //如果存在,则不执行任何动作 else { font("插入失败,条目已存在", "red"); echo "<tr>"; echo "<td>".$name."</td>"; echo "<td>".$num."</td>"; echo "</tr>"; } echo "</table>"; }}//删除操作else if (!empty($_POST["delete"])){ $had = FALSE; if (!empty($_POST["name"]) && !empty($_POST["num"])) { for ($i = 2; $i <= $row_phone; $i++) { $name = $sheet->getCellByColumnAndRow(0, $i)->getValue(); $num = $sheet->getCellByColumnAndRow(1, $i)->getValue(); if (strcmp($name, $_POST["name"]) == 0 && strcmp($num, $_POST["num"]) ==0) { $sheet->removeRow($i, 1); $objWriter = PHPExcel_IOFactory::createWriter($phpexcel, "Excel5"); $objWriter->save($filename); $had = TRUE; } } } //加入用户名和号码有一个是空的,则执行这个分支 if ($had == FALSE) { font("请输入正确的姓名和号码", "red"); font("如果不确定,可以通过查找先定位", "red"); font("即将跳转到删除页面,请稍后...", "green"); //延迟3秒显示上面的信息,然后跳转到删除页面 header("Refresh:3;url=del.php"); } else { font("用户删除成功", "green"); }}?></form></body></html>
<html><head><title>号码删除页面</title><meta http-equiv="Content-Type" content="text/html; charset=utf8"/></head><body><form method="POST" action="<?php $_SERVER["PHP_SELF"] ?>" ><?phperror_reporting(E_ALL);set_include_path(get_include_path().PATH_SEPARATOR."../Classes");require_once("PHPExcel.php");require_once("PHPExcel/IOFactory.php");$filename = "phonelist.xls";$phpexcel = PHPExcel_IOFactory::load($filename);$sheet = $phpexcel->getActiveSheet();$row_phone = $sheet->getHighestRow();$column = $sheet->getHighestColumn();$column_phone = PHPExcel_Cell::columnIndexFromString($column);for ($i = 2; $i <= $row_phone; $i++){ $name = $sheet->getCellByColumnAndRow(0, $i)->getValue(); $num = $sheet->getCellByColumnAndRow(1, $i)->getValue(); //将每一条电话信息用checkbox的方式列出来 if (!empty($name) || !empty($num)) { echo '<input type="checkbox" name="chk[]" value='.$i."/>".$name." ".$num."<br>"; }}?><input type="submit" value="删除" name="delete"/></form><?phperror_reporting(E_ALL);set_include_path(get_include_path().PATH_SEPARATOR."../Classes");require_once("PHPExcel.php");require_once("PHPExcel/IOFactory.php");function font($str, $color){ echo "<font color=".$color.">"; echo $str; echo "</font>"; echo "</br>";}$filename = "phonelist.xls";$phpexcel = PHPExcel_IOFactory::load($filename);$sheet = $phpexcel->getActiveSheet();$row_phone = $sheet->getHighestRow();$column = $sheet->getHighestColumn();$column_phone = PHPExcel_Cell::columnIndexFromString($column);//这个用法是网上借鉴的,还是蛮好用的$chk = $_POST["chk"];for ($i = $row_phone; $i >= 2; $i--){ $name = $sheet->getCellByColumnAndRow(0, $i)->getValue(); $num = $sheet->getCellByColumnAndRow(1, $i)->getValue(); if (empty($name) && empty($num)) { continue; } //在当前勾选的内容中查找,如果在数组中说明勾选了.则删除 if (in_array($i, $chk)) { $sheet->removeRow($i, 1); $clicked = TRUE; echo "<font color=green>".$name." -- ".$num."</font>"; echo "<font color=red>"." 已经成功删除</font><br>"; sleep(1); }}//如果执行了至少一次删除操作,则刷新页面,保存修改后excel表格if (TRUE == $clicked){ $objWriter = PHPExcel_IOFactory::createWriter($phpexcel, "Excel5"); $objWriter->save($filename); $url=$SERVER["PHP_SELF"]; header("refresh:3;url=del.php");}?></body></html>
。