当前位置:  编程技术>.net/c#/asp.net

C# 大数据导出word的假死报错的处理方法

    来源: 互联网  发布时间:2014-10-17

    本文导语:  最近一个项目是一个基于winform的报告系统,根据一系列的查询参数计算出结果,最终生成一个格式规范的word文档,刚开始数据量不大(500行)数据以内,写入速度还能接受,但最近遇到一个问题就是当出现大量的数据行的时...

最近一个项目是一个基于winform的报告系统,根据一系列的查询参数计算出结果,最终生成一个格式规范的word文档,刚开始数据量不大(500行)数据以内,写入速度还能接受,但最近遇到一个问题就是当出现大量的数据行的时候,写入word的过程就变的非常慢,CPU直接拉到100%,本人机器配置已经算比较高的了,8G内存+i5CPU,依旧假死,该问题困扰了我几天,也问了google很多次,基本上给出的答案都是word本身就比较慢这样一类的答案,或者是非托管代码的优化,慢也就算了,至少可以通过进度条来交互,假死到报错,这个绝对是零容忍的。尝试了很多种方法,包括将非托管代码强制进行回收,多线程等方式,最终都失败了,当然,黄天不负有心人最终总算是解决了问题了,我的数据量不算特别巨大,就4000多行写入表中,废话少说,直接贴代码:

常规写入word表格的方法:

代码如下:

private void LoadSectionWord()
        {
           //临时目录
            string filePath = Tools.CreateWordFileDir() + Utils.GetTimeString() + ".doc";
          //将二进制文件写入到word文件
            sectionWordTools.ByteConvertWord(sectionWordTools.WordContentByTemplateIDAndTemplateTitle(templateId, sectionTitle), filePath);
            try
            {
              //wdc为winWordControl控件的实例
                wdC.LoadDocument(filePath);
                Microsoft.Office.Interop.Word.Document wd = (Microsoft.Office.Interop.Word.Document)wdC.document;
                Microsoft.Office.Interop.Word.Application wa = wd.Application;//
               //需要写入Word的集合
                if (dicList.Count > 0)
                {
                    dicList = dicList.OrderBy(d => d.Key.AnalyteID).ToDictionary(i => i.Key, ii => ii.Value);
                    sectionWordTools.GotoBookMark(wa, "RepeatAnalysisResult");
                    wa.Selection.Copy();//复制模板第一个table
                    sectionWordTools.WordReplace("special matrix", wdg.Species.ToLower().Trim() + " " + wdg.Matrix.ToLower().Trim(), true, wd);
                    string analyteTitles = string.Empty;
                    int index = 0;

                    #region Replace Title
                    foreach (KeyValuePair d in dicList)
                    {

                        AnalyteReNameEntity key = d.Key;
                        if (dicList.Count > 2)
                        {
                            if (index.Equals(dicList.Count - 2))
                            {
                                analyteTitles += key.NewAnalyteName + " and ";
                            }
                            else
                            {
                                analyteTitles += key.NewAnalyteName + " , ";
                            }
                        }
                        else if (dicList.Count == 2)
                        {
                            analyteTitles += key.NewAnalyteName + " and ";
                        }
                        else
                        {
                            analyteTitles += key.NewAnalyteName;
                        }
                        index++;
                    }
                    analyteTitles = analyteTitles.Trim().TrimEnd('d').TrimEnd('n').TrimEnd('a').Trim().Trim(',');
                    sectionWordTools.WordReplace("for Abc000", "for " + analyteTitles, true, wd);
                    #endregion

                    int wordTableCount = 0;
                    foreach (KeyValuePair d in dicList)
                    {
                        AnalyteReNameEntity key = d.Key;
                        DataView dv = d.Value.DefaultView;
                        dv.Sort = "Custom ID";
                        DataTable dt = dv.ToTable();
                        #region 处理dt
                        if (dt.Columns["analyteid"] != null)
                        {
                            dt.Columns.Remove("analyteid");
                        } if (dt.Columns["id"] != null)
                        {
                            dt.Columns.Remove("id");
                        }
                        if (dt.Columns["reportid"] != null)
                        {
                            dt.Columns.Remove("reportid");
                        }
                        if (dt.Columns["studyid"] != null)
                        {
                            dt.Columns.Remove("studyid");
                        }
                        if (dt.Columns["analyteid"] != null)
                        {
                            dt.Columns.Remove("analyteid");
                        }
                        #endregion
                        //第一个WordTable
                        Microsoft.Office.Interop.Word.Table tb = wd.Tables[wd.Tables.Count];

                        #region 填充值
                        if (dt.Rows.Count > 0)
                        {
                            object beforerow = tb.Rows[2];
                            //表头
                            for (int i = 1; i


    
 
 

您可能感兴趣的文章:

  • c#多线程更新窗口(winform)GUI的数据
  • C#难点逐个击破(6):C#数据类型与.net framework数据类型
  • C#中怎样将数据表中新添加的一列数据相加,再写入另一个表中。
  • c#读取图像保存到数据库(数据库保存图片)实例
  • C#判断数据类型的简单示例代码
  • C# 备份数据库的简单代码
  • c# 连接access数据库config配置
  • c#连接sqlserver数据库的例子
  • NOSQL iis7站长之家
  • C# mysql 插入数据,中文乱码的解决方法
  • C#中遍历DataSet数据集对象实例
  • C#连接Oracle数据库的实例方法
  • c#连接mysql数据库的方法
  • C#实现把dgv里的数据完整的复制到一张内存表的方法
  • C#连接MySql数据库的方法
  • c#数据绑定之删除datatable数据示例
  • c#数据绑定之向查询中添加参数(.Net连接外部数据库)
  • c#中使用SqlDataReader查询数据库
  • c#使用config文件连接access数据库
  • C#三种判断数据库中取出的字段值是否为空(NULL) 的方法
  • c#判断数据库服务器是否启动
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • mysql 命令大全及导入导出表结构或数据
  • 11g Oracle导出表不导出数据默认为空表的解决方法
  • oracle数据库导出和oracle导入数据的二种方法(oracle导入导出数据)
  • mysql mysqldump只导出表结构或只导出数据的实现方法
  • oracle 数据泵导入导出介绍
  • SQLServer导出sql文件/表架构和数据操作步骤
  • 利用多个转储文件导出大量Oracle数据
  • mysql 导入导出数据库、数据表的方法
  • 如何用java实现将数据库中的image类型数据导出到文本文件。并导入(高分求救!!)
  • linux下如何导出设备数据?
  • 数据查看导出系统 askyear
  • 数据库模型导出工具 DatabaseToUML
  • Mysql导出数据的正确方法
  • 请教:如何将SQLSERVER数据库中所有表结构导出???
  • 在java中怎么把数据库中的数据导出成excel形式的啊?
  • linux环境下oracle条件导出数据的shell脚本怎么写
  • 如何用workbench导出mysql数据库关系图
  • SQL Server导入导出数据时最常见的一个错误解决方法
  • SQL Server2008数据库导入导出兼容性处理方案
  • 手把手教你Oracle数据库导出数据库结构到PowerDesigner
  • mysql 导入导出数据库以及函数、存储过程的介绍
  • java命名空间javax.print类docflavor的类成员方法:服务格式化打印数据定义及介绍
  • 如何监控数据库的数据,如果数据库数据更改,就通知Server
  • <<大话数据结构>>中冒泡排序算法改进
  • 如何从数据库中或文本文件中提取数据到另一个数据库中?
  • java命名空间javax.print类docflavor的类成员方法:客户端格式化打印数据定义及介绍
  • 用JDBC连接Oracle数据库时,如何向数据库中写日期型数据(格式)?谢了!
  • 基于Key-Value的NOSQL数据库Redis的数据结构及常用相关命令介绍
  • linux下用libpcap库函数抓包,如何判断捕获的数据包是IP数据包还是非IP数据包,顺便说一下、捕获的数据包除了IP数据包之外,还有那些种类,非常感谢!!!
  • 基于Hadoop的数据挖掘框架
  • 建立一个ftp数据连接并传送或接受完毕一些数据后,能否不关闭此数据连接,下次接着用?




  • 特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3