| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1105 人关注过本帖
标题:如何将DataView中的数据导入到Excel中,各位高手帮帮忙呀!
只看楼主 加入收藏
小油伞
Rank: 1
来 自:湖北省广水市
等 级:新手上路
帖 子:15
专家分:4
注 册:2010-10-20
结帖率:100%
收藏
已结贴  问题点数:5 回复次数:7 
如何将DataView中的数据导入到Excel中,各位高手帮帮忙呀!
请各位高手讲的详细点呀!如果有代码更好,将不胜感激。
搜索更多相关主题的帖子: Excel DataView 数据 
2010-10-28 09:06
wangnannan
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:87
帖 子:2546
专家分:9359
注 册:2007-11-3
收藏
得分:1 
程序代码:
一、首先要引用一个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 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

希望对MM有帮助

出来混,谁不都要拼命的嘛。 。拼不赢?那就看谁倒霉了。 。有机会也要看谁下手快,快的就能赢,慢。 。狗屎你都抢不到。 。还说什么拼命?
2010-10-28 12:06
红色警戒
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:19
帖 子:444
专家分:2967
注 册:2005-11-20
收藏
得分:1 
进来学习了

2010-10-28 12:16
小油伞
Rank: 1
来 自:湖北省广水市
等 级:新手上路
帖 子:15
专家分:4
注 册:2010-10-20
收藏
得分:0 
看到代码,俺的心就凉了



  private void button1_Click(object sender, EventArgs e)
        {
            //调用自定义函数ExportDataGridview
            ExportDataGridview(dataGridView1, true);   
        }
        public bool ExportDataGridview(DataGridView dgv, bool isShowExcle)
        {
            if (dgv.Rows.Count == 0)
                return false;
            //建立Excel对象
         Excel.Application excel = new Excel.Application();
            
            excel.Application.Workbooks.Add(true);
            excel.Visible = isShowExcle;
            //生成字段名称
            for (int i = 0; i < dgv.ColumnCount; i++)
            {
              excel.Cells[1, i + 1] = dgv.Columns[i].HeaderText;
            }
            //填充数据
            for (int i = 0; i < dgv.RowCount - 1; i++)
            {
                for (int j = 0; j < dgv.ColumnCount; j++)
                {
                    if (dgv[j, i].ValueType == typeof(string))
                    {
                       excel.Cells[i + 2, j + 1] = "'" + dgv[j, i].Value.ToString();
                    }
                    else
                    {
                        excel.Cells[i + 2, j + 1] = dgv[j, i].Value.ToString();
                    }
                }
            }
            return true;
        }

你看看这个行吗?
2010-10-28 13:46
wangnannan
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:87
帖 子:2546
专家分:9359
注 册:2007-11-3
收藏
得分:0 
回复 4楼 小油伞
貌似 你说的是dataview 啊 怎么又变成datagridview

出来混,谁不都要拼命的嘛。 。拼不赢?那就看谁倒霉了。 。有机会也要看谁下手快,快的就能赢,慢。 。狗屎你都抢不到。 。还说什么拼命?
2010-10-28 14:24
c1_wangyf
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:7
帖 子:665
专家分:2832
注 册:2010-5-24
收藏
得分:1 
回复 4楼 小油伞
如果把IF和ELSE写的详细一点会更好(逻辑判断部分)
2010-10-28 15:18
wangnannan
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:87
帖 子:2546
专家分:9359
注 册:2007-11-3
收藏
得分:0 
曾经测试过 Devexpress 的DataGridView导出excel方法极快 效率很高 不知道是什么原理

出来混,谁不都要拼命的嘛。 。拼不赢?那就看谁倒霉了。 。有机会也要看谁下手快,快的就能赢,慢。 。狗屎你都抢不到。 。还说什么拼命?
2010-10-28 15:22
小红帽
Rank: 2
等 级:论坛游民
帖 子:25
专家分:18
注 册:2010-10-28
收藏
得分:0 
    看看,觉得很厉害啊1
2010-11-04 10:55
快速回复:如何将DataView中的数据导入到Excel中,各位高手帮帮忙呀!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.029573 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved