最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C# 大數(shù)據(jù)導(dǎo)出word的假死報(bào)錯(cuò)的處理方法

 更新時(shí)間:2013年03月11日 17:25:46   作者:  
C# 大數(shù)據(jù)導(dǎo)出word的假死報(bào)錯(cuò)的處理方法,需要的朋友可以參考一下

最近一個(gè)項(xiàng)目是一個(gè)基于winform的報(bào)告系統(tǒng),根據(jù)一系列的查詢參數(shù)計(jì)算出結(jié)果,最終生成一個(gè)格式規(guī)范的word文檔,剛開(kāi)始數(shù)據(jù)量不大(500行)數(shù)據(jù)以內(nèi),寫(xiě)入速度還能接受,但最近遇到一個(gè)問(wèn)題就是當(dāng)出現(xiàn)大量的數(shù)據(jù)行的時(shí)候,寫(xiě)入word的過(guò)程就變的非常慢,CPU直接拉到100%,本人機(jī)器配置已經(jīng)算比較高的了,8G內(nèi)存+i5CPU,依舊假死,該問(wèn)題困擾了我?guī)滋?,也?wèn)了google很多次,基本上給出的答案都是word本身就比較慢這樣一類(lèi)的答案,或者是非托管代碼的優(yōu)化,慢也就算了,至少可以通過(guò)進(jìn)度條來(lái)交互,假死到報(bào)錯(cuò),這個(gè)絕對(duì)是零容忍的。嘗試了很多種方法,包括將非托管代碼強(qiáng)制進(jìn)行回收,多線程等方式,最終都失敗了,當(dāng)然,黃天不負(fù)有心人最終總算是解決了問(wèn)題了,我的數(shù)據(jù)量不算特別巨大,就4000多行寫(xiě)入表中,廢話少說(shuō),直接貼代碼:

常規(guī)寫(xiě)入word表格的方法:

復(fù)制代碼 代碼如下:

private void LoadSectionWord()
        {
           //臨時(shí)目錄
            string filePath = Tools.CreateWordFileDir() + Utils.GetTimeString() + ".doc";
          //將二進(jìn)制文件寫(xiě)入到word文件
            sectionWordTools.ByteConvertWord(sectionWordTools.WordContentByTemplateIDAndTemplateTitle(templateId, sectionTitle), filePath);
            try
            {
              //wdc為winWordControl控件的實(shí)例
                wdC.LoadDocument(filePath);
                Microsoft.Office.Interop.Word.Document wd = (Microsoft.Office.Interop.Word.Document)wdC.document;
                Microsoft.Office.Interop.Word.Application wa = wd.Application;//
               //需要寫(xiě)入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();//復(fù)制模板第一個(gè)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<AnalyteReNameEntity, DataTable> 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<AnalyteReNameEntity, DataTable> 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
                        //第一個(gè)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 <= dt.Columns.Count; i++)
                            {
                                tb.Cell(1, i).Range.Text = dt.Columns[i - 1].ColumnName;
                            }
                            for (int k = 1; k <= dt.Rows.Count; k++)
                            {
                                //模板上默認(rèn)有2行了,添加行數(shù)
                                if (k <= dt.Rows.Count - 2)
                                {
                                    tb.Rows.Add(ref beforerow);
                                }
                                for (int i = 1; i <= dt.Columns.Count; i++)
                                {
                                    tb.Cell(k + 1, i).Range.Text = dt.Rows[k - 1][dt.Columns[i - 1].ColumnName].ToString();
                                }
                            }
                        }
                        #endregion

                        sectionWordTools.WordReplace("Abc000", key.NewAnalyteName, true, wd);

                        #region 處理備注
                        string notStr = GetCurrentReassayReason(key.AnalyteID);
                        //notStr = "Reasons for Reassay:\r1). Confirmation Assay\r2). ALQ\rReasons for Reported Conc.:\r1). The only valid result is reported.\r20. Reassay results selected according to procedure defined in study protocol";

                        sectionWordTools.WordReplace("Repeat analysis Tipis", notStr, true, wd);
                        #endregion
                        //根據(jù)內(nèi)容調(diào)整表格
                        //tb.AutoFitBehavior(Microsoft.Office.Interop.Word.WdAutoFitBehavior.wdAutoFitContent);
                        //根據(jù)窗口調(diào)整表格
                        //tb.AutoFitBehavior(Microsoft.Office.Interop.Word.WdAutoFitBehavior.wdAutoFitWindow);
                        if (wordTableCount < dicList.Count - 1)
                        {
                            // wa.Selection.TypeParagraph();//回車(chē)
                            wd.Paragraphs.Last.Range.Select();
                            wa.Selection.Paste();
                        }
                        wordTableCount++;

                        #region 處理整體格式
                        object lefttopstr = tb.Cell(2, 1).Range.Start;
                        object leftbottomend = tb.Cell(tb.Rows.Count, tb.Columns.Count).Range.End;
                        wd.Range(ref lefttopstr, ref leftbottomend).Select();
                        sectionWordTools.AddBorderNoneLineStyle(wa, false, false, true, true, true, true, true, true);
                        #endregion

 

                    }


                }

            }
            catch (Exception ex)
            {
                Tools.RecordErrorList(ex.Message, ex);
            }
        }

上面的代碼就是通過(guò)winwordControl控件加載word模板,一行一行向word表格中寫(xiě)入數(shù)據(jù),新的表格通過(guò)書(shū)簽復(fù)制后粘貼,然后繼續(xù)一行一行的寫(xiě)入,數(shù)據(jù)量在500行以內(nèi)的時(shí)候,速度還是可以接受的,當(dāng)數(shù)據(jù)量增大之后,就很慢了

改進(jìn)后的代碼,主要用到了分頁(yè)的思想,將集合或者datatable進(jìn)行分頁(yè),每頁(yè)處理50行數(shù)據(jù),處理完了之后保存到臨時(shí)文件,釋放掉word資源,再打開(kāi)臨時(shí)文件,接著上次的寫(xiě)入位置繼續(xù)寫(xiě)入。釋放word資源就是為了解決寫(xiě)入數(shù)據(jù)量過(guò)大假死報(bào)錯(cuò)的問(wèn)題。希望對(duì)處理word的朋友有幫助

復(fù)制代碼 代碼如下:

private void LoadSectionWord()
        {
            string filePath = Tools.CreateWordFileDir() + Utils.GetTimeString() + ".doc";
            //讀取模板
            sectionWordTools.ByteConvertWord(sectionWordTools.WordContentByTemplateIDAndTemplateTitle(templateId, sectionTitle), filePath);
            try
            {
                wdC.LoadDocument(filePath);
                Microsoft.Office.Interop.Word.Document wd = (Microsoft.Office.Interop.Word.Document)wdC.document;
                Microsoft.Office.Interop.Word.Application wa = wd.Application;
                sectionWordTools.GotoBookMark(wa, "TimeConcentrationData");
                wa.Selection.Copy();//復(fù)制模板第一個(gè)table
                string assayLLOQ = ComputerOfPostText.ComputerPostText.GetStudyAssayLLOQResults(this.studyId);
                sectionWordTools.WordReplace("0.0 ng/mL for Abc000", assayLLOQ, true, wd);

                //獲得分組,只有分組了的才統(tǒng)計(jì),默認(rèn)已經(jīng)分好組,組可以調(diào)整
                List<string> groupList = commonBLL.GetAnalyteGroupList(this.reportId, COMMON_TYPE);
                List<List<AnalyteReNameEntity>> analyteGroupList = new List<List<AnalyteReNameEntity>>();

                #region 確定Table分組的數(shù)量
                foreach (string group in groupList)
                {
                    List<AnalyteReNameEntity> currentGroupList = commonBLL.GetAnalyteReNameList(this.reportId, this.studyId, group);
                    if (currentGroupList.Count > 0)
                    {
                        analyteGroupList.Add(currentGroupList);
                    }
                }
                #endregion

                if (analyteGroupList.Count > 0)
                {
                    int wordTableCount = 0;
                    foreach (List<AnalyteReNameEntity> currentGroupList in analyteGroupList)
                    {
                        //第一個(gè)WordTable
                        Microsoft.Office.Interop.Word.Table tb = wd.Tables[wd.Tables.Count];
                        string key = globalBLL.AnalyteAppendString(currentGroupList);
                        //需要寫(xiě)入word的結(jié)果集
                        DataTable dt = new DataTable();

                        #region  構(gòu)造word中的列頭
                        foreach (ReportColumnsEntity rc in rceList)
                        {
                            dt.Columns.Add(rc.ReportText, typeof(string));
                        }

                        foreach (AnalyteReNameEntity ar in currentGroupList)
                        {
                            dt.Columns.Add(ar.NewAnalyteName + " Concentration (ng/mL)", typeof(string));
                        }
                        dt.Columns.Add("Comments", typeof(string));
                        #endregion

                        #region 構(gòu)造Word中的行的DataTable
                        for (int i = 0; i < currentGroupList.Count; i++)
                        {
                            DataRow[] rows = dtResult.Select(string.Format(" analyteid={0}", currentGroupList[i].AnalyteID));
                            if (i == 0)
                            {
                                #region i=0,填充包括列頭
                                for (int k = 0; k < rows.Length; k++)
                                {
                                    string conc = Utils.EffectiveNumber(rows[k]["concentration"].ToString(), "3");
                                    DataRow dr = dt.NewRow();
                                    foreach (ReportColumnsEntity rc in rceList)
                                    {
                                        if (rc.WatsonText.Equals("concentration"))
                                        {
                                            dr[rc.ReportText] = Utils.EffectiveNumber(rows[k][rc.WatsonText].ToString(), "3");
                                        }
                                        else
                                        {
                                            dr[rc.ReportText] = rows[k][rc.WatsonText].ToString();
                                        }

                                    }
                                    dr["Comments"] = "NA";
                                    dr[currentGroupList[i].NewAnalyteName + " Concentration (ng/mL)"] = conc;

                                    dt.Rows.Add(dr);
                                }
                                #endregion
                            }
                            else
                            {
                                for (int k = 0; k < rows.Length; k++)
                                {
                                    string conc = Utils.EffectiveNumber(rows[k]["concentration"].ToString(), "3");
                                    //對(duì)分析物濃度列重新賦值
                                    dt.Rows[k][currentGroupList[i].NewAnalyteName + " Concentration (ng/mL)"] = conc;
                                }
                            }

                        }
                        DataTable dtTemp = dt.Copy();
                        DataView dv = dt.DefaultView;
                        dv.Sort = "Subject ID";
                        dtTemp = dv.ToTable();
                        dt = dtTemp;
                        #endregion

                        #region 填充值
                        if (dt.Rows.Count > 0)
                        {

                            #region 根據(jù)列合并拆分單元格
                            object wordColumnsCount = dt.Columns.Count;
                            object rownum = 1;
                            for (int k = 0; k < 5; k++)
                            {
                                for (int i = 1; i < tb.Columns.Count; i++)
                                {

                                    tb.Cell(k, i).Range.Text = " ";
                                }
                            }
                            //先合并,再拆分  Selection.Cells.Merge
                            for (int i = 1; i <= 4; i++)
                            {
                                object start = tb.Cell(i, 1).Range.Start;
                                object end = tb.Cell(i, 6).Range.End;
                                wd.Range(ref start, ref end).Select();
                                wa.Selection.Cells.Merge();
                            }
                            for (int i = 1; i < 5; i++)
                            {
                                tb.Cell(i, 1).Split(ref rownum, ref wordColumnsCount);
                            }
                            #endregion

                            //關(guān)閉屏幕更新
                            wa.ScreenUpdating = false;
                            #region 表頭的填充
                            //表頭填充
                            for (int i = 1; i <= dt.Columns.Count; i++)
                            {
                                tb.Cell(1, i).Range.Text = dt.Columns[i - 1].ColumnName;
                            }
                            #endregion

                            #region 填充值

                            #region 分頁(yè)
                            object missing = System.Reflection.Missing.Value;
                            object saveOption = Microsoft.Office.Interop.Word.WdSaveOptions.wdDoNotSaveChanges; //解決normal.dot問(wèn)題
                            object beforerow = tb.Rows[3];
                            int dtRowCounts = dt.Rows.Count;//10;// 
                            int columnCount = dt.Columns.Count;
                            int pageSize = 50;
                            //分頁(yè)的總頁(yè)數(shù)
                            int totalPages = DataUtils.GetPageCounts(dtRowCounts, pageSize);
                            for (int index = 1; index <= totalPages; index++)
                            {
                                tb = wd.Tables[wd.Tables.Count];
                                beforerow = tb.Rows[3 + (index - 1) * pageSize];
                                DataTable pageDt = DataUtils.GetPagedTable(dt, index, pageSize);

                                #region 添加行和數(shù)據(jù)
                                for (int k = 2; k < pageDt.Rows.Count + 2; k++)
                                {

                                    //模板上已經(jīng)有三行了,最后一頁(yè)少添加3行
                                    if (index.Equals(totalPages))
                                    {
                                        if (k < pageDt.Rows.Count - 3)
                                        {
                                            tb.Rows.Add(ref beforerow);
                                        }

                                    }
                                    else
                                    {
                                        tb.Rows.Add(ref beforerow);
                                    }
                                    //添加行的同時(shí)填充單元格的值,減少一次全循環(huán)
                                    for (int i = 1; i <= pageDt.Columns.Count; i++)
                                    {
                                        tb.Cell(k + (index - 1) * pageSize, i).Range.Text = pageDt.Rows[k - 2][pageDt.Columns[i - 1].ColumnName].ToString();
                                    }
                                }
                                #endregion
                                //填充完P(guān)ageSize條數(shù)據(jù),先保存再重新加載填充
                                object savePath = filePath;
                                wd.SaveAs(ref   savePath, ref   missing,
                ref   missing, ref   missing, ref   missing, ref   missing,
                ref   missing, ref   missing, ref   missing, ref   missing, ref   missing, ref missing, ref missing, ref missing, ref missing, ref missing);
                                wa.ScreenUpdating = true;
                                wd = null;
                                wa = null;
                                Thread.Sleep(10);
                                //重新加載
                                wdC.LoadDocument(filePath);
                                wd = (Microsoft.Office.Interop.Word.Document)wdC.document;
                                wa = wd.Application;
                                wa.ScreenUpdating = false;
                            }
                            #endregion

                            #endregion
                            //打開(kāi)屏幕更新
                            //wa.ActiveDocument.ActiveWindow.WindowState = Microsoft.Office.Interop.Word.WdWindowState.wdWindowStateMaximize;
                            wa.ScreenUpdating = true;
                        }

                        #endregion

                        #region Paste Table
                        sectionWordTools.WordReplace("Abc000", key, true, wd);
                        tb = wd.Tables[wd.Tables.Count];
                        //根據(jù)內(nèi)容調(diào)整表格
                        tb.AutoFitBehavior(Microsoft.Office.Interop.Word.WdAutoFitBehavior.wdAutoFitContent);
                        //根據(jù)窗口調(diào)整表格
                        tb.AutoFitBehavior(Microsoft.Office.Interop.Word.WdAutoFitBehavior.wdAutoFitWindow);
                        if (wordTableCount < analyteGroupList.Count - 1)
                        {
                            // wa.Selection.TypeParagraph();//回車(chē)
                            wd.Paragraphs.Last.Range.Select();
                            wa.Selection.Paste();
                        }
                        wordTableCount++;
                        #endregion
                    }
                }
            }
            catch (Exception ex)
            {
                Tools.RecordErrorList(ex.Message, ex);
            }
        }

相關(guān)文章

  • C#3.0中Lambda表達(dá)式詳解

    C#3.0中Lambda表達(dá)式詳解

    在C#3.0中,微軟給我?guī)?lái)的一些新特性可能是以前所有開(kāi)發(fā)語(yǔ)言都沒(méi)有的特性。這無(wú)疑大大的體現(xiàn)了C#3.0在開(kāi)發(fā)語(yǔ)言中強(qiáng)大的優(yōu)勢(shì)
    2013-09-09
  • C#實(shí)現(xiàn)的鼠標(biāo)鉤子

    C#實(shí)現(xiàn)的鼠標(biāo)鉤子

    本文給大家分享的是使用C#實(shí)現(xiàn)鼠標(biāo)鉤子功能,程序已能獲取鼠標(biāo)坐標(biāo),其他就沒(méi)別的功能了,有需要的小伙伴參考下吧。
    2015-03-03
  • C#泛型方法在lua中表示的一種設(shè)計(jì)詳解

    C#泛型方法在lua中表示的一種設(shè)計(jì)詳解

    這篇文章主要給大家介紹了關(guān)于C#泛型方法在lua中表示的一種設(shè)計(jì)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • 深入理解C#中new、override、virtual關(guān)鍵字的區(qū)別

    深入理解C#中new、override、virtual關(guān)鍵字的區(qū)別

    下面小編就為大家?guī)?lái)一篇深入理解C#中new、override、virtual關(guān)鍵字的區(qū)別。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-06-06
  • C#實(shí)現(xiàn)條形碼識(shí)別的解決方案分享

    C#實(shí)現(xiàn)條形碼識(shí)別的解決方案分享

    主流的識(shí)別庫(kù)主要有ZXing.NET和ZBar,OpenCV 4.0后加入了QR碼檢測(cè)和解碼功能,所以本文主要和大家分享了使用ZBar進(jìn)行條形碼識(shí)別的示例代碼,需要的可以參考一下
    2023-07-07
  • Unity 使用TexturePacker打包圖集的操作方法

    Unity 使用TexturePacker打包圖集的操作方法

    這篇文章主要介紹了Unity 使用TexturePacker打包圖集的操作方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • C#簡(jiǎn)單獲取時(shí)間差的小例子

    C#簡(jiǎn)單獲取時(shí)間差的小例子

    C#簡(jiǎn)單獲取時(shí)間差的小例子,需要的朋友可以參考一下
    2013-04-04
  • C#三種方法獲取文件的Content-Type(MIME Type)

    C#三種方法獲取文件的Content-Type(MIME Type)

    這篇文章介紹了C#獲取文件Content-Type(MIME Type)的三種方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-01-01
  • 利用WPF窗口程序設(shè)計(jì)簡(jiǎn)單計(jì)算器

    利用WPF窗口程序設(shè)計(jì)簡(jiǎn)單計(jì)算器

    這篇文章主要為大家詳細(xì)介紹了利用WPF窗口程序設(shè)計(jì)簡(jiǎn)單計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • 基于C#中XmlReader讀取Xml的深入分析

    基于C#中XmlReader讀取Xml的深入分析

    本篇文章是對(duì)C#中XmlReader讀取Xml進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05

最新評(píng)論

屏东县| 兴国县| 晋中市| 天镇县| 三台县| 揭阳市| 夏河县| 秭归县| 逊克县| 增城市| 文成县| 天长市| 玛曲县| 奉新县| 易门县| 阳泉市| 朝阳区| 栾城县| 德惠市| 上饶市| 河西区| 吉安县| 宁城县| 沈阳市| 灵山县| 额敏县| 蕲春县| 司法| 汤阴县| 威宁| 旬邑县| 乌鲁木齐市| 桃江县| 文山县| 广安市| 兴城市| 丰都县| 邯郸县| 宝山区| 连州市| 吉林省|