• C#快速导出到Excel


    导出到Excel,基本是很多单据的标配功能了。笔者之前将Datagridview的数据导出到Excel时,将数据一个单元格一个单元格的写入,效率奇慢,

    1030条数据花费了将近70s的时间。后来借鉴了前辈们的其它写法,将数据先生成到string变量,再写入,效率提升了150多倍。分享如下:

    1、改善后结果:

    2、导出到Excel使用的方法:

    简要说明:

    TableName:数据源数据表

    FileName:要保存的Excel文件名

    lblStatus:ToolStripStatusLable

    barStatus:ToolStripProgressBar

    引用及代码:

    using System.IO;
    using System.Data.SqlClient;
    using System.Threading;
    using System.Diagnostics;
    public void ExportDataToExcel(DataTable TableName, string FileName)
            {
                SaveFileDialog saveFileDialog = new SaveFileDialog();
                //设置文件标题
                saveFileDialog.Title = "导出Excel文件";
                //设置文件类型
                saveFileDialog.Filter = "Microsoft Office Excel 工作簿(*.xls)|*.xls";
                //设置默认文件类型显示顺序  
                saveFileDialog.FilterIndex = 1;
                //是否自动在文件名中添加扩展名
                saveFileDialog.AddExtension = true;
                //是否记忆上次打开的目录
                saveFileDialog.RestoreDirectory = true;
                //设置默认文件名
                saveFileDialog.FileName = FileName;
                //按下确定选择的按钮  
                if (saveFileDialog.ShowDialog() == DialogResult.OK)
                {
                    //获得文件路径 
                    string localFilePath = saveFileDialog.FileName.ToString();
    
                    //数据初始化
                    int TotalCount;     //总行数
                    int RowRead = 0;    //已读行数
                    int Percent = 0;    //百分比
    
                    TotalCount = TableName.Rows.Count;
                    lblStatus.Text = "共有" + TotalCount + "条数据";
                    lblStatus.Visible = true;
                    barStatus.Visible = true;
    
                    //数据流
                    Stream myStream = saveFileDialog.OpenFile();
                    StreamWriter sw = new StreamWriter(myStream, Encoding.GetEncoding("gb2312"));
                    string strHeader = "";
    
                    //秒钟
                    Stopwatch timer = new Stopwatch();
                    timer.Start();
    
                    try
                    {
                        //写入标题
                        for (int i = 0; i < TableName.Columns.Count; i++)
                        {
                            if (i > 0)
                            {
                                strHeader += "	";
                            }
                            strHeader += TableName.Columns[i].ColumnName.ToString();
                        }
                        sw.WriteLine(strHeader);
    
                        //写入数据
                        //string strData;
                        for (int i = 0; i < TableName.Rows.Count; i++)
                        {
                            RowRead++;
                            Percent = (int)(100 * RowRead / TotalCount);
                            barStatus.Maximum = TotalCount;
                            barStatus.Value = RowRead;
                            lblStatus.Text = "共有" + TotalCount + "条数据,已写入" + Percent.ToString() + "%的数据,共耗时" + timer.ElapsedMilliseconds + "毫秒。";
                            Application.DoEvents();
    
                            string strData = "";
                            for (int j = 0; j < TableName.Columns.Count; j++)
                            {
                                if (j > 0)
                                {
                                    strData += "	";
                                }
                                strData += TableName.Rows[i][j].ToString();
                            }
                            sw.WriteLine(strData);
                        }
                        //关闭数据流
                        sw.Close();
                        myStream.Close();
                        //关闭秒钟
                        timer.Reset();
                        timer.Stop();
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                    finally
                    {
                        //关闭数据流
                        sw.Close();
                        myStream.Close();
                        //关闭秒钟
                        timer.Stop();
                    }
    
                    //成功提示
                    if (MessageBox.Show("导出成功,是否立即打开?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.Yes)
                    {
                        System.Diagnostics.Process.Start(localFilePath);
                    }
    
                    //赋初始值
                    lblStatus.Visible = false;
                    barStatus.Visible = false;
                }
            }

    后记:

    美中不足的是,上述代码仅能导出到xls格式,若需导出到xlsx格式的话,仍需调整代码。 

  • 相关阅读:
    基于Lumisoft.NET组件开发碰到乱码等一些问题的解决
    Winform开发框架之混合型框架的剖析
    Winform开发框架之通用人员信息管理
    Database2Sharp之混合型Winform框架代码生成
    python3 小技巧(2)
    Python小技巧1
    详解Python模块导入方法
    常见HTTP状态(304,200等)
    python win32api 使用小技巧
    python3下的IE自动化模块PAMIE
  • 原文地址:https://www.cnblogs.com/atomy/p/8339906.html
Copyright © 2020-2023  润新知