Go homepage(回首页)
Upload pictures (上传图片)
Write articles (发文字帖)

The author:(作者)归海一刀
published in(发表于) 2014/2/17 7:34:04
php实现报表类_[PHP教程]

php实现报表类_[PHP教程]

原创内容....实现曲线图,饼图,柱形图.


转贴请注明出处,


http://blog.csdn.net/liq330


效果图:




原代码如下:




class ImageReport
{
var Image;//图片对像

var ImageName;//报表名称
var ImageType;//报表类型

var ImageWidth;//图片宽
var ImageHeight;//图片高


var BgImage;//背景图片
var BgR;//背景颜色R值
var BgG;//背景颜色G值
var BgB;//背景颜色B值

var FontSize;//字体大小
var FontColor;//字体颜色

var ItemArray;//数据数组
var ItemInterval;//两项间的间隔
var XName;//x轴的名称
var YName;//y轴的名称
var isScale;//是否显示刻度值
var margin;//边距

//字体
var font = 'arial.ttf';

function ImageReport()
{
return ;
}

//设置图片基本信息
function setImage(ImageName,ImageType,ImageWidth=500,ImageHeight=400)
{
this->ImageName =ImageName;
this->ImageType =ImageType;
this->ImageWidth =ImageWidth;
this->ImageHeight=ImageHeight;
}

//设置坐标
function setItem(ItemArray,ItemInterval="20",XName="",YName="",isScale=true)
{
this->ItemArray =ItemArray;
this->ItemInterval =ItemInterval;
this->XName =XName;
this->YName =YName;
this->isScale =isScale;
}

//设置图片背景
function setBg(BgR="235",BgG="255",BgB="255",BgImage="")
{
this->BgR =BgR;
this->BgG =BgG;
this->BgB =BgG;
this->BgImage =BgImage;
}

//设置字体
function setFont(FontSize)
{
this->FontSize =FontSize;
this->margin =FontSize*2+5;
//this->FontColor =FontColor;
}

//画主体
function drawReport()
{
//建立画布
this->Image=imagecreatetruecolor(this->ImageWidth,this->ImageHeight);
//填充背景色
background=ImageColorAllocate(this->Image,this->BgR,this->BgG,this->BgB);

//画背景颜色
ImageFilledRectangle(this->Image,0,0,this->ImageWidth,this->ImageHeight,background);

//画背景图片
if(!empty(this->BgImage))
{
this->drawLogo();
}
//跟距参数,画不同的图片
switch(this->ImageType)
{
case "1":
this->drawColumn();
break;
case "2":
this->drawCurve();
break;
case "3":
this->drawCircle();
break;
default:
break;
}

}

//画柱状图
function drawColumn()
{
//调用画标题
this->drawTitle();
//调用画坐标
this->drawXY();

//获取数组的量
num=count(this->ItemArray);
//获取数组中的最大值
//最大值
max=this->getArrayMax(this->ItemArray);


for(i=0;iItemArray);i++)
{
//随机颜色
srand((double)microtime()*1000000);
R=Rand(50,200);
G=Rand(50,200);
B=Rand(50,200);

color=ImageColorAllocate(this->Image,R,G,B);

yColor=ImageColorAllocate(this->Image,R-10,G-10,B-10);
//柱体高度

height=((this->ImageHeight-this->margin*2-this->FontSize-5)*this->ItemArray[i]["value"])/max;

//画柱体
ImageFilledRectangle(this->Image,this->margin+this->ItemInterval*(2*i+1),this->ImageHeight-height+this->FontSize-5-this->margin,this->margin+this->ItemInterval*(2*i+2),this->ImageHeight-this->margin,color);
//画柱体上的阴影
imagefilledarc(this->Image, this->margin+this->ItemInterval*(2*i+3/2), this->ImageHeight-height+this->FontSize-5-this->margin,this->ItemInterval, this->margin/2, 0, 360, yColor, img_ARC_PIE);

//写柱体上面的数值
imagestring(this->Image,this->FontSize,this->margin+this->ItemInterval*(2*i+1),this->ImageHeight-height+this->FontSize-5-this->margin-this->FontSize-10,this->ItemArray[i]["value"],color);
//颜色
color=ImageColorAllocate(this->Image,255-this->BgR,255-this->BgG,255-this->BgB);


//写柱体的键值
imagettftext(this->Image,7,0,this->margin+this->ItemInterval*(2*i+1)-3,this->ImageHeight-this->margin+this->FontSize+2,color,this->font,this->ItemArray[i]["key"]);

}
//调用画LOGO
// this->drawLogo();


}
//画曲线图
function drawCurve()
{
//调用画标题
this->drawTitle();
//调用画坐标
this->drawXY(true);

//最大值
max=this->getArrayMax(this->ItemArray);

//颜色
color=ImageColorAllocate(this->Image,255-this->BgR,255-this->BgG,255-this->BgB);
//背景刻度的颜色
bgSColor=ImageColorAllocate(this->Image,this->BgR-10,this->BgG-10,this->BgB-10);
//线条颜色

linkColor=ImageColorAllocate(this->Image,51,51,153);


//画右X轴
ImageLine(this->Image,this->margin,this->margin+this->FontSize+5,this->ImageWidth-this->margin,this->margin+this->FontSize+5,color);
//画右Y轴
ImageLine(this->Image,this->ImageWidth-this->margin,this->margin+this->FontSize+5,this->ImageWidth-this->margin,this->ImageHeight-this->margin+2,color);

tdCount=count(this->ItemArray);
tdWidth=(this->ImageWidth-this->margin*2)/tdCount;


for(i=0;i {
//线条高度
startHeight=((this->ImageHeight-this->margin*2-this->FontSize-5)*this->ItemArray[i]["value"])/max;
//结束线线条高度
endHeight =((this->ImageHeight-this->margin*2-this->FontSize-5)*this->ItemArray[i+1]["value"])/max;
//画背景X轴刻度
ImageLine(this->Image,(i+1)*tdWidth+this->margin,this->margin+this->FontSize+6,(i+1)*tdWidth+this->margin,this->ImageHeight-this->margin,bgSColor);
//画线条
ImageLine(this->Image,i*tdWidth+this->margin,this->ImageHeight-startHeight+this->FontSize-5-this->margin,(i+1)*tdWidth+this->margin,this->ImageHeight-endHeight+this->FontSize-5-this->margin,linkColor);
}

//画刻度的值
for(i=0;i {
//显示值
//ImageString(this->Image,5,i*tdWidth+this->margin,this->ImageHeight-this->margin+1,this->ItemArray[i]["key"],color);
//画标题的字
imagettftext(this->Image,7,0,i*tdWidth+this->margin,this->ImageHeight-this->margin+1+10,color,this->font,this->ItemArray[i]["key"]);
}

}

//画饼图
function drawCircle()
{
//一个扇区的角度
degree=0;
//开始的角度
e=0;
//用于保存颜色的数组
colorArray;
//用于保存开始角度的数组
startDegree;
//用于保存结束角度的数组
endDegree;

//扇形的宽
width=(this->ImageWidth-this->margin*2)-200;

//获取数组的量
num=count(this->ItemArray);
//调用画标题
this->drawTitle();
//各项之和
total=0;

//计算各项之和
for(i=0;i {
total+=this->ItemArray[i]["value"];
}

//保扇区的各项值保存到数组
for(i=0;iItemArray);i++)
{
//随机颜色
srand((double)microtime()*1000000);

R=Rand(50,200);
G=Rand(50,200);
B=Rand(50,200);

//把颜色保存进数组
colorArray[i]["R"]=R;
colorArray[i]["G"]=G;
colorArray[i]["B"]=B;

//计算一个区块的角度
//echo this->ItemArray[i]["value"];
//exit;
degree=this->ItemArray[i]["value"]/total*360;
startDegree[i]=e;
endDegree[i]=e+degree;
e+=degree;
}

j=width/4+this->margin+35;
mJ=j-15;
//画阴影
for (j;j >mJ; j--)
{
for(i=0;i {
color=ImageColorAllocate(this->Image,colorArray[i]["R"]-10,colorArray[i]["G"]-10,colorArray[i]["B"]-10);
imagefilledarc(this->Image, width/2+this->margin, j, width, width/2, startDegree[i], endDegree[i], color, img_ARC_PIE);
}
}
//画区面和右边的标识字
for(i=0;i {
//获取颜色
color=ImageColorAllocate(this->Image,colorArray[i]["R"],colorArray[i]["G"],colorArray[i]["B"]);

//画区面
imagefilledarc(this->Image, width/2+this->margin, width/4+this->margin+20, width, width/2, startDegree[i], endDegree[i], color, img_ARC_PIE);


//说明方块的上边距
top=this->margin+20+i*10;
//画右边的距形
ImageFilledRectangle(this->Image,width+this->margin+20,top+(i*10),width+this->margin+30,top+(i*10)+10,color);
//字体颜色为黑色
fontColor=ImageColorAllocate(this->Image,255-this->BgR,255-this->BgG,255-this->BgB);

//画右边的说明文字
rightStr=this->ItemArray[i]["key"].":".this->ItemArray[i]["value"]."(".round(this->ItemArray[i]["value"]*100/total,2)."%)";
//ImageString(this->Image,10,width+this->margin+35,top+(i*10)-3,rightStr,fontColor);
imagettftext(this->Image, 9,0,width+this->margin+35,top+(i*10)+8,fontColor,this->font,rightStr);

}
//清空各数组
unset(colorArray,startDegree,endDegree);

}

//显示图片
function showImage(ImageSavePath="")
{
// echo ImageSavePath;
//exit;
if(empty(ImageSavePath))
{
ImagePNG(this->Image);
}
else
{
ImagePNG(this->Image,ImageSavePath);
}

ImageDestroy(this->Image);
}

//画标题
function drawTitle()
{
//颜色
color=ImageColorAllocate(this->Image,255-this->BgR,255-this->BgG,255-this->BgB);

//阴影色
black = imagecolorallocate(this->Image, 0, 0, 0);

//计算标题字体的宽度
fontWidth=strlen(this->ImageName)*(this->FontSize)-strlen(this->ImageName)*2;

//画标题字的阴影
imagettftext(this->Image, this->FontSize+3,0,this->ImageWidth/2-fontWidth/2+1,this->FontSize+11,black,this->font,this->ImageName);
//画标题的字
imagettftext(this->Image, this->FontSize+3,0,this->ImageWidth/2-fontWidth/2,this->FontSize+10,color,this->font,this->ImageName);

//画标题下面的线条
imageline(this->Image,this->ImageWidth/2-fontWidth/2-20,this->FontSize+12,this->ImageWidth/2-fontWidth/2+1+fontWidth+20,this->FontSize+12,color);
}

//画LOGO
function drawLogo()
{

list(w,h,type) = getimagesize(this->BgImage);

source;
switch(type)
{
//图片是GIF
case 1:
source=imagecreatefromgif(this->BgImage);
break;
//图片是jPG
case 2:
source = imagecreatefromjpeg(this->BgImage);
break;
//图片是PNG
case 3:
source = imagecreatefrompng(this->BgImage);
}

imagecopymerge(this->Image,source,0,0,0,0,w,h,20);
}

//画坐标
function drawXY(bgScale=false)
{
//最大值
max=this->getArrayMax(this->ItemArray);

//颜色
color=ImageColorAllocate(this->Image,255-this->BgR,255-this->BgG,255-this->BgB);
//背景刻度的颜色
bgSColor=ImageColorAllocate(this->Image,this->BgR-10,this->BgG-10,this->BgB-10);

//画X轴
ImageLine(this->Image,this->margin,this->ImageHeight-this->margin+2,this->ImageWidth-this->margin,this->ImageHeight-this->margin+2,color);
//画Y轴
ImageLine(this->Image,this->margin,this->margin+this->FontSize+5,this->margin,this->ImageHeight-this->margin+2,color);


//阴影色
black = imagecolorallocate(this->Image, 0, 0, 0);

//画Y轴字的阴影
imagettftext(this->Image, this->FontSize, 90, this->FontSize+2, intval(this->ImageHeight/2)-1, black, this->font, this->YName);
//画Y轴的字
imagettftext(this->Image, this->FontSize, 90, this->FontSize+2, intval(this->ImageHeight/2), color, this->font, this->YName);

//画X轴字的阴影
imagettftext(this->Image, this->FontSize,0,intval(this->ImageWidth/2)-1,this->ImageHeight-this->FontSize+5,black,this->font,this->XName);
//画X轴的字
imagettftext(this->Image, this->FontSize,0,intval(this->ImageWidth/2),this->ImageHeight-this->FontSize+5,color,this->font,this->XName);


//画0点坐标
imagettftext(this->Image,8,90,this->margin/2+this->FontSize,this->ImageHeight-this->margin,color,this->font,"0");
//画最大值数据
// imagettftext(this->Image, this->FontSize,90,this->margin/2+7,this->margin+20,black,font,max);

//画内容的实际高度
height=this->ImageHeight-this->margin*2-(this->FontSize+5);
//每一刻度的值
scale=intval(height/10);


for(i=0;i<10;i++)
{
//画刻度,如果设置了背景刻度
if(bgScale)
{
ImageLine(this->Image,this->margin+1,this->margin+i*scale+this->FontSize+5+i,this->ImageWidth-this->margin,this->margin+i*scale+this->FontSize+5+i,bgSColor);
}
else
{
ImageLine(this->Image,this->margin-2,this->margin+i*scale+this->FontSize+5+i,this->margin,this->margin+i*scale+this->FontSize+5+i,color);
}
//画刻度上的值
if(this->isScale)
{
num=round(max-max/10*i,1);
imagettftext(this->Image, 7,90,this->margin/2+this->FontSize,this->margin+i*scale+15+this->FontSize,color,this->font,num);
}
}
//如果未画刻度值,则画最大值
if(!this->isScale)
{
imagettftext(this->Image, 7,90,this->margin/2+this->FontSize,this->margin+15+this->FontSize,color,this->font,max);
}

}

//获取数组中的最大值
function getArrayMax(Array)
{
temp=0;
for(i=0;i {
if(temp {
temp=Array[i]["value"];
}
}
return temp;

}

?>

调用方法



require_once ("ImageReport.inc.php");
report=new ImageReport;
report->setImage(title,type,imgW,imgH);//参数(标题,类型(1(柱图),2(曲线图),3(饼图)),图片宽,图片高)

//这个我用数据库查出来的,要改一下.格式是多维数据.key=>value
temparray=this->db->GetArray("select report_key as 'key',report_value as value from cms_r_report_data where report_id=id order by report_dataId ASC");

report->setItem(temparray,interval,XName,YName,isScale);//参数(数组,间隔,X轴文字,Y轴文字,背景图片)
report->setBg(BgR,BgG,BgB,"logo.jpg");//参数(背景颜色)
report->setFont(10);//字体大小1-10
report->drawReport();
report->showImage("../images/report/".id.".png");//参数为保存的路径

来源:http://blog.csdn.net/liq330





If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)





QQ:154298438
QQ:417480759