最近看了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" 之类!