多线程导出大规模excel文件
文章有点水,和前几篇没有太大区别,但是单线程处理大文件导出会非常耗时间,用到多线程才能更加合理的利用资源。大文件也可能会超出excel工作表范围。这里也有相应处理 
参考:用DataGridView导入TXT文件,并导出为XLS文件 
参考:c#多线程介绍(上)
private void button1_Click(object sender, EventArgs e)
{
    string fileName = "";
    openFileDialog1.Multiselect = true;
    if (openFileDialog1.ShowDialog() == DialogResult.OK)
    {
        string[] filePath = openFileDialog1.FileNames;
        foreach (string name in filePath)
        {
            fileName = name;
            Thread thread = new Thread(new ParameterizedThreadStart(Go));
            thread.Start(fileName );
        }
    }
}
private void Go(object fileName1)
{
    string fileName = (string)fileName1;
    System.Data.DataTable dt = new System.Data.DataTable();
    StreamReader sr = new StreamReader(fileName, Encoding.UTF8);
    for (int i = 0; i < 9; i++)
    {
        dt.Columns.Add(i.ToString());
    }
    while (true)
    {
        string strLine = sr.ReadLine();
        if (string.IsNullOrEmpty(strLine) == true)
        {
            break;
        }
        else
        {
            DataRow dr = dt.NewRow();
            string[] strList = strLine.Split('|');
            int j = 0;
            for (int i = 0; i < strList.Length - 1; i++)
            {
                dr[j.ToString()] = strList[i];
                j++;
                if (j == 9)
                {
                    j = 0;
                    dt.Rows.Add(dr);
                }
            }
        }
    }
    sr.Close();
    OutPutAsExcelFile(dt,fileName);
}        private void OutPutAsExcelFile(System.Data.DataTable dt,string fileName)
        {
            fileName += ".xls";
            Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
            if (xlApp == null)
            {
                MessageBox.Show("无法创建Excel对象,您的电脑可能未安装Excel");
                return;
            }
            Microsoft.Office.Interop.Excel.Workbooks workbooks = xlApp.Workbooks;
            Microsoft.Office.Interop.Excel.Workbook workbook = workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);
            MessageBox.Show(dt.Rows.Count.ToString());
            int n = dt.Rows.Count / (2 << 15) + 1;
            MessageBox.Show(n.ToString());
            if (n > 3)
            {
                for (int i = 0; i < n - 3; i++)
                {
                    xlApp.Sheets.Add();
                }
            }
            for (int i = 1; i <= n; i++)
            {
                ((Microsoft.Office.Interop.Excel.Worksheet)xlApp.Sheets[i]).Name =   i.ToString();//修改SHEET名
            }
                for (int l = 0; l < n; l++)
                {
                    Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[l + 1];//取得sheet
                    //Microsoft.Office.Interop.Excel.Worksheet worksheet2 = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[2];//取得sheet2
                    int CurrentRow = l * 65536;
                    for (int r = 0; r < 65536; r++)
                    {
                        if (r + CurrentRow == dt.Rows.Count)
                            break;
                        for (int i = 0; i < dt.Columns.Count; i++)
                        {
                            worksheet.Cells[r + 1, i + 1] = dt.Rows[r + CurrentRow][i];
                        }
                        System.Windows.Forms.Application.DoEvents();
                    }
                    worksheet.Columns.EntireColumn.AutoFit();//列宽自适
                }
            MessageBox.Show(fileName + "的简明资料保存成功", "提示", MessageBoxButtons.OK);
            if (fileName != "")
            {
                try
                {
                    workbook.Saved = true;
                    workbook.SaveCopyAs(fileName);
                    //fileSaved = true;
                }
                catch (Exception ex)
                {
                    //fileSaved = false;
                    MessageBox.Show("导出文件时出错,文件可能正被打开!\n" + ex.Message);
                }
            }
            xlApp.Quit();
            GC.Collect();//强行销毁 
        }多线程导出大规模excel文件的更多相关文章
- .Net MVC  导入导出Excel总结(三种导出Excel方法,一种导入Excel方法) 通过MVC控制器导出导入Excel文件(可用于java SSH架构)
		.Net MVC 导入导出Excel总结(三种导出Excel方法,一种导入Excel方法) [原文地址] 通过MVC控制器导出导入Excel文件(可用于java SSH架构) public cl ... 
- C#中dategridview数据导出为excel文件
		先从数据库中获取数据,绑定在datagridview中,再从dategridview中导出为excel文件 1.新建窗体,把控件datagridview和按钮设置好,如图 
- Reporting services导出的Excel文件避免出现隐藏行列的布局
		开发Reporting services时,为了避免在导出的Excel文件中出现隐藏的行和列,必须遵循以下规则: 1.Page header中的Textbox直接必须紧密贴合在一起 2.Page he ... 
- 数据导出至Excel文件--好库编程网http://code1.okbase.net/codefile/SerializeHelper.cs_2012122018724_118.htm
		using System; using System.IO; using System.Data; using System.Collections; using System.Data.OleDb; ... 
- Qt中将QTableView中的数据导出为Excel文件
		如果你在做一个报表类的程序,可能将内容导出为Excel文件是一项必须的功能.之前使用MFC的时候我就写过一个类,用于将grid中的数据导出为Excel文件.在使用了QtSql模块后,我很容易的将这个类 ... 
- 使用JavaScript把页面上的表格导出为Excel文件
		如果在页面上展示了一个数据表格,而用户想把这个表格导出为Excel文件,那么在要求不高的情况下,可以不通过服务器生成表格,而是直接利用JavaScript的Blob和Object URL特性将表格导出 ... 
- 网站开发进阶(三十一)js如何将html表格导出为excel文件(后记)
		js如何将html表格导出为excel文件(后记) 前言 项目前期做了个导出Excel表格的功能,但是经过测试发现只有在IE上才可以正确实现,在Chrome等浏览器中无法实现导出效果.经过上网搜索,尝 ... 
- 网站开发进阶(二十五)js如何将html表格导出为excel文件
		js如何将html表格导出为excel文件 赠人玫瑰,手留余香.若您感觉此篇博文对您有用,请花费2秒时间点个赞,您的鼓励是我不断前进的动力,共勉! jsp页面数据导出成excel的方法很 ... 
- Pl/sql 如何将oracle的表数据导出成excel文件?
		oracle将表数据导出成excel文件的方法 1)在SQL窗体上,查询需要导出的数据 --查询数据条件-- ; 结果视图 2)在查询结果的空白处,右键选择Copy to Excel 3) 查看导出e ... 
随机推荐
- Android OutOfMemoryError的理解
			最近写了个测试demo调试网络优化,发现下载20M的文件时我直接申请了20M的空间,然后就OOM导致crash了~~ 典型的错误信息如下: OutOfMemoryError:Out of memory ... 
- MongoDB的分片(9)
			什么是分片 分片是指将数据库拆分,将其分散在不同的机器上的过程.将数据分散到不同的机器上,不需要功能强大的服务器就可以存储更多的数据和处理更大的负载.基本思想就是将集合切成小块,这些块分散到若干片里, ... 
- Problem with "AnyConnect was not able to establish connection to the specified secure gateway."
			Cisco的VPN客户端最近报"AnyConnect was not able to establish connection to the specified secure gateway ... 
- Officel常用操作
			Excel: 1.隔行变色|菜单->条件格式->其它规则->使用公式->"=MOD(ROW(),2)=0" 2.查找包含特定字符的单元格,并替换整个单元格 ... 
- SQL 谜题(硬币的组合)
			问题:早在ITPUB中看过有个SQL高手,喜欢出谜题,以下是一个谜题.我试用SQL SERVER解决此问题. 用1分,5分,10分,25分,50分硬币凑成一元,总共有几种组合办法? SELECT'1* ... 
- MySql 获取表的字段名
			mysql安装成功后可以看到已经存在mysql.information_schema和test这个几个数据库,information_schema库中有一个名为COLUMNS的表,这个表中记录了数据库 ... 
- 进击的Python【第二章】:Python基础(二)
			Python基础(二) 本章内容 数据类型 数据运算 列表与元组的基本操作 字典的基本操作 字符编码与转码 模块初探 练习:购物车程序 一.数据类型 Python有五个标准的数据类型: Numbers ... 
- Cookie 用法 小记
			//保存cookie Cookie cookieName = new Cookie("name", realUser.getName()); Coo ... 
- 帝国CMS如何自动生成sitemap.xml网站地图文件
			登录网站的后台http://你的域名/e/admin/ 进入后台栏目 =>增加自定义页面 =>选择直接页面,页面名称为:网站地图,文件名修改为 ../../sitemap.xml 内容填 ... 
- JS操作Json
			因为我水啊 所以我就要手打一下 熟悉一下 ===== JSON 全称 JavaScript Object Notation(标记) 一种轻量级的数据交互格式,采用完全独立于语言的文本格式 同事JSON ... 
