首页 > 开发 > 综合 > 正文

C#调用操作Excel的一个类

2024-07-21 02:26:54
字体:
来源:转载
供稿:网友
  • 网站运营seo文章大全
  • 提供全面的站长运营经验及seo技术!
  • 在这儿本来想写长一点的文章,但因为时间的关系,没有写成。现把自己做的一个小东西,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()的事件吧。好象是这样的。:)


     

    发表评论 共有条评论
    用户名: 密码:
    验证码: 匿名发表