• 从DataView中生成Excel报表的方案


    一、首先要引用一个Excel的组件,我一开始是在Office XP下尝试的,不
    成功,后来把XP给干掉,装2k,就成功了,所以这里分享的是Office 2k下
    引用相关组件来实现功能的,在工程中引用COM标签中的Microsoft 
    Excel 9.0 Object Library,添加成功后,引用中会多出三个引用项:
    Excel、Office、VBIDE。





    二、具体代码。
    using System;
    using System.Data;
    using Excel;
    using System.IO;
    namespace Test.ExcelCom
    {
    /// <summary>
    /// 将DataView中的数据导入Excel文件中
    /// 作者:Rexsp
    /// 创建:2004-4-4
    /// </summary>
    public class OutputExcel
    {
    #region 私有成员
    /// <summary>
    /// 数据的DataView
    /// </summary>
    private DataView dv=null;
    /// <summary>
    /// 表格标题
    /// </summary>
    private string title=null;
    /// <summary>
    /// 输出文件路径
    /// </summary>
    private string outFilePath=null;
    /// <summary>
    /// 输入文件名
    /// </summary>
    private string inputFilePath=null;
    #endregion
    #region 公共属性
    /// <summary>
    /// 数据的DataView
    /// </summary>
    public DataView DV
    {
    set{dv=value;}
    }
    /// <summary>
    /// 表格标题
    /// </summary>
    public string Title
    {
    set{title=value;}
    get{return title;}
    }
    /// <summary>
    /// 输出文件路径
    /// </summary>
    public string OutFilePath
    {
    set{outFilePath=value;}
    get{return outFilePath;}
    }
    /// <summary>
    /// 输入文件路径
    /// </summary>
    public string InputFilePath
    {
    set{inputFilePath=value;}
    get{return inputFilePath;}
    }
    #endregion

    #region 构造函数
    public OutputExcel()
    {
    }
    public OutputExcel(DataView dv,string title)
    {
    //
    // TODO: 在此处添加构造函数逻辑
    //
    }
    #endregion
    #region 公共方法
    public void CreateExcel()
    {
    int rowIndex=4;//行起始坐标
    int colIndex=1;//列起始坐标
    ApplicationClass myApp=null;
    Workbook myBook=null;
    Worksheet mySheet=null;
    //如果文件不存在,则将模板文件拷贝一份作为输出文件
    //这里如果通过File.Create来创建文件是不行的,因为xls
    //的空文件也有固定的格式,跟文本不一样的,也许有其它
    //通过程序直接生成excel的方法,大家可以尝试尝试的
    if(!File.Exists(outFilePath))
    {
    File.Copy(inputFilePath,outFilePath,true);
    }
    myApp= new ApplicationClass();
    myApp.Visible=false;
    object oMissiong=System.Reflection.Missing.Value;
    myApp.Workbooks.Open(outFilePath,oMissiong,oMissiong,oMissiong,oMissiong,
    oMissiong,oMissiong,oMissiong,oMissiong,oMissiong,oMissiong,oMissiong,oMissiong);
    myBook=myApp.Workbooks[1];
    mySheet=(Worksheet)myBook.ActiveSheet;

    //
    //取得标题
    //
    foreach(DataColumn col in dv.Table.Columns)
    {
    colIndex++;
    mySheet.Cells[4,colIndex] = col.ColumnName;
    mySheet.get_Range(mySheet.Cells[4,colIndex],mySheet.Cells[4,colIndex]).HorizontalAlignment = 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"))
    {
    mySheet.Cells[rowIndex,colIndex] = (Convert.ToDateTime(row[col.ColumnName].ToString())).ToString("yyyy-MM-dd");
    mySheet.get_Range (mySheet.Cells[rowIndex,colIndex],mySheet.Cells[rowIndex,colIndex]).HorizontalAlignment  = XlVAlign.xlVAlignCenter;//设置日期型的字段格式为居中对齐
    }
    else
    if(col.DataType == System.Type.GetType("System.String"))
    {
    mySheet.Cells[rowIndex,colIndex] = "'"+row[col.ColumnName].ToString();
    mySheet.get_Range (mySheet.Cells[rowIndex,colIndex],mySheet.Cells[rowIndex,colIndex]).HorizontalAlignment  = XlVAlign.xlVAlignCenter;//设置字符型的字段格式为居中对齐
    }
    else
    {
    mySheet.Cells[rowIndex,colIndex] = row[col.ColumnName].ToString();
    }
    }
    }
    //
    //加载一个合计行
    //
    int rowSum = rowIndex + 1;
    int colSum = 2;
    mySheet.Cells[rowSum,2] = "合计";
    mySheet.get_Range(mySheet.Cells[rowSum,2],mySheet.Cells[rowSum,2]).HorizontalAlignment = XlHAlign.xlHAlignCenter;
    //
    //设置选中的部分的颜色
    //
    mySheet.get_Range(mySheet.Cells[rowSum,colSum],mySheet.Cells[rowSum,colIndex]).Select();
    mySheet.get_Range(mySheet.Cells[rowSum,colSum],mySheet.Cells[rowSum,colIndex]).Interior.ColorIndex = 19;//设置为浅黄色,共计有56种
    //
    //取得整个报表的标题
    //
    mySheet.Cells[2,2] = title;
    //
    //设置整个报表的标题格式
    //
    mySheet.get_Range(mySheet.Cells[2,2],mySheet.Cells[2,2]).Font.Bold = true;
    mySheet.get_Range(mySheet.Cells[2,2],mySheet.Cells[2,2]).Font.Size = 22;
    //
    //设置报表表格为最适应宽度
    //
    mySheet.get_Range(mySheet.Cells[4,2],mySheet.Cells[rowSum,colIndex]).Select();
    mySheet.get_Range(mySheet.Cells[4,2],mySheet.Cells[rowSum,colIndex]).Columns.AutoFit();
    //
    //设置整个报表的标题为跨列居中
    //
    mySheet.get_Range(mySheet.Cells[2,2],mySheet.Cells[2,colIndex]).Select();
    mySheet.get_Range(mySheet.Cells[2,2],mySheet.Cells[2,colIndex]).HorizontalAlignment = XlHAlign.xlHAlignCenterAcrossSelection;
    //
    //绘制边框
    //
    mySheet.get_Range(mySheet.Cells[4,2],mySheet.Cells[rowSum,colIndex]).Borders.LineStyle = 1;
    mySheet.get_Range (mySheet.Cells[4,2],mySheet.Cells[rowSum,2]).Borders[XlBordersIndex.xlEdgeLeft]. Weight = XlBorderWeight.xlThick;//设置左边线加粗
    mySheet.get_Range(mySheet.Cells [4,2],mySheet.Cells[4,colIndex]).Borders[XlBordersIndex.xlEdgeTop].Weight  = XlBorderWeight.xlThick;//设置上边线加粗
    mySheet.get_Range(mySheet.Cells[4, colIndex],mySheet.Cells[rowSum,colIndex]).Borders[XlBordersIndex.xlEdgeRight]. Weight = XlBorderWeight.xlThick;//设置右边线加粗
    mySheet.get_Range(mySheet.Cells [rowSum,2],mySheet.Cells[rowSum,colIndex]).Borders[XlBordersIndex.xlEdgeBottom]. Weight = XlBorderWeight.xlThick;//设置下边线加粗
    myBook.Save();;
    myBook.Close( true,outFilePath,true);
    System.Runtime.InteropServices.Marshal.ReleaseComObject(mySheet);
    System.Runtime.InteropServices.Marshal.ReleaseComObject(myBook);
    System.Runtime.InteropServices.Marshal.ReleaseComObject(myApp);
    GC.Collect();

    }
    #endregion
    }

    }
    一点说明:操作Excel的时候,可能会发生Excel进程被锁定,无法退
    出,解决方法是在保存完并关闭myBook(工作簿)后,别关闭Excel进
    程(//myApp.Quit();)。这样的结果是服务器上始终有一个Excel的
    进程。可能会出现asp_net用户操作Excel的权限不够,配置Dcom。运
    行Dcomcnfg.exe,找到Excel应用程序,配置其属性,身份验证级别
    选"无",身份标识选"交互式用户",安全性页面,启动和访问均给
    everyone。注意:查看当前进程中是否有Winword进程存在,如果有且
    不能被结束,那么重启动计算机。再次运行你的代码即OK。这样以后
    就不会出现权限不够的情况了。
    三、调用
    #region 测试Excel
    QuickItemCollection qic =new QuickItemCollection();
    qic.GetAllInfo();
    DataView dv= new DataView();
    DataTable dt = new DataTable("Excel");
    dt.Columns.Add("ID",System.Type.GetType("System.String"));
    dt.Columns.Add("ItemName",System.Type.GetType("System.String"));
    int qicCount=qic.Count;
    for(int i=0;i<qicCount;i++)
    {
    DataRow dr= dt.NewRow();
    dr[0] = qic[i].ID;
    dr[1] = qic[i].ItemName;
    dt.Rows.Add(dr);
    }
    OutputExcel ope = new OutputExcel(); 
    ope.DV=dt.DefaultView;
    ope.Title="测试生成Excel";
    ope.InputFilePath=Server.MapPath("Sample.xls");
    ope.OutFilePath=Server.MapPath("Test.xls");
    ope.CreateExcel();
    #endregion
    一点说明:这段代码的前半部分读过我那篇《一种快速存取订阅条目的方
    案》的读者应该认得的,其实也就是一个把集合类中数据填充到
    DataView中的过程,后面的就是调用。Sample.xls是个新建的空的
    Sample.xls,然后执行完毕后,就会生成Test.xls文档 
  • 相关阅读:
    图像全參考客观评价算法比較
    单片机project师必备的知识
    ACM-并查集之小希的迷宫——hdu1272
    ArcGIS教程:加权总和
    九度 题目1368:二叉树中和为某一值的路径
    解决solr搜索多词匹配度和排序方案
    具体解释linux文件处理的的经常使用命令
    Hotel
    Unity3D 射线指定层获取GameObject 注意 LayerMask
    ios设计一部WindowsPhone手机
  • 原文地址:https://www.cnblogs.com/yongheng178/p/1262323.html
Copyright © 2020-2023  润新知