最近看了excel 发现好多时候excel 这个表格处理软件,还是挺不错的!于是就想用php 来操作一下Excel! 说来也没什么的,就是借用了一个开源的phpexcel 的类!
但是,也是经过本人测试,所以记录了下!
首先是php 链接Access ,这个是比较简单的!
<?php ini_set(max_execution_time,3000); ini_set(memory_limit,"1024M");
function microtime_float() { list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec); }
$start_time=microtime_float(); error_reporting(E_ERROR); date_default_timezone_set('Asia/Shanghai');
/** PHP Excel* */ require_once 'classes/PHPExcel.php';
//Create new PHPExcel object $objexcel = new PHPExcel();
//Set properties $objexcel->getProperties()->setCreator("Neve Zhang")->setCategory("Poem");
//AddSome data $conn = @new com("ADODB.Connection") or die('ADO connnection failed'); if (!$conn) { echo "<h5>链接失败</h5>"; } define('filepath', dirname(__FILE__)); define('DB_HOST', filepath . "/data/data.mdb"); $connstr = "driver={microsoft access driver (*.mdb)}; dbq=" . str_replace("/", "\\", DB_HOST) . ";uid='';pwd='';";
$conn->open($connstr); if ($conn->state == 0) { $conn->open($connstr); } $sql = "select top 1000 * from poem"; $rs = @new com("adodb.recordset"); $rs = $conn->execute($sql); $fld = array(); $i = 0; $count = $rs->fields->count();
while (!$rs->eof) { for ($j = 0; $j < $rs->fields->count(); $j++) {
$fld[$i][$j] = $rs->fields[$j]->value; }
$rs->Movenext(); $i = $i + 1; } $e_col=2;
$objexcel->setActiveSheetIndex(0) ->setCellValue("A1","序号") ->setCellValue("B1","标题") ->setCellValue("C1","n_id") ->setCellValue("D1","z_id") ->setCellValue("E1","内容") ->setCellValue("F1","注释") ->setCellValue("G1","upsize_ts");
foreach ($fld as $rows) {
// print_r($rows); $e_row='A'; // $num=intval($e_col/500); foreach ($rows as $cloums) {
// echo $e_row.$e_col."=".$cloums;
$objexcel->setActiveSheetIndex(0)->setCellValue("$e_row"."$e_col",iconv('GBK','utf-8',$cloums)); $e_row++; } $e_col++; } $objexcel->getActiveSheet()->setTitle('Poem Test'); $objWriter=PHPExcel_IOFactory::createWriter($objexcel,'Excel2007'); //$objWriter->save("5000poem.xlsx");
//$objWriter_2=new PHPExcel_Writer_Excel2007($objWriter); /**header("Content-Type:text/xml; charset=UTF-8"); header("Progma:Public"); header("Expires:0"); header("Cache-Control:must-revalidate, post-check=0, pre-check=0"); header("Content-Type:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); header("Content-Disposition:attachment;filename=resume.xlsx"); header("Content-Transfer-Encoding:binary"); * **/
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); header('Content-Disposition: attachment;filename="01simple.xlsx"'); header('Cache-Control: max-age=0'); $objWriter_2= $objWriter->save("php://output");
/** $end_time=microtime_float();
echo $start_time."<br />"; echo $end_time; $time=$end_time-$start_time; echo "<br /><b>". sprintf( "%01.5f ", $time)."</b>"; **/
?>
其中一开始设置了php 的最大运行时间和最大运行内存,因为,是测试嘛!所以读了50000条的数据,内存一开始尽然512M 都显示耗尽!没办法,于是乎直接调整到1024M,这次是够了,最后统计了下时间, 发现竟然用了300多秒,差不多五分钟!
还好数据库字段不错,还能勉强运算完毕! 还好,excel2007 据说可以支持1,000,000 行的数据,于是那肯定是问题了!
对了,其实php 连接access 的步骤也是先建立一个connection,然后再创建一个记录集!然后,用movernext 来下移动指针,我也直接用了一个二维数组来转换recordset 记录集!可能有更好的办法!
其中其中有一点,就是recordset 转换来的二维数组,用var_dump() 这个函数总是输不出结果来,最后只有用print_f() 来查看数据!
上面的代码就是操作phpexcel 了,其中代码有点乱,许多都被我注释掉了!
其中有几个乱码的问题,在其中也是需要注意的,还有就是输出到客户端,其中也有细节要注意下! 不然的话,也会报excel的错误! 首先是版本不好弄错了,然后就是输出到客户端浏览器的页面不要再有任何的输出了! 尤其是其中被我注释掉的地方!
比如" echo" 之类!
|
请发表评论