设为首页 收藏本站
查看: 506|回复: 0

[经验分享] PHP导入导出Excel要领

[复制链接]

尚未签到

发表于 2015-8-29 07:36:38 | 显示全部楼层 |阅读模式
  原作者:冰山上的播客
看到这篇文章的时候,很是惊讶原作者的耐心,虽然我们在平时用的也有一些,但没有作者列出来的全,写excel的时候,我用过pear的库,也用过pack压包的头,同样那些运用 smarty等作的基本替换xml的也用过,csv的就更不用谈了。呵呵。(COM方式不讲了,这种可读的太多了,我也写过运用 wps等执行 word等的生成之类的文章 )
但是在读的时候,只用过一种,具体是什么忘了,要回去翻代码了。因为采用的是拿来主义,记不住。
原文地址:http://xinsync.xju.edu.cn/index.php/archives/3858
原文内容:
  最近因项目须要,须要开发一个模块,把系统中的一些数据导出成Excel,修改后再导回系统。就趁机对这个研究了一番,下面执行 一些总结。
基本上导出的文件分为两种:
1:类Excel格式,这个其实不是传统意义上的Excel文件,只是因为Excel的兼容能力强,能够正确打开而已。修改这种文件后再保存,通常会提示你能不能要转换成Excel文件。
优点:基本。
缺点:难以生成格式,如果用来导入须要自己分别编写相应的程序。
2:Excel格式,与类Excel相对应,这种要领生成的文件更接近于真实的Excel格式。
  如果导出中文时出现乱码,可以尝试将字符串转换成gb2312,例如下面就把$yourStr从utf-8转换成了gb2312:
$yourStr = mb_convert_encoding(”gb2312″, “UTF-8″, $yourStr);
  下面细致列举几种要领。
一、PHP导出Excel
  1:第一推选无比风骚的PHPExcel,官方站点: http://www.codeplex.com/PHPExcel
导入导出都成,可以导出office2007格式,同时兼容2003。
下载下来的包中有文档和例子,大家可以自行研究。
抄段例子出来:
  
PHP代码
<?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 . &#8216;../Classes/&#8217;);   
   
/** PHPExcel */   
include &#8216;PHPExcel.php&#8217;;   
   
/** PHPExcel_Writer_Excel2007 */   
include &#8216;PHPExcel/Writer/Excel2007.php&#8217;;   
   
// Create new PHPExcel object   
echo date(&#8217;H:i:s&#8217;) . &#8221; Create new PHPExcel object\n&#8221;;
  $objPHPExcel = new PHPExcel();   
   
// Set properties   
echo date(&#8217;H:i:s&#8217;) . &#8221; Set properties\n&#8221;;   
$objPHPExcel->getProperties()->setCreator(&#8221;Maarten Balliauw&#8221;);   
$objPHPExcel->getProperties()->setLastModifiedBy(&#8221;Maarten Balliauw&#8221;);   
$objPHPExcel->getProperties()->setTitle(&#8221;Office 2007 XLSX Test Document&#8221;);   
$objPHPExcel->getProperties()->setSubject(&#8221;Office 2007 XLSX Test Document&#8221;);   
$objPHPExcel->getProperties()->setDescrīption(&#8221;Test document for Office 2007 XLSX, generated using PHP classes.&#8221;);   
$objPHPExcel->getProperties()->setKeywords(&#8221;office 2007 openxml php&#8221;);   
$objPHPExcel->getProperties()->setCategory(&#8221;Test result file&#8221;);   
   
// Add some data   
echo date(&#8217;H:i:s&#8217;) . &#8221; Add some data\n&#8221;;   
$objPHPExcel->setActiveSheetIndex(0);   
$objPHPExcel->getActiveSheet()->setCellValue(&#8217;A1&#8242;, &#8216;Hello&#8217;);   
$objPHPExcel->getActiveSheet()->setCellValue(&#8217;B2&#8242;, &#8216;world!&#8217;);   
$objPHPExcel->getActiveSheet()->setCellValue(&#8217;C1&#8242;, &#8216;Hello&#8217;);   
$objPHPExcel->getActiveSheet()->setCellValue(&#8217;D2&#8242;, &#8216;world!&#8217;);   
   
// Rename sheet   
echo date(&#8217;H:i:s&#8217;) . &#8221; Rename sheet\n&#8221;;   
$objPHPExcel->getActiveSheet()->setTitle(&#8217;Simple&#8217;);  
  // 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(&#8217;H:i:s&#8217;) . &#8221; Write to Excel2007 format\n&#8221;;   
$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);   
$objWriter->save(str_replace(&#8217;.php&#8217;, &#8216;.xlsx&#8217;, __FILE__));   
   
// Echo done   
echo date(&#8217;H:i:s&#8217;) . &#8221; Done writing file.\r\n&#8221;;   
  
  
  2、运用 pear的Spreadsheet_Excel_Writer类
下载地址: http://pear.php.net/package/Spreadsheet_Excel_Writer
此类依赖于OLE,下载地址:http://pear.php.net/package/OLE
须要留心的是导出的Excel文件格式比较老,修改后保存会提示能不能转换成更新的格式。
不过可以设定格式,很强大。
  
PHP代码
<?php   
require_once &#8216;Spreadsheet/Excel/Writer.php&#8217;;   
   
// Creating a workbook   
$workbook = new Spreadsheet_Excel_Writer();   
   
// sending HTTP headers   
$workbook->send(&#8217;test.xls&#8217;);   
   
// Creating a worksheet   
$worksheet =& $workbook->addWorksheet(&#8217;My first worksheet&#8217;);   
   
// The actual data   
$worksheet->write(0, 0, &#8216;Name&#8217;);   
$worksheet->write(0, 1, &#8216;Age&#8217;);   

  
$worksheet->write(1, 0, &#8216;John Smith&#8217;);   
$worksheet->write(1, 1, 30);   
$worksheet->write(2, 0, &#8216;Johann Schmidt&#8217;);   
$worksheet->write(2, 1, 31);   
$worksheet->write(3, 0, &#8216;Juan Herrera&#8217;);   
$worksheet->write(3, 1, 32);   
   
// Let&#8217;s send the file   
$workbook->close();   
?>     
  
3:运用 smarty,生成符合Excel规范的XML或HTML文件
支持格式,非常完美的导出方案。不过导出来的的本质上还是XML文件,如果用来导入就须要另外处理了。
细致内容请见rardge大侠的帖子:http://bbs.chinaunix.net/viewthread.php?tid=745757
  须要留心的是如果导出的表格行数不确定时,最好在模板中把&#8221;ss:Exp andedColumnCount=&#8221;5&#8243; ss:Exp andedRowCount=&#8221;21&#8243;&#8221;之类的东西删掉。
  4、运用 pack函数打印出模拟Excel格式的断句符号,这种更接近于Excel标准格式,用office2003修改后保存,还不会弹出提示,推选用这种要领。
缺点是无格式。
  
PHP代码
<?php   
// Send Header   
header(&#8221;Pragma: public&#8221;);   
header(&#8221;Exp ires: 0&#8243;);   
header(&#8221;Cache-Control: must-revalidate, post-check=0, pre-check=0&#8243;);   
header(&#8221;Content-Type: application/force-download&#8221;);   
header(&#8221;Content-Type: application/octet-stream&#8221;);   
header(&#8221;Content-Type: application/download&#8221;);;   
header(&#8221;Content-Disposition: attachment;filename=test.xls &#8220;);   
header(&#8221;Content-Transfer-Encoding: binary &#8220;);
  
  xlsBOF();   
xlsWriteLabel(1,0,&#8221;My excel line one&#8221;);   
xlsWriteLabel(2,0,&#8221;My excel line two : &#8220;);   
xlsWriteLabel(2,1,&#8221;Hello everybody&#8221;);   
   
xlsEOF();   
   
function xlsBOF() {   
echo pack(&#8221;ssssss&#8221;, 0&#215;809, 0&#215;8, 0&#215;0, 0&#215;10, 0&#215;0, 0&#215;0);   
return;   
}   
function xlsEOF() {   
echo pack(&#8221;ss&#8221;, 0&#215;0A, 0&#215;00);   
return;   
}   
function xlsWriteNumber($Row, $Col, $Value) {   
echo pack(&#8221;sssss&#8221;, 0&#215;203, 14, $Row, $Col, 0&#215;0);   
echo pack(&#8221;d&#8221;, $Value);   
return;   
}   
function xlsWriteLabel($Row, $Col, $Value ) {   
$L = strlen($Value);   
echo pack(&#8221;ssssss&#8221;, 0&#215;204, 8 + $L, $Row, $Col, 0&#215;0, $L);   
echo $Value;   
return;   
}   
?>   
不过笔者在64位linux系统中运用时失败了,断句符号全部变成了乱码。   
   
5、运用制表符、换行符的要领   
制表符&#8221;\t&#8221;用户分割同一行中的列,换行符&#8221;\t\n&#8221;可以开启下一行。   
<?php   
header(&#8221;Content-Type: application/vnd.ms-execl&#8221;);   
header(&#8221;Content-Disposition: attachment; filename=myExcel.xls&#8221;);   
header(&#8221;Pragma: no-cache&#8221;);   
header(&#8221;Exp ires: 0&#8243;);   
/*first line*/   
echo &#8220;hello&#8221;.&#8221;\t&#8221;;   
echo &#8220;world&#8221;.&#8221;\t&#8221;;   

  echo &#8220;\t\n&#8221;;   
   
/*start of second line*/   
echo &#8220;this is second line&#8221;.&#8221;\t&#8221;;   
echo &#8220;Hi,pretty girl&#8221;.&#8221;\t&#8221;;   
echo &#8220;\t\n&#8221;;   
?>   
  
  
6、运用 com
如果你的PHP可以开启com模块,就可以用它来导出Excel文件
  
PHP代码
<?PHP   
$filename = &#8220;c:/spreadhseet/test.xls&#8221;;   
$sheet1 = 1;   
$sheet2 = &#8220;sheet2&#8243;;   
$excel_app = new COM(&#8221;Excel.application&#8221;) or Die (&#8221;Did not connect&#8221;);   
print &#8220;Application name: {$excel_app->Application->value}\n&#8221; ;   
print &#8220;Loaded version: {$excel_app->Application->version}\n&#8221;;   
$Workbook = $excel_app->Workbooks->Open(&#8221;$filename&#8221;) or Die(&#8221;Did not open $filename $Workbook&#8221;);   
$Worksheet = $Workbook->Worksheets($sheet1);   
$Worksheet->activate;   
$excel_cell = $Worksheet->Range(&#8221;C4&#8243;);   
$excel_cell->activate;   
$excel_result = $excel_cell->value;   
print &#8220;$excel_result\n&#8221;;   
$Worksheet = $Workbook->Worksheets($sheet2);   
$Worksheet->activate;   
$excel_cell = $Worksheet->Range(&#8221;C4&#8243;);   
$excel_cell->activate;   
$excel_result = $excel_cell->value;   
print &#8220;$excel_result\n&#8221;;   
#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
  一、PHP导入Excel
  1:还是用PHPExcel,官方站点: http://www.codeplex.com/PHPExcel。
  2:运用 PHP-ExcelReader,下载地址: http://sourceforge.net/projects/phpexcelreader
举例:
  
PHP代码
<?php   
require_once &#8216;Excel/reader.php&#8217;;   
   
// ExcelFile($filename, $encoding);   
$data = new Spreadsheet_Excel_Reader();   
   
// Set output Encoding.   
$data->setOutputEncoding(&#8217;utf8&#8242;);   
   
$data->read(&#8217; jxlrwtest.xls&#8217;);   
   
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 &#8220;\&#8221;".$data->sheets[0]['cells'][$i][$j].&#8221;\&#8221;,&#8221;;   
}   
echo &#8220;\n&#8221;;   
}   
   
?>   
  ----------

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-105680-1-1.html 上篇帖子: php 序列化 和 json 数据的比较 下篇帖子: php CI框架实现验证码功能和增强验证码安全性实战教程
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表