实时查询导出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文档

精炼的jquery评分代码

[html]
<html>
<head><title>JQuery星星评级</title><meta http-equiv="Content-Type" content="text/html; charset=gbk" />
<script src="http://jqueryjs.googlecode.com/files/jquery-1.2.6.min.js" type="text/javascript"></script>
<style type="text/css">
<!–
.star_rating {background:url(https://www.lvxinwei.com/wp-content/uploads/2012/03/114922_gGrF_101311.gif) -80px 0 no-repeat; padding:0;margin:0; width:80px; height:16px; float:left; position:relative; }
.star_rating li {padding:0;margin:0;float:left;width:16px;height:16px;}
–>
</style>
</head><body>
<div style="display:block; float:left;width:100px;"><span>*</span>&nbsp;总体评价:</div>
<ul class="star_rating"><li><li/><li><li/><li></li><li></li></ul>

<script type="text/javascript">
$(‘.star_rating li’).each(function(){
$(this).click(function(obj){
$(‘.star_rating li’).unbind();//移除事件绑定
var Too = (obj.srcElement.offsetLeft+16);
setStarPos(Too-80);
alert((Too/16)+’星’);
}).mouseover(function(obj){
setStarPos((obj.srcElement.offsetLeft+16)-80);
}).mouseout(function(obj){
setStarPos(‘-80’);
});
});
function setStarPos(le){
$(‘.star_rating’).css({‘backgroundPosition’:le+’px 0′});
};
</script></body></html>
[/html]

PHP Javascipt

Create an array containing the range of integers or characters from low to high (inclusive)
[js]
function range (low, high, step) {
// Create an array containing the range of integers or characters from low to high (inclusive)
//
// version: 1109.2015
// discuss at: http://phpjs.org/functions/range
// + original by: Waldo Malqui Silva
// * example 1: range ( 0, 12 );
// * returns 1: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
// * example 2: range( 0, 100, 10 );
// * returns 2: [0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
// * example 3: range( ‘a’, ‘i’ );
// * returns 3: [‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘g’, ‘h’, ‘i’]
// * example 4: range( ‘c’, ‘a’ );
// * returns 4: [‘c’, ‘b’, ‘a’]
var matrix = [];
var inival, endval, plus;
var walker = step || 1;
var chars = false;

if (!isNaN(low) && !isNaN(high)) {
inival = low;
endval = high;
} else if (isNaN(low) && isNaN(high)) {
chars = true;
inival = low.charCodeAt(0);
endval = high.charCodeAt(0);
} else {
inival = (isNaN(low) ? 0 : low);
endval = (isNaN(high) ? 0 : high);
}

plus = ((inival > endval) ? false : true);
if (plus) {
while (inival <= endval) {
matrix.push(((chars) ? String.fromCharCode(inival) : inival));
inival += walker;
}
} else {
while (inival >= endval) {
matrix.push(((chars) ? String.fromCharCode(inival) : inival));
inival -= walker;
}
}

return matrix;
}
[/js]
[js]
function range (low, high) {
// http://phpjs.org/functions/range:499
var matrix = [];
var inival, endval, plus;
var chars = false;

if ( /^d+$/.test(low) && /^d+$/.test(high) ) {
inival = parseInt(low);
endval = parseInt(high);
} else {
chars = true;
inival = low.charCodeAt(0);
endval = high.charCodeAt(0);
}

plus = (inival > endval) ? false : true;
if (plus) {
while (inival <= endval) {
matrix.push( chars ? String.fromCharCode(inival) : inival );
inival += 1;
}
} else {
while (inival >= endval) {
matrix.push( chars ? String.fromCharCode(inival) : inival );
inival -= 1;
}
}

return matrix;
}
[/js]

PHP定时执行任务

1.不好的方法
[php]
ignore_user_abort();//关掉浏览器,PHP脚本也可以继续执行.
set_time_limit(0);// 通过set_time_limit(0)可以让程序无限制的执行下去
$interval=60*30;// 每隔半小时运行
do{
//这里是你要执行的代码
sleep($interval);// 等待5分钟
}while(true);
[/php]
2.借助系统定时任务,使用PHP命令
linux 借助crontab 命令

[shell]
* * * * * /var/php目录/php /var/www/crontab/index.php
//每分钟执行一次crontab 下的index.php
[/shell]

建立一个高效的Tree表

适用操作系统:任何Linux或UNIX。

主脚本(用于备份mysql数据库):

该Shell脚本可以自动备份数据库。只要复制粘贴本脚本到文本编辑器中,输入数据库用户名、密码以及数据库名即可。我备份数据库使用的是mysqlump 命令。后面会对每行脚本命令进行说明。

1. 分别建立目录“backup”和“oldbackup”

[shell]
#mkdir /backup
#mkdir /oldbackup

[/shell]

2. 现在使用你喜欢的编辑软件创建并编辑“backup.sh”

这里我用的是 vi

[shell]
# vi /backup/backup.sh
#!bin/bash
cd /backup
echo “You are In Backup Directory”
mv backup* /oldbackup
echo “Old Databases are Moved to oldbackup folder”
Now=$(date +”%d-%m-%Y–%H:%M:%S”)
File=backup-$Now.sql
mysqldump –u user-name –p ‘password’ databasename > $File
echo “Your Database Backup Successfully Completed”
[/shell]

脚本说明:

切记,在第8行命令中,在mysqldump命令后要输入自己的数据库用户名、密码及数据库名。

执行该脚本,首先会进入 /backup 目录,然后该脚本会把原有的旧数据库备份移动到 /oldbackup 文件夹中,接着根据系统的日期及时间生成一个文件名,在最后 mysqldump 命令会生成一个“.sql”格式的数据库备份文件。
3. 设置 backup.sh 脚本文件的可执行许可

[shell]
# chmod +x /backup/backup.sh
[/shell]

注:首次执行该脚本会有一个“no such file”的提示信息,这是由于旧备份文件还不存在。只要再次执行该脚本就没有问题了,这个问题已经不存在了。
5. 使用cron制订备份计划

使用Cron可以定时执行该脚本,备份会自动完成。使用 crontab 命令编辑cron 执行的计划任务。

[shell]
#crontab –e
[/shell]

添加一行

[shell]
0 13 * * * /backup/backup.sh
[/shell]

说明:f1 f2 f3 f4 f5 program
其中 f1 是表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份,f5 表示一个星期中的第几天。program 表示要执行的程式。