zoukankan      html  css  js  c++  java
  • Winform中导出Excel数据量百万级的处理办法-导出为csv文件

    场景

    Winform中通过NPOI导出Excel的三种方式(HSSFWorkbook,XSSFWorkbook,SXSSFWorkbook)附代码下载:

    https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/106423452

    在上面介绍的第三种方式中通过SXSSFWorkbook就是应对数据量特别大的情况下,

    但是SXSSFWorkbook的方式虽然对内存占用较小,不对导致内存溢出,但是其导出的时间会特别长。

    而且还会在你的C盘目录下生成一些临时文件,占用你的C盘空间。

    具体实现方式参照上面的博客。

    但是比较好的方面就是它导出的是正常的xlsx的后缀的excel文件,即能包含多个sheet页。

    如果要是对多sheet页没有要求,可将大数据量分批次生成csv文件的格式,每个csv文件100万条记录

    注:

    博客主页:
    https://blog.csdn.net/badao_liumang_qizhi
    关注公众号
    霸道的程序猿
    获取编程相关电子书、教程推送与免费下载。

    实现

    首先新建一个Winform程序,然后新建一个页面,并且拖拽一个按钮。

    为了能构建导出的数据,首先新建一个对象类

        public class DataItem
        {
    
            public int Age { get; set; }
    
    
            public string Name { get; set; }
    
    
            public string Address { get; set; }
    
            public int Sex { get; set; }
    
            public DateTime Birth { get; set; }
    
        }

    然后进入此页面的代码中,先构建一部分导出的数据。

            //数据
            List<DataItem> ItemList = new List<DataItem>() 
            { 
                new DataItem() {Name = "霸道",Age = 24,Address = "中国",Sex = 1,Birth = DateTime.Now},
                new DataItem() {Name = "流氓",Age = 25,Address = "北京",Sex = 0,Birth = DateTime.Now},
                new DataItem() {Name = "气质",Age = 26,Address = "上海",Sex = 0,Birth = DateTime.Now},
                new DataItem() {Name = "程序猿",Age = 27,Address = "青岛",Sex = 1,Birth = DateTime.Now},
            };

    然后在按钮的点击事件中

    private void button6_Click(object sender, EventArgs e)
            {
                try
                {
                    //要导出的csv文件的存放位置
                    string fullPath = System.IO.Path.Combine(@"D:", "badao.csv");
                    FileInfo fi = new FileInfo(fullPath);
                    if (!fi.Directory.Exists)
                    {
                        fi.Directory.Create();
                    }
                    FileStream fs = new FileStream(fullPath, System.IO.FileMode.Create, System.IO.FileAccess.Write);
                    StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.UTF8);
                    StringBuilder data = new StringBuilder();
    
                    //写出列名称-第一行
                    data.Append("姓名,年龄,地址,性别,生日");
                    //换行
                    sw.WriteLine(data);
    
                    //构建大数据量
                    List<DataItem> bigData = new List<DataItem>();
                    for (int i = 0; i < 1000000; i++)
                    {
                        DataItem item = new DataItem();
                        item.Name = "霸道" + i;
                        item.Age = i;
                        item.Address = "青岛" + i;
                        item.Sex = i;
                        item.Birth = DateTime.Now;
                        bigData.Add(item);
    
                    }
    
                    //新建一个计时器
                    System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch();
                    //启动计时器
                    timer.Start();
    
                    //写出各行数据
                    foreach (DataItem item in bigData)
                    {
    
                        data = new StringBuilder();
    
                        data.Append(item.Name);
                        data.Append(",");
                        data.Append(item.Age);
                        data.Append(",");
                        data.Append(item.Address);
                        data.Append(",");
                        data.Append(item.Sex);
                        data.Append(",");
                        data.Append(item.Birth);
                        data.Append(",");
                        //换行
                        sw.WriteLine(data);
    
                    }
                    //关闭
                    sw.Close();
                    fs.Close();
                    //结束计时
                    timer.Stop();
                    MessageBox.Show("导出成功,花费秒数:"+(timer.ElapsedMilliseconds)/1000);
                }
                catch (Exception ex)
                {
                    Console.Write(ex);
                    MessageBox.Show("导出失败:"+ex);
                }
                
            }

    为了增加测试导出大数据量的时间,所以首先构建了一个1000000万条记录,然后循环一行一行的追加,

    添加一个计时,看看花费了多少时间

     

    此文件的后缀名为csv可以使用Excel打开

  • 相关阅读:
    从句分析
    artDialog ( v 6.0.2 ) content 参数引入页面 html 内容
    Java实现 LeetCode 13 罗马数字转整数
    Java实现 LeetCode 13 罗马数字转整数
    Java实现 LeetCode 13 罗马数字转整数
    Java实现 LeetCode 12 整数转罗马数字
    Java实现 LeetCode 12 整数转罗马数字
    Java实现 LeetCode 12 整数转罗马数字
    Java实现 LeetCode 11 盛最多水的容器
    Java实现 LeetCode 11 盛最多水的容器
  • 原文地址:https://www.cnblogs.com/badaoliumangqizhi/p/12988380.html
Copyright © 2011-2022 走看看