zoukankan      html  css  js  c++  java
  • DataView中数据生成Excel方案(转)

    正文:

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

    二、具体代码。

     

     

     

     

     

    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,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

    {

           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文档



    欢迎加入JAVA技术交流QQ群:179945282

    欢迎加入ASP.NET(C#)交流QQ群:17534377


  • 相关阅读:
    综合实例-文本框类部件
    输入掩码
    WebP,Jpeg,Png格式图片的编解码区别
    美团点评提前批面经
    Android中AIDL的使用详解,如何发起回调?
    JNI在Android中的实践NDK:Hello World
    Timer实现原理
    百度秋招凉经:客户端测开
    阿里秋招面经:Android客户端开发工程师
    Picasso和Glide区别
  • 原文地址:https://www.cnblogs.com/q149072205/p/2681017.html
Copyright © 2011-2022 走看看