ホームページ  >  記事  >  バックエンド開発  >  PHPはPHPEXcelを使用してテーブルデータをエクスポートします

PHPはPHPEXcelを使用してテーブルデータをエクスポートします

WBOY
WBOYオリジナル
2016-07-25 08:41:591368ブラウズ
php、PHPEXcel

プロジェクトでは、テーブル内のデータをエクスポートする必要があります。オンラインで検索したところ、phpexcel が非常に使いやすいことがわかりましたので、共有したいと思います。

PHPEXCEL

  1. if(!define('BASEPATH')) exit('直接スクリプトアクセスは許可されていません');
  2. //マテリアル発行オーダーの詳細
  3. class Read_write{
  4. /**
  5. * $name: 選択されたタイプ (CSV、EXCEL2003、2007)
  6. * $titles: タイトル配列
  7. * $querys: クエリによって返される配列 $query->result_array();
  8. * $filename: 保存されたファイル名
  9. * /
  10. function write_Factory($titles,$querys,$filename,$name="EXCEL2003"){
  11. $CI = &get_instance();
  12. $filename=mb_convert_encoding($filename, "GBK","UTF-8" ) ;
  13. switch ($name) {
  14. case "CSV":
  15. $CI->excel->write_CSV($titles,$querys,$filename);
  16. Break;
  17. case "EXCEL2003":
  18. $CI - >excel->write_EXCEL2003($titles,$querys,$filename);
  19. Break;
  20. case "EXCEL2007":
  21. $CI->excel->write_EXCEL2007($titles,$querys,$filename);
  22. Break;
  23. }
  24. }
  25. /**
  26. * $name:
  27. */
  28. function read_Facotry($filePath,$sql,$sheet=0,$curRow=2,$riqi=TRUE,$merge=FALSE,$mergeCol= " B"){
  29. $CI = &get_instance();
  30. $name=$this->gt;_file_extend($filePath);
  31. switch ($name) {
  32. case "csv":
  33. $CI->excel-> ; read_CSV($filePath,$sql,$sheet,$curRow,$riqi,$merge,$mergeCol);
  34. break;
  35. case "xls":
  36. $CI->excel->read_2003Excel($filePath,$sql) ,$sheet,$curRow,$riqi,$merge,$mergeCol);
  37. Break;
  38. case "xlsx":
  39. $CI->excel->read_EXCEL2007($filePath,$sql,$sheet,$curRow , $riqi,$merge,$mergeCol);
  40. Break;
  41. }
  42. $CI->mytool->import_info("filePath=$filePath,sql=$sql");
  43. }
  44. /**
  45. * 2012-1-14 ワークブック名​​ (シート名) を読み取ります
  46. * /
  47. function read_sheetNames($filePath){
  48. $CI = &get_instance();
  49. $name=$this->_file_extend($filePath);
  50. $sheetnames;
  51. switch ($name) {
  52. case "csv":
  53. $sheetnames=$CI->excel->read_CSV_Sheet($filePath);
  54. ブレーク;
  55. case "xls":
  56. $sheetnames=$CI->excel->read_2003Excel_Sheet($filePath);
  57. ブレーク
  58. case "xlsx":
  59. $sheetnames=$CI->excel->read_EXCEL2007_Sheets($filePath);
  60. Break;
  61. }
  62. return $sheetnames
  63. }
  64. // ファイルのサフィックス名を読み取ります
  65. function _file_extend($ file_name) {
  66. $extend =explode("." , $file_name);
  67. $last=count($extend)-1;
  68. return $extend[$last];
  69. }
  70. //------ --- -------------------------------------予約準備中
  71. //2011-12-21 CVS 追加エクスポート関数
  72. パブリック関数 export_csv($filename,$title,$datas, $delim = ",", $newline = "n", $enclosure = '"'){
  73. $CI = &get_instance();
  74. $cvs= $this->csv_from_result($title,$datas,$delim,$newline,$enclosure);
  75. $CI->load->helper('download');
  76. $name=mb_convert_encoding($ filename, " GBK","UTF-8");
  77. force_download($name, $cvs);
  78. }
  79. /**
  80. * @param $titles: タイトル
  81. * @param $datas: データ
  82. */
  83. function _csv_from_result($titles,$datas, $delim = "," , $newline = "n", $enclosure = '"'){
  84. $out = '';
  85. // まずテーブルの列名から見出しを生成します
  86. foreach ($titles as $name){
  87. $name=mb_convert_encoding ($name) , "GBK","UTF-8");
  88. $out .= $enclosure.str_replace($enclosure, $enclosure.$enclosure, $name).$enclosure.$delim;
  89. }
  90. $out = rtrim( $out);
  91. $out .= $newline;
  92. // 次に結果の配列を調べて行を構築します
  93. foreach ($datas as $row)
  94. {
  95. foreach ($row as $item)
  96. {
  97. $ item=mb_convert_encoding($item, "GBK","UTF-8");
  98. $out .= $enclosure.str_replace($enclosure, $enclosure.$enclosure, $item).$enclosure.$delim
  99. }
  100. ; $out = rtrim($out);
  101. $out .= $newline;
  102. }
  103. return $out;
  104. }
  105. }
コードをコピー

PHPEXCEL ~ 13KB ダウンロード(28)

    /**
  1. * PHPExcel
  2. *
  3. * Copyright (C) 2006 - 2010 PHPExcel
  4. *
  5. * このライブラリはフリー ソフトウェアです。再配布したり、
  6. * GNU Lesser General Public の規約に基づいて変更したりすることができます
  7. * Free Software Foundation によって発行されたライセンス。
  8. * ライセンスのバージョン 2.1、または (オプションで) それ以降のバージョンのいずれかです。
  9. *
  10. * このライブラリは、役に立つことを願って配布されています
  11. * ただし、いかなる保証もありません。
  12. * 商品性または特定目的への適合性についての暗黙の保証もありません。 詳細については、GNU
  13. * Lesser General Public License を参照してください。
  14. *
  15. * このライブラリと一緒に GNU Lesser General Public License
  16. * ライセンスのコピーを受け取っている必要があります。そうでない場合は、フリー ソフトウェアに連絡してください
  17. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  18. *
  19. * @category PHPExcel
  20. * @package PHPExcel
  21. * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel)
  22. * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
  23. * @version 1.7.4, 2010-08-26
  24. */
  25. /**エラー報告*/
  26. error_reporting(E_ALL);
  27. date_default_timezone_set ('アジア/上海');
  28. /**PHPエクセル*/
  29. require_once 'Classes/PHPExcel.php';
  30. require_once 'Classes/PHPExcel/IOFactory.php';
  31. /**
  32. * ページ上のEXCELに出力
  33. */
  34. /**
  35. * CI_Excel
  36. *
  37. * @package ci
  38. * @author admin
  39. * @copyright 2011
  40. * @version $Id$
  41. * @access public
  42. */
  43. class CI_Excel
  44. {
  45. / /列表,Excel列上の标识
  46. private $cellArray = array(
  47. 1=>'A', 2=>'B', 3=>'C', 4=>'D', 5=>「E」、
  48. 6=>「F」、7=>「G」、8=>「H」、9=>「I」、10=>「J」、
  49. 11=>'K',12=>'L',13=>'M',14=>'N',15=>'O',
  50. 16=>'P',17 =>'Q',18=>'R',19=>'S',20=>'T',
  51. 21=>'U',22=>'V',23= >'W',24=>'X',25=>'Y',
  52. 26=>'Z',
  53. 27=>'AA', 28=>'AB', 29= >'AC'、30=>'AD'、31=>'AE'、
  54. 32=>'AF'、33=>'AG'、34=>'AH'、35=> ;'AI',36=>'AJ',
  55. 37=>'AK',38=>'AL',39=>'AM',40=>'AN',41=> 'AO',
  56. 42=>'AP',43=>'AQ',44=>'AR',45=>'AS',46=>'AT',
  57. 47=> 'AU',48=>'AV',49=>'AW',50=>'AX',51=>'AY',
  58. 52=>'AZ', 53=>' BA'、54=>'BB'、55=>'BC'、56=>'BD'、57=>'BE'、
  59. 58=>'BF'、59=>'BG ', 60=>'BH', 61=>'BI', 62=>'BJ', 63=>'BK', 64=>'BL');
  60. プライベート $E2003 = 'E2003 ';
  61. プライベート $E2007 = 'E2007';
  62. プライベート $ECSV = 'ECSV';
  63. プライベート $tempName; //当读取合文件時,二行目空であれば第一行目の名前
  64. /***********************************データのエクスポート開始************** **** ***********************************/
  65. /**
  66. * Excel2007ファイルを生成します
  67. */
  68. function write_EXCEL2007($title='', $data='',$name='')
  69. {
  70. $objPHPExcel=$this->_excelComm($title,$data,$name);
  71. // 出力をクライアントの Web ブラウザ (Excel2007) にリダイレクトします
  72. ヘッダー('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8');
  73. header("Content-Disposition:attachment;filename=$name.xlsx");
  74. header('Cache -Control: max-age=0');
  75. $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, "Excel2007");
  76. $objWriter->save('php://output'); //output は、出力マシンに入力データを書き込むことを許可します。print() の方法は echo() と同じです。
  77. exit;
  78. }
  79. /**
  80. * Excel2003ファイルを生成します
  81. */
  82. function write_EXCEL2003($title='',$data='',$name=''){
  83. $objPHPExcel=$this->_excelComm($ title,$data,$name);
  84. //出力をクライアントの Web ブラウザ (Excel5) にリダイレクトします
  85. header('Content-Type: application/vnd.ms-excel;charset=UTF-8');
  86. header(" Content-Disposition:attachment;filename=$name.xls");
  87. header('Cache-Control:max-age=0');
  88. $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
  89. $objWriter->save('php://output');
  90. }
  91. /**
  92. * CSVファイルを生成します
  93. */
  94. function write_CSV($title='',$data='',$name='') {
  95. $objPHPExcel=$this->_excelComm($title,$data,$name);
  96. header("Content-Type: text/csv;charset=UTF-8");
  97. header("Content-Disposition:attachment; filename=$name.csv");
  98. header('Cache-Control:must-revalidate,post-check=0,pre-check=0');
  99. header('有効期限:0');
  100. header('Pragma:public');
  101. $objWriter = new PHPExcel_Writer_CSV($objPHPExcel,'CSV');
  102. $objWriter->save("php://output");
  103. exit;
  104. }
  105. function _excelComm($title,$data,$name) ){
  106. // 新しい PHPExcel オブジェクトを作成します
  107. $objPHPExcel = new PHPExcel();
  108. $objPHPExcel=$this->gt;_writeTitle($title,$objPHPExcel);
  109. $objPHPExcel=$this->_writeDatas($data, $objPHPExcel);
  110. $objPHPExcel=$this->_write_comm($name,$objPHPExcel);
  111. return $objPHPExcel;
  112. }
  113. //出标题
  114. function _writeTitle($title,$objPHPExcel){
  115. //表头循環(标题)
  116. foreach ($title as $tkey => $tvalue){
  117. $tkey = $tkey+ 1;
  118. $cell = $this->cellArray[$tkey].'1'; //第$tkey列の第1行,列の标识符(a..z)
  119. // データを追加 //表头
  120. // $tvalue=mb_convert_encoding($tvalue, "UTF-8","GBK ");
  121. $objPHPExcel->setActiveSheetIndex(0)->setCellValue($cell, $tvalue); //設定第$row列の值(标题)
  122. }
  123. return $objPHPExcel;
  124. }
  125. //コンテンツ出力
  126. function _writeDatas($data,$objPHPExcel){
  127. //コンテンツ循環(データベース库查询の戻り値)
  128. foreach($data as $key =>$value) {
  129. $i = 1;
  130. foreach ($value as $mkey =>$mvalue){ // 返される種類はarray([0]=>array) ());, したがって、ここで循環する値、つまりここの配列です
  131. $rows = $key+2; //始まりは二行目
  132. $mrow = $this->cellArray[$i].$rows; //第$i列の第$row行
  133. // $mvalue=mb_convert_encoding($mvalue, "GBK","UTF-8");
  134. // print_r($mrow."--->>".$ mvalue);
  135. $objPHPExcel->setActiveSheetIndex(0)->setCellValueExplicit($mrow, $mvalue);
  136. $i++;
  137. }
  138. }
  139. return $objPHPExcel;
  140. }
  141. function _write_comm($name,$objPHPExcel){
  142. // シートの名前を変更します(左下角の标题)
  143. //$objPHPExcel->getActiveSheet()->setTitle($ name);
  144. // アクティブ シート インデックスを最初のシートに設定すると、Excel はこれを最初のシートとして開きます
  145. $objPHPExcel->setActiveSheetIndex(0); //默认显示
  146. return $objPHPExcel;
  147. }
  148. /***********************************データエクスポート終了************* ***** ***********************************/
  149. /***********************************データ読み込み開始************* **** ************************************/
  150. /**
  151. * 使用法、$insertSql:insert xx (x1,x2,x3,x4) 値 (
  152. )*/
  153. // function _comm_insert($objReader,$filePath,$insertSql,$sheet=2,$ curRow=2,$riqi=TRUE){
  154. function _comm_insert($objPHPExcel,$insertSql,$curRow,$merge=FALSE,$mergeCol='B'){
  155. $CI = &get_instance();
  156. $currentSheet = $objPHPExcel ->getSheet();//指定された激活を獲得
  157. /**合計で列が何個あるかを取得する*/
  158. $allColumn = $currentSheet->getHighestColumn();
  159. /**総行数を取得する*/
  160. $allRow = $currentSheet->getHighestRow();
  161. $size=strlen($allColumn);//如果超出Z,则出现不执行下去
  162. $esql="";
  163. for($currentRow = $curRow;$currentRow<=$allRow;$currentRow++){
  164. $sql=$insertSql;
  165. if($size==2){
  166. $i=1;
  167. $currentColumn='A';
  168. while ($i <= 26) {
  169. $address = $currentColumn.$currentRow ;
  170. $temp=$currentSheet->getCell($address)->getTotalValue();
  171. $sql.='"'.$temp.'"'.",";
  172. $currentColumn++;
  173. $i++;
  174. }
  175. for($currentColumn='AA';$currentColumn $address = $currentColumn.$currentRow;
  176. $sql.='"'.$currentSheet->getCell($ address)->getPracticalValue().'"'.",";
  177. }
  178. }else{
  179. for($currentColumn='A';$currentColumn if($merge )//結合された値の場合は判断し、この行の値が NULL の場合は、前の tempName 値を $temp;
  180. if($currentColumn==$mergeCol){//ここで指定しますB 列の名前は、完了した値の取得を開始します。その後、さまざまな再調整が行われます。
  181. $temp=$currentSheet->getCell($mergeCol.$currentRow)->getTotalValue();
  182. if(empty($temp)){
  183. $temp=$this->tempName;
  184. }else{
  185. $this->tempName=$temp;
  186. }
  187. }else{
  188. $address = $currentColumn.$currentRow;//getValue()
  189. $temp=$currentSheet->getCell($address)->getTotalValue( );
  190. }
  191. }else{
  192. $address = $currentColumn.$currentRow;//getValue()
  193. $temp=$currentSheet->getCell($address)->getTotalValue();
  194. }
  195. $sql=$sql.'"'.$temp.'"'.",";
  196. }
  197. }
  198. $esql=rtrim($sql,",").')';
  199. //echo ($esql);
  200. //return;
  201. $CI->db->simple_query($esql);
  202. }
  203. }
  204. /**
  205. * $filePath: ファイルを読み取るパス
  206. * $insertSql: スペル付き SQL
  207. */
  208. function read_EXCEL2007($filePath,$insertSql,$ Sheet=0,$curRow=2,$riqi=TRUE,$merge=FALSE,$mergeCol="B"){
  209. $objs=$this->_get_PHPExcel($this->E2007,$filePath,$sheet ,$insertSql,$riqi);
  210. $this->_comm_insert($objs["EXCEL"],$objs["SQL"],$curRow,$merge,$mergeCol);
  211. }
  212. /**
  213. * 2003Excelを読んでください
  214. */
  215. function read_2003Excel($filePath,$insertSql,$sheet=0,$curRow=2,$riqi=TRUE,$merge=FALSE,$mergeCol="B"){
  216. $objs=$this->_get_PHPExcel($this->E2003,$filePath,$sheet,$insertSql,$riqi);
  217. $this->_comm_insert($objs["EXCEL"],$objs[" SQL"],$curRow,$merge,$mergeCol);
  218. }
  219. /**
  220. * CSVを読む
  221. */
  222. 関数 read_CSV($filePath,$insertSql,$sheet=0,$curRow=2,$riqi=TRUE,$merge=FALSE,$mergeCol="B"){
  223. $objs=$this->_get_PHPExcel($this->ECSV,$filePath,$sheet,$insertSql,$riqi,$mergeCol);
  224. $this->_comm_insert($objs["EXCEL"],$ objs["SQL"],$curRow,$merge);
  225. }
  226. //--------------------------------读取工作薄信开始
  227. /**
  228. * Excel2007 ワークブック名​​を読み取ります
  229. */
  230. function read_EXCEL2007_Sheets($filePath){
  231. return $this->_get_sheetnames($this->E2007,$filePath);
  232. }
  233. /**
  234. * 2003 Excel ワークブック名​​を読み取ります
  235. */
  236. function read_2003Excel_Sheet($filePath){
  237. return $this->gt;_get_sheetnames($this->E2003,$filePath);
  238. }
  239. /**
  240. * CSV ワークブック名​​の読み取り
  241. */
  242. function read_CSV_Sheet($filePath){
  243. return $this->gt;_get_sheetnames($this ->ECSV,$filePath);
  244. }
  245. //--------------------------------读取工作薄情報结束
  246. /**
  247. * 2012-1-14 ------------------------
  248. */
  249. //读取Reader流
  250. function _get_Reader($name){
  251. $reader=null;
  252. switch ($name) {
  253. case $this->E2003:
  254. $ Reader = new PHPExcel_Reader_Excel5();
  255. ブレーク;
  256. case $this->E2007:
  257. $reader = new PHPExcel_Reader_Excel2007();
  258. ブレーク;
  259. case $this->ECSV:
  260. $reader = new PHPExcel_Reader_CSV();
  261. Break;
  262. }
  263. return $reader;
  264. }
  265. //$objPHPExcel文件对象を取得
  266. function _get_PHPExcel($name,$filePath,$sheet,$insertSql,$riqi){
  267. $reader=$this->_get_Reader( $name);
  268. $PHPExcel= $this->_init_Excel($reader,$filePath,$sheet);
  269. if($riqi){ //如果不必要日期,则忽略.
  270. $insertSql=$insertSql.' "'.$reader->getSheetTitle().'"'.",";//第一字段固定は日期2012-1-9
  271. }
  272. return array("EXCEL"=>$PHPExcel," SQL"=>$insertSql);
  273. }
  274. //工作薄名を取得
  275. function _get_sheetnames($name,$filePath){
  276. $reader=$this->gt;_get_Reader($name);
  277. $this-> ;_init_Excel($reader,$filePath);
  278. return $reader->getAllSheets();
  279. }
  280. //追加文書
  281. function _init_Excel($objReader,$filePath,$sheet=''){
  282. $objReader-> ;setReadDataOnly(true);
  283. if(!empty($sheet)){
  284. $objReader->setSheetIndex($sheet);//第二シートを取得します。
  285. }
  286. return $objReader->load("$filePath");
  287. }
  288. //---------------------------- ---2012-1-14
  289. }
  290. /***********************************データ読み取り終了************* ** ************************************/
コードをコピー

[PHP] コード

  1. -------------------------------------インポート操作---------------------- --------- ----
  2. /**
  3. * $sql="「.mymsg::WY_MMB.」に挿入します。" (dizhi,xingming) 値 (";
  4. )*/
  5. //まずアップロードしてからファイルを読み取ります
  6. function upByFile($sql, $url, $curRow = 2, $RIQI = true,$merge = FALSE,$mergeCol= 'B')
  7. {
  8. $CI = &get_instance();
  9. $config['allowed_types'] = '*' //すべてのファイルを許可します
  10. $config['upload_path'; ] = IMPORT; // ファイルのみ パス
  11. $CI->load->library('upload', $config);
  12. if ($CI->upload->do_upload()) { //デフォルトの名前は次のとおりです: userfile
  13. $data = $CI->upload->data();
  14. $full_name = $data['full_path'] //保存されたパスを取得します
  15. $full_name = mb_convert_encoding($full_name) , "GBK", "UTF- 8");
  16. $sheet = $CI->input->post("sheet") // x 番目の縦棒グラフを読み取ります
  17. if (empty($sheet)) {
  18. $sheet = 0;
  19. }
  20. $CI->read_write->read_Facotry($full_name, $sql, $sheet, $curRow, $RIQI,$merge,$mergeCol) //挿入コマンドを実行します
  21. }
  22. $this->alert_msg(mymsg::IMPORT_SUCCESS, site_url($url));
  23. }
  24. ---------------------- --------エクスポート操作 ----------------------------------
  25. //指定されたテーブルフィールド
  26. public function show_export(){
  27. //-----データベースフィールド
  28. $field=implode(",",$this->input->post("listCheckBox_show"));//データベースfield
  29. //表示名
  30. $titleArray=$ this->input->post("listCheckBox_field");//表示されるフィールド名 (field Comment アノテーション名、いくつかの空の配列が渡されるため、フィルターする必要があります) )
  31. $title=array();
  32. foreach ( $titleArray as $key => $value) {
  33. if (!empty($value)) {
  34. $title[]=$value;
  35. }
  36. }
  37. / /---データベーステーブル名
  38. $table=$ this->input->post("tableName");
  39. //--データベーステーブル名(コメント)
  40. $show_name=$this->input-> ;post("tableComment");
  41. // -- エクスポートの種類
  42. $type=$this->input->post("type");
  43. //-- 年と月の場合
  44. $y_month=$ this->input->post("year_month ");
  45. if(!empty($y_month)){
  46. $where["riqi"]=$y_month;
  47. $datas=$this->mcom_model-> ;queryByWhereReField($field,$where,$table) ;
  48. }else{
  49. //--書き込まれたデータ
  50. $datas=$this->mcom_model->queryByField($field,$table); //---エクスポートを開始します
  51. $this ->read_write->write_Factory($title,$datas,$show_name,$type);
  52. }
  53. コードをコピー

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。