| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 556 人关注过本帖
标题:关于提高从数据库导出到execl文件性能的问题
只看楼主 加入收藏
kudincha
Rank: 1
等 级:新手上路
帖 子:29
专家分:0
注 册:2009-4-7
结帖率:83.33%
收藏
 问题点数:0 回复次数:4 
关于提高从数据库导出到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
gaoshuli12
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2011-6-27
收藏
得分:0 
追一下看是哪里慢,加个线程处理保存
2012-06-01 15:45
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
jockey
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:977
专家分:52
注 册:2005-12-4
收藏
得分:0 
不要用这种方法,效率很低。  建议把tatable搞成数组,用excelSheet.get_Range()往sheet里写,,效率将大大提高,楼主可以试一下。

2012-06-03 12:11
wumingchenxi
Rank: 6Rank: 6
等 级:侠之大者
威 望:6
帖 子:96
专家分:457
注 册:2012-6-6
收藏
得分:0 
你的数据必须保存到 现有的(旧的)Excel文件,还是说只要导出到一个新的Excel文件?
我看你的程序,没有特殊的Excel操作。
如果是后者,建议保存为CSV格式的,写入文件的时候,每字段用逗号,每行用回车换行。这样就变成写文本文件,而且写得次数可以极大减少,甚至只写一次。应该对保存速度有所帮助。
CSV文件默认是Excel打开的。没有特殊的情况下,即是文本文件,也是Excel文件。
2012-06-07 09:45
快速回复:关于提高从数据库导出到execl文件性能的问题
数据加载中...
 
   



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

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