| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 556 人关注过本帖
标题:关于提高从数据库导出到execl文件性能的问题
取消只看楼主 加入收藏
kudincha
Rank: 1
等 级:新手上路
帖 子:29
专家分:0
注 册:2009-4-7
结帖率:83.33%
收藏
 问题点数:0 回复次数:1 
关于提高从数据库导出到execl文件性能的问题
我的程序,运行过程中总是在打开完文件对话框后,程序就卡在那里了,只有当文件保存完后,文件对话框才关闭。
请教下,如何才能提高保存execl文件的速度?我的程序代码如下:
程序代码:
private void button1_Click(object sender, EventArgs e)
        {
            SaveFileDialog sfd = new SaveFileDialog();
            string fpath;
            sfd.Filter = "xls files(*.xls)|*.xls";
            sfd.FilterIndex = 2;
            sfd.RestoreDirectory = true;
            BarProessForm fm = new BarProessForm();

            if (checkBox1.Checked == true && checkBox2.Checked == true && checkBox3.Checked == true)
            {
                this.Close();
                if (sfd.ShowDialog() == DialogResult.OK)
                {
                    fpath = sfd.FileName;  //保存的文件路径
                    SaveTableToExcel3(fpath);
                    fm.piTime.Stop();
                    fm.Close();
                }
            }
            else
            {
                if (checkBox1.Checked == true && checkBox2.Checked == true)
                {
                    this.Close();
                    if (sfd.ShowDialog() == DialogResult.OK)
                    {
                        fpath = sfd.FileName;  //保存的文件路径
                        SaveTableToExcel2("preYCTable", "wdYCTable", fpath);
                    }
                }
                if (checkBox1.Checked == true && checkBox3.Checked == true)
                {
                    this.Close();
                    if (sfd.ShowDialog() == DialogResult.OK)
                    {
                        fpath = sfd.FileName;  //保存的文件路径
                        SaveTableToExcel2("preYCTable", "llYCTable", fpath);
                    }
                }
                if (checkBox2.Checked == true && checkBox3.Checked == true)
                {
                    this.Close();
                    if (sfd.ShowDialog() == DialogResult.OK)
                    {
                        fpath = sfd.FileName;  //保存的文件路径
                        SaveTableToExcel2("wdYCTable", "llYCTable", fpath);
                    }
                }
                if (checkBox1.Checked == true && checkBox2.Checked == false && checkBox3.Checked == false)
                {
                    this.Close();
                    if (sfd.ShowDialog() == DialogResult.OK)
                    {
                        fpath = sfd.FileName;  //保存的文件路径
                        this.Close();
                        SaveTableToExcel1("preYCTable", fpath);
                        fm.piTime.Stop();
                        fm.Close();
                    }
                }
                if (checkBox1.Checked == false && checkBox2.Checked == true && checkBox3.Checked == false)
                {
                    this.Close();
                    if (sfd.ShowDialog() == DialogResult.OK)
                    {
                        fpath = sfd.FileName;  //保存的文件路径
                        SaveTableToExcel1("wdYCTable", fpath);
                    }
                }
                if (checkBox1.Checked == false && checkBox2.Checked == false && checkBox3.Checked == true)
                {
                    this.Close();
                    if (sfd.ShowDialog() == DialogResult.OK)
                    {
                        fpath = sfd.FileName;  //保存的文件路径
                        SaveTableToExcel1("llYCTable", fpath);
                    }
                }
            }
          
        }


 private void SaveTableToExcel1(string tableName, string filepath)
        {
            Microsoft.Office.Interop.Excel.Application app =  new Microsoft.Office.Interop.Excel.ApplicationClass();
            try
            {
                app.Visible = false;
                Excel.Workbook wBook = app.Application.Workbooks.Add(true);
                Excel.Worksheet wSheet = wBook.Worksheets[1] as Excel.Worksheet;
                SqlConnection myConn = new SqlConnection("Data Source=" + serverHostName + ",1433;Initial Catalog=moniData;User
Id=sa;Password=123456;Integrated Security=false");
                string sql;
                if (tableName.Contains("pre"))
                    sql = "SELECT * FROM preYCTable WHERE 时间 BETWEEN '" +
dateTimePicker1.Value + "' AND '" + dateTimePicker2.Value + "'";
                else
                    sql = "SELECT * FROM wdYCTable WHERE 时间 BETWEEN '" +
dateTimePicker3.Value + "' AND '" + dateTimePicker4.Value + "'";
                SqlCommand cmd = new SqlCommand(sql, myConn);
                DataSet ds = new DataSet();
                SqlDataAdapter dataAdapter = new SqlDataAdapter(cmd);
                myConn.Open();
                dataAdapter.Fill(ds, "srcdt");
                myConn.Close();

                int rowNum = ds.Tables["srcdt"].Rows.Count;
                int columnNum = ds.Tables["srcdt"].Columns.Count;

                int col = 0;
                int row = 1;
               
                //将dataTable的标题导入到EXECL的标题(第一行)
                foreach (DataColumn dc in ds.Tables["srcdt"].Columns)
                {
                    col++;
                    wSheet.Cells[1, col] = dc.ColumnName;
                }
                //将DataTable中的数据导入Excel中
                for (int i = 0; i < rowNum; i++)
                {
                    row++;
                    col = 0;
                    for (int j = 0; j < columnNum; j++)
                    {
                        col++;
                        wSheet.Cells[row, col] = ds.Tables["srcdt"].Rows[i]

[j].ToString();
                    }
                }
                app.DisplayAlerts = false;
                app.AlertBeforeOverwriting = false;
                //保存工作簿
                wBook.Save();
                //保存excel文件
                app.Save(filepath);
                app.SaveWorkspace(filepath);
                app.Quit();
                app = null;
            }
            catch (Exception err)
            {
                MessageBox.Show("导出Excel出错!错误原因:" + err.Message, "提示信
", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            finally { }
        }
搜索更多相关主题的帖子: 数据库 对话框 如何 
2012-06-01 08:24
kudincha
Rank: 1
等 级:新手上路
帖 子:29
专家分:0
注 册:2009-4-7
收藏
得分:0 
程序运行过程中,主要是卡在保存execl这个过程SaveTableToExcel1(),主要是这个循环过程比较复杂,如下所示:
程序代码:
 //将DataTable中的数据导入Excel中
                for (int i = 0; i < rowNum; i++)
                {
                    row++;
                    col = 0;
                    for (int j = 0; j < columnNum; j++)
                    {
                        col++;
                        wSheet.Cells[row, col] = ds.Tables["srcdt"].Rows[i][j].ToString();
                    }
                }
怎么实现,可以将文件对话框先隐掉,然后出现一个进展条的对话框,这样可以让程序界面不用卡在那里

[ 本帖最后由 kudincha 于 2012-6-1 16:30 编辑 ]
2012-06-01 16:25
快速回复:关于提高从数据库导出到execl文件性能的问题
数据加载中...
 
   



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

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