
最近因项目需要,需要开发一个模块,把系统中的一些数据导出成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。
下载下来的包中有文档和例子,大家可以自行研究。
抄段例子出来:
/**
* 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文件格式比较老,修改后保存会提示是否转换成更新的格式。
不过可以设定格式,很强大。
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文件,如果用来导入就需要另外处理了。
详细内容请见rardge大侠的帖子:http://bbs.chinaunix.net/viewthread.php?tid=745757
需要注意的是如果导出的表格行数不确定时,最好在模板中把"ss:ExpandedColumnCount="5" ss:ExpandedRowCount="21""之类的东西删掉。
用 PHP 生成 Excel 文件早已不是什么难题了,但若生成的 Excel 文件没有格式(边框线、居中、字体等),其实就是生成文本文件再用 Excel 打开而已。
在 Windows 平台下,可能用 COM 组件可以做到这点,但在 Unix 类系统环境下就没这么幸运了。
首先看一下当时这个新闻吧:
http://bbs.chinaunix.net/viewthread.php?tid=204738&highlight=excel [微软发Office免费许可 开放其XML文件格式]
基本上还是要感谢微软,否则白搭。
我做的也就是使用其 XML 格式。注意:也就是说,这种方法生成的文件可能只对 Office 2003 有效。
至于 Excel 的 XML 格式,各位可以自己仔细研究,新建一个工作簿,然后简单的设置一些单元格,输入一些内容,然后选择另存为,保存类型选择“XML表格”即可。
用文本编辑器打开刚才那个 XML 文件,看看它是怎么描述一个单元格的格式的。它也是用
32.
35.
44.
54.
55. 56. 58. 59. 60. 61. 62. 63. . 65. 66. 67. 68. 69. 70. 71. 72. 73. <{* 在这里对要循环输出的数据使用 section 处理。*}> 74. <{section name=list loop=$Emps}> 75. 76. 77. 78. 79. 80. 81. 82. <{/section}> 83. 84. 85.57. x:FullRows="1" ss:DefaultColumnWidth="54" ss:DefaultRowHeight="17.25">
86.
复制代码
不一定要和我上面这个一模一样,以上我经过少许删减,比如我把最后的 配套的 PHP 测试程序(excel.php): 1.2. // 实验资料,实际作业中,这里应该是从数据库取得资料 3. $emps[0]['id'] = '00001'; 4. $emps[0]['name'] = 'ABC'; 5. $emps[0]['sexual'] = '男'; 6. $emps[0]['age'] = 28; 7. 8. $emps[1]['id'] = '00002'; 9. $emps[1]['name'] = 'BBC'; 10. $emps[1]['sexual'] = '男'; 11. $emps[1]['age'] = 23; 12. 13. $emps[2]['id'] = '00003'; 14. $emps[2]['name'] = 'CBA'; 15. $emps[2]['sexual'] = '女'; 16. $emps[2]['age'] = 20; 17. 18. ini_set('include_path', '/data/website/htdocs/includes'); 19. require_once('class.Smarty.php'); 20. $smarty = new mySmarty(); 21. 22. $smarty->assign('Emps', $emps); 23. 24. // 输出文件头,表明是要输出 excel 文件 25. header("Content-type: application/vnd.ms-excel"); 26. header("Content-Disposition: attachment; filename=test.xml"); //<----- 这里,改成 test.xls 也可以,这样就可以直接用 Excel 打开了。不过本质还是 xml,用记事本打开就知道了。所以打开后,再另存一下,存为真正的 xls 格式。 27. 28. $smarty->display('excel.tpl'); 29.?> 复制代码 完工,放到服务器 麻烦的地方,就是 Excel 样表转换成 XML 并修改成 Smarty 模板那一步。 我上面那个例子相对来说简单,因为格式比较单一。更复杂点的报表就要麻烦点了,要在模板中一个个单元格自己去放置 StyleID 值了。 不过,总算能输出一份漂亮的带格式的 Excel 了,这点辛苦还是值得的。 4、利用pack函数打印出模拟Excel格式的断句符号,这种更接近于Excel标准格式,用office2003修改后保存,还不会弹出提示,推荐用这种方法。 缺点是无格式。 // 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", 0x809, 0x8, 0x0, 0x10, 0x0, 0x0); return; } function xlsEOF() { echo pack("ss", 0x0A, 0x00); return; } function xlsWriteNumber($Row, $Col, $Value) { echo pack("sssss", 0x203, 14, $Row, $Col, 0x0); echo pack("d", $Value); return; } function xlsWriteLabel($Row, $Col, $Value ) { $L = strlen($Value); echo pack("ssssss", 0x204, 8 + $L, $Row, $Col, 0x0, $L); echo $Value; return; } ?> 不过笔者在位linux系统中使用时失败了,断句符号全部变成了乱码。 5、使用制表符、换行符的方法 制表符"\"用户分割同一行中的列,换行符"\\\n"可以开启下一行。 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"."\"; echo "world"."\"; echo "\\\n"; /*start of second line*/ echo "this is second line"."\"; echo "Hi,pretty girl"."\"; echo "\\\n"; ?> 6、使用com 如果你的PHP可以开启com模块,就可以用它来导出Excel文件 $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 一、PHP导入Excel 1:还是用PHPExcel,官方网站: http://www.codeplex.com/PHPExcel。 2:使用PHP-ExcelReader,下载地址: http://sourceforge.net/projects/phpexcelreader 举例: 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"; } ?> 最近因项目需求,要实现将excel文件通过php页面导入mysql数据库中。在网上搜了很多这方面的资料,发现都是将excel文件另存为csv文件,然后从csv文件导入。这里介绍一个直接将excel文件导入mysql的例子。我花了一晚上的时间测试,无论导入简繁体都不会出现乱码,非常好用。 PHP-ExcelReader,下载地址: http://sourceforge.net/projects/phpexcelreader 说明: 测试环境:MYSQL数据库采用utf8编码.导入EXCEL文档是xls格式,经过测试,xlsx 格式[excel 2007]也OK. 文中红色标注为需要注意的地方,请替换成你配置好的数据,如数据库配置等。运行http://localost/test.php实现导入。 以下是我贴出的详细代码,其中test.php为我写的测试文件,read.php和oleread.inc文件是从上面提供的网址中下载的。 1. test.php require_once 'reader.php'; // ExcelFile($filename, $encoding); $data = new Spreadsheet_Excel_Reader(); // Set output Encoding. $data->setOutputEncoding('gbk'); //”data.xls”是指要导入到mysql中的excel文件 $data->read('data.xls'); @ $db = mysql_connect('localhost', 'root', '123456') or die("Could not connect to database.");//连接数据库 mysql_query("set names 'gbk'");//输出中文 mysql_select_db('mydb'); //选择数据库 error_reporting(E_ALL ^ E_NOTICE); for ($i = 1; $i <= $data->sheets[0]['numRows']; $i++) { //以下注释的for循环打印excel表数据 /* for ($j = 1; $j <= $data->sheets[0]['numCols']; $j++) { echo "\\"".$data->sheets[0]['cells'][$i][$j]."\\ } echo "\\n"; */ //以下代码是将excel表数据【3个字段】插入到mysql中,根据你的excel表字段的多少,改写以下代码吧! $sql = "INSERT INTO test VALUES('". $data->sheets[0]['cells'][$i][1]."','". $data->sheets[0]['cells'][$i][2]."','". $data->sheets[0]['cells'][$i][3]. echo $sql.' $res = mysql_query($sql); } ?> 2.reader.php 谢谢啊! select * from yourtable into outfile "C:\\\\data.xls" 下面只是主要程序部分: /***************************************** **********作者:冲星/arcow**************** **********njj@nuc.edu.cn******************* **********php导入csv文件到数据库********** **********同时计算程序执行时间*********** **********www.knowsky.com*********** ****************************************/ //定义获取时间函数 function getmicrotime(){ list($usec, $sec) = explode(" ",microtime()); return ((float)$usec + (float)$sec); } ?> $time_start = getmicrotime(); include("db.inc.php");//连接数据库 $db=new testcsv; ?> $handle = fopen ("test.csv $sql="insert into scores(idcard,names,num,sex,nation,score) values('"; while ($data = fgetcsv ($handle, 1000, $num = count ($data); for ($c=0; $c < $num; $c++) { if($c==$num-1){$sql=$sql.$data[$c]."')";break;} $sql=$sql.$data[$c]."','"; } print " echo $sql." $db->query($sql); echo "SQL语句执行成功! $sql="insert into scores(idcard,names,num,sex,nation,score) values('"; } fclose ($handle); $time_end = getmicrotime(); $time = $time_end - $time_start; echo "程序执行时间:".$time."秒"; ?> 说干就干,很快小阳便将这功能推出来了。那是如何实现的呢?这里仅以导出姓名、邮箱和OICQ三项予以说明。 要资料可以导入Foxmail地址簿,当然要先了解一下导入Foxmail地址簿的文件内容和格式。打开Foxmail4.2一个帐户的地址簿,在其菜单栏“工具”-“导入”中可以看到,Foxmail支持两种外部文件的导入:“CSV文件”和“Wab文件”。我们选择生成CSV文件。那么可以导入Foxmail的CSV文件的内容和格式如何呢?让我们先从Foxmail导出一个CSV文件看一下。在Foxmail地址簿中选择一个记录不为空的文件夹,执行“工具”-“导出”- “文本文件”,保存文件名为“TEMP.CSV”, 在“下一步”的“请选择输出字段”中选择“姓名”、“电子邮箱地址”和“OICQ”,点击“完成”后便在指定路径生成了“TEMP.CSV”文件了。如果你装了微软office系列,会发现这是一个用EXCEL默认打开的文件,实际上它是EXCEL的逗号分隔值文件,双击打开后,其界面如图所示。 我们在这种情况下还是无法知道它的写入格式的。将“TEMP.CSV”文件改为用记事本打开,便可以发现它的格式非常简单:如图,文件第一行是Foxmail地址簿的字段,其它行是字段对应的值,各字段和值用英文逗号分隔。所以我们在PHP中按这种格式生成CSV文件,别人就可以下载并导入他们的Foxmail中了! 不过还有一个问题需要解决,那就是既然文件中以逗号作为分隔值,如果数据库记录中有英文逗号(注:以下符号若无特别说明皆指英文符号)怎么办?当然你可以先将数据中的逗号替换为中文逗号,但其实还有一个方法,那就是如果CSV文件相应的字段两端加上双引号(“即" "”)作分隔值,其间的英文逗号不作为分隔值,且字段中连续两个英文双引号(即“""”)也只作为一个显示,而不作为分隔值。 有了这些认识,我们就可以编写导出CSV文件的PHP文件了: //这一行一定要放在程序的开始地方,不能有空格或换行。因为下面的header()函数不允许在使用前向用户输出任何东西。 $dfname="tofoxmail.csv"; //生成的文件名 //连接mySQL数据库: mysql_connect("localhost不能连接数据库!"); mysql_select_db("alumni") or die("数据库发生错误!"); if($action=="downit"){ $getdata=mysql_query("SELECT name,email,oicq FROM classdata"); //选择数据表中指定记录 //如果没有资料,则: if(@mysql_num_rows($getdata)==0){ echo "对不起,还没有任何资料!"; exit; } //以下生成一个文件供下载: header("Content-disposition: filename=$dfname"); header("Content-type: unknown/unknown"); echo "姓名,电子邮件地址,OICQ,foxaddrID"; //输出第一行,Foxmail地址簿的字段 $i=1; while($row=mysql_fetch_array($getdata)){ //取得数据类型的值 //将数据中每一个双引号替换为两个: $row[name]=str_replace("\\" $row[email]=str_replace("\\" $row[oicq]=str_replace("\\" //输出相应字段对应的值的行,每个值用双引号和逗号作分隔符: echo base_decode("DQo=")."\\"$row[name]\\",\\"$row[email]\\",\\"$row[oicq]\\",$i"; /*上式中“base_decode("DQo=")”是换行符,之所以不用“\\n”,是因为两者不完全相同, 用后者将可能导致Foxmail导入失败。 */ $i++; } exit; } ? > < !--如果不是点击了下载的链接,则显示以下HTML内容-- > < html> < head> < meta http-equiv="Content-Type" content="text/html; charset=gb2312"> < title>导出资料到Foxmail地址簿< /title>< /head> < body> 点击< a href=\\'javascript:this.location=this.location+"?action=downit"\\'>这里< /a>下载文件,保存并导入到您的Foxmail地址簿中。< br> < B>操作方法< /B>< br> …… < /body> < /html> 在服务器上运行上述PHP文件,下载回来的“tofoxmail.csv”文件用记事本打开如图所示。 在Foxmail地址簿中点击“工具”-“导入”-“CSV文件”……,数据库中一大堆的资料一下子就全被导入了,这个主意还不错吧! (以上程序在Apache+PHP4+mySQL和IIS+PHP4+mySQL中皆测试通过。)上跑一下吧。
利用PHP-ExcelReader实现PHP导入Excel数据[不通过CSV] "')";
';
在XP系统下运用PHP编程后,如何导出CSV文件?为什么我到处的CSV文件是文本形式的,而且会乱码,有没有高手能告诉小弟,如何到处不乱码的.csv文件,最好能是excel形式的。略
用PHP将数据导入到Foxmailphp中数据的批量导入(csv文件) 有时写程序时后台要求把大量数据导入数据库中,比如计算机考试成绩的查询、电话簿的数据等一般都是存放在Excel中的,这时我们可把数据导出成csv文件,然后通过以下程序即可在后台批量导入数据到数据库中。
";
";
";作者:暖阳 来源:Pconline 最近小阳做了一个PHP同学录,同学们自己在那里添加或修改姓名、邮箱、OICQ等信息,并保存在mySQL数据库里。某日小阳突然想到,如果能用PHP生成一个文件,供同学们下载并把这些资料导入他们的Foxmail地址簿中,那该多好啊!
