在这儿本来想写长一点的文章,但因为时间的关系,没有写成。现把自己做的一个小东西,c#调用excel作报表的源代码放在这儿给大家看看。关于代码的构成,在源代码中已经有完整的代码注释了,这儿就不说什么了。
下面的这个类中,主要完成的功能是从数据库中逐字段读出数据,设置格式后,在excel中显示出来。这是它运行后的效果图:
在这个类中,有两个参数传进来,一个是它的数据源,另一个是整个报表的标题字符串,具体看代码就应该知道了。
using system;
using system.data;
using excel;
namespace logiclayer
{
?///
?/// outputexcel 的摘要说明
?///
?public class outputexcel
?{
??public outputexcel(dataview dv,string str)
??{
???//
???// todo: 在此处添加构造函数逻辑
???//
???excel.application excel;
???int rowindex=4;
???int colindex=1;
???excel._workbook xbk;
???excel._worksheet xst;
???excel= new excel.applicationclass();;
???xbk = excel.workbooks.add(true);
???xst = (excel._worksheet)xbk.activesheet;
???//
???//取得标题
???//
???foreach(datacolumn col in dv.table.columns)
???{
????colindex++;
????excel.cells[4,colindex] = col.columnname;
????xst.get_range(excel.cells[4,colindex],excel.cells[4,colindex]).horizontalalignment = excel.xlvalign.xlvaligncenter;//设置标题格式为居中对齐
???}
???//
???//取得表格中的数据
???//
???foreach(datarowview row in dv)
???{
????rowindex ++;
????colindex = 1;
????foreach(datacolumn col in dv.table.columns)
????{
?????colindex ++;
?????if(col.datatype == system.type.gettype("system.datetime"))
?????{
??????excel.cells[rowindex,colindex] = (convert.todatetime(row[col.columnname].tostring())).tostring("yyyy-mm-dd");
??????xst.get_range(excel.cells[rowindex,colindex],excel.cells[rowindex,colindex]).horizontalalignment = excel.xlvalign.xlvaligncenter;//设置日期型的字段格式为居中对齐
?????}
?????else
?????if(col.datatype == system.type.gettype("system.string"))
?????{
??????excel.cells[rowindex,colindex] = "'"+row[col.columnname].tostring();
??????xst.get_range(excel.cells[rowindex,colindex],excel.cells[rowindex,colindex]).horizontalalignment = excel.xlvalign.xlvaligncenter;//设置字符型的字段格式为居中对齐
?????}
?????else
?????{
??????excel.cells[rowindex,colindex] = row[col.columnname].tostring();
?????}
????}
???}
???//
???//加载一个合计行
???//
???int rowsum = rowindex + 1;
???int colsum = 2;
???excel.cells[rowsum,2] = "合计";
???xst.get_range(excel.cells[rowsum,2],excel.cells[rowsum,2]).horizontalalignment = excel.xlhalign.xlhaligncenter;
???//
???//设置选中的部分的颜色
???//
???xst.get_range(excel.cells[rowsum,colsum],excel.cells[rowsum,colindex]).select();
???xst.get_range(excel.cells[rowsum,colsum],excel.cells[rowsum,colindex]).interior.colorindex = 19;//设置为浅黄色,共计有56种
???//
???//取得整个报表的标题
???//
???excel.cells[2,2] = str;
???//
???//设置整个报表的标题格式
???//
???xst.get_range(excel.cells[2,2],excel.cells[2,2]).font.bold = true;
???xst.get_range(excel.cells[2,2],excel.cells[2,2]).font.size = 22;
???//
???//设置报表表格为最适应宽度
???//
???xst.get_range(excel.cells[4,2],excel.cells[rowsum,colindex]).select();
???xst.get_range(excel.cells[4,2],excel.cells[rowsum,colindex]).columns.autofit();
???//
???//设置整个报表的标题为跨列居中
???//
???xst.get_range(excel.cells[2,2],excel.cells[2,colindex]).select();
???xst.get_range(excel.cells[2,2],excel.cells[2,colindex]).horizontalalignment = excel.xlhalign.xlhaligncenteracrossselection;
???//
???//绘制边框
???//
???xst.get_range(excel.cells[4,2],excel.cells[rowsum,colindex]).borders.linestyle = 1;
???xst.get_range(excel.cells[4,2],excel.cells[rowsum,2]).borders[excel.xlbordersindex.xledgeleft].weight = excel.xlborderweight.xlthick;//设置左边线加粗
???xst.get_range(excel.cells[4,2],excel.cells[4,colindex]).borders[excel.xlbordersindex.xledgetop].weight = excel.xlborderweight.xlthick;//设置上边线加粗
???xst.get_range(excel.cells[4,colindex],excel.cells[rowsum,colindex]).borders[excel.xlbordersindex.xledgeright].weight = excel.xlborderweight.xlthick;//设置右边线加粗
???xst.get_range(excel.cells[rowsum,2],excel.cells[rowsum,colindex]).borders[excel.xlbordersindex.xledgebottom].weight = excel.xlborderweight.xlthick;//设置下边线加粗
???//
???//显示效果
???//
???excel.visible=true;
??}
?}
}
有人在问,如何结束excel进程?
可以强制结束进程:)
一般采用垃圾自动回收的技术,但为了更彻底地结束excel进程。我们可以再加上一个事件:判断excel是否还在进程集里面。如果有的话,返回true;当然,如果没有的话,返回false。
当事件为真的时候,采用强制进程杀死技术就行了。
如果要判断excel是否在进程集里面,可以参考下面的代码:
??????????? int proceedingcount = 0;
??????????? process[] proceddingcon = process.getprocesses();
??????????? foreach(process isprocedding in proceddingcon)
??????????? {
??????????????? if(isprocedding.processname == "excel")
??????????????? {
??????????????????? proceedingcount += 1;
??????????????? }
??????????? }
??????????? if(proceedingcount > 0)
??????????? {
??????????????? messagebox.show("该系统中已经在运行excel了。","提示",messageboxbuttons.ok,messageboxicon.information);
return true;
??????????? }
else
{
return false;
}
??}
==================
要杀死进程的话,用一个叫什么kill()的事件吧。好象是这样的。:)
新闻热点
疑难解答