实时查询导出excel的技术实现

本文章主要是讲如何做一个实时查询导出excel的应用。
首先要复习的知识点是:
json格式数据特点 ,以及php操作json格式数据的函数(json_decode() json_encode()) ,phpexcel(http://phpexcel.codeplex.com/) 的使用,还有post请求与get请求的特点,我对这几个知识点不详细介绍,后面用的时候略讲
原理如下:
将查询后得到的数据以json格式存贮在显示查询结果的页面中,设置属性为隐藏,例如:

[html]
<form metho="post" action="">
<!–
//不用GET是因为GET方法传递数据的长度有限制
//注意<{$data}>为结果数据 value后面的是单引号,不能用双引号,因为json格式数据中用的是双引号。
–>
<input type="hidden" name="data" value='<{$data}>’/>
<input type="submit" value="导出"/>
</form>
[/html]
如何简单做出实时查询?我们知道查询的条件可能有很多,那如何控制SQL语句呢,我采用的是封装的思想,例如用MVC模型,都提供了统一的数据操作接口,有时候可以直接用下面的语句
[php]
$db=d("db");
$result= $db->query($_POST);
//$_POST 储存的是key=>value 数组,也就是你查询用到的条件,但是,我们不能直接用上面的方法,因为有的kye值value为空,并列查询时得到的结果为空
$query=array();
foreach($_POST as $key=>$value){
if(trim($value)!=""){
$query[$key]=>trim($value);

}

}
$result=$db->query($query)->select();

[/php]
然后呢,我们导出报表要有标题吧,那么加在结果后面加一列标题
[php]
$result[]=array("列一","列二","列三","列四","列五","列六");
$data=json_encode($result);
[/php]
然后把$result数组传给刚才表单的$data就行了
这只是前台的一个实现,导出呢,还需要一些工作
我们新建一个文件用户接收post数据。
[php]
<?php

error_reporting(E_ALL);

/** PHPExcel */
require_once ‘./excel/PHPExcel.php’;
require_once ‘./config.inc’;
/** PHPExcel_IOFactory */
require_once ‘./excel/PHPExcel/IOFactory.php’;
$data=$_POST[‘data’];
if(get_magic_quotes_gpc())//如果get_magic_quotes_gpc()是打开的

{
$data=stripslashes($data);//将字符串进行处理

}
$data=json_decode($data,true);

$objPHPExcel = new PHPExcel();

// Set properties
$objPHPExcel->getProperties()->setCreator("Maarten Balliauw")
->setLastModifiedBy("Maarten Balliauw")
->setTitle("Office 2007 XLSX Test Document")
->setSubject("Office 2007 XLSX Test Document")
->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.")
->setKeywords("office 2007 openxml php")
->setCategory("Test result file");

$sy=array("A","B","C","D","E","F","G","H","I","J","K","L","M","N");

$num=count($data);
foreach($data[$num-1] as $key=>$value){
$objPHPExcel->setActiveSheetIndex(0)->setCellValue($sy[$key]."1", $value,PHPExcel_Cell_DataType::TYPE_STRING);

}
$i=2;

foreach ($data as $key=>$row){
if($i>$num){
break;

}
$j=0;

foreach($row as $innerkey=>$innerrow){

$objPHPExcel->setActiveSheetIndex(0)->setCellValue($sy[$j].$i, $innerrow,PHPExcel_Cell_DataType::TYPE_STRING);
//$objPHPExcel->setActiveSheetIndex(0)->setCellValue("A".$j, $innerrow,PHPExcel_Cell_DataType::TYPE_STRING);
//echo $innerrow."<br/>";
$j++;}

// Miscellaneous glyphs, UTF-8

// Rename sheet}

$i++;
}
$objPHPExcel->getActiveSheet()->setTitle(‘报表’);

// Set active sheet index to the first sheet, so Excel opens this as the first sheet
$objPHPExcel->setActiveSheetIndex(0);
$name=time();

// Redirect output to a client’s web browser (Excel5)
header(‘Content-Type: application/vnd.ms-excel’);
header(‘Content-Disposition: attachment;filename="’.$name.’.xls"’);
header(‘Cache-Control: max-age=0’);

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, ‘Excel5’);
$objWriter->save(‘php://output’);
exit;
?>

[/php]
对上面代码不熟悉,参看PHPEXCLE文档

Leave a Reply

Time limit is exhausted. Please reload CAPTCHA.

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据