首页 新闻 会员 周边

asp.net 操作word 后台生成表格数据时,因为数据量较大,导致生成失败,请大家帮帮忙

1
悬赏园豆:30 [已关闭问题] 关闭于 2011-04-15 12:27

下面的这个方法因为dataset里的数据有1900多行,导致整个word生成失败, 这个方法的主要功能是,添加行数据到表格,并将数据复制到head.doc模板,在另存为一个新的word文件。红色部分是调试的时候,一直没有执行完的地方。(实际上数据是生成完了的,但都是在临时文件里。。。具体可能要清楚的朋友的才能明白),请大家提点建议,谢谢!

        private bool AddTableRow(string fileName, int addRowCount,DataSet ds )
        {
            Word.ApplicationClass cls = null;
            Word.Document doc = null;
            Word.Table table = null;
            object missing = System.Reflection.Missing.Value;
            object path = fileName;
            cls = new Word.ApplicationClass();
            try
            {
                doc = cls.Documents.Open
                    (ref path, 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);

                table = doc.Tables[1];
                //object newRow = table.Rows[1];
                for (int i = 0; i < addRowCount; i++)
                {
                    Word.Row row = table.Rows[1];

                    DataRow dr = ds.Tables[0].Rows[i];

                    row.Cells[1].Range.Text = dr[0].ToString();
                    row.Cells[2].Range.Text = dr[1].ToString();
                    row.Cells[3].Range.Text = dr[2].ToString();
                    row.Cells[4].Range.Text = dr[3].ToString();
                    row.Cells[5].Range.Text = dr[4].ToString();
                    row.Cells[6].Range.Text = dr[5].ToString();

                    object newRow = row;
                    table.Rows.Add(ref newRow);
                }

                doc.Content.Copy();

                #region //删除生成的表格,并保存,因为操作插入行后就已经修改了该模板,所以撤销显然麻烦些,干脆删除生成的行,然后在保存这样模板就等于是还原了
                //while (doc.Tables[1].Rows.Count > 1)
                //{
                //    doc.Tables[1].Rows[1].Delete();
                //}

                object savechange = Word.WdSaveOptions.wdDoNotSaveChanges;
                doc.Close(ref savechange, ref missing, ref missing);
                #endregion

                path = dirRootPath + tempDirName + "\\head.doc";

                doc = cls.Documents.Open
                  (ref path, 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);

                doc.Content.Paragraphs.Last.Range.Paste();


                string bluidPsReportPath = FindOrCreateDir(dirRootPath, "4", this.labID);

                object newpath = bluidPsReportPath + "\\" + DateTime.Now.ToString("yyyy-MM-dd") + this.bulidReportName + ".doc";
                doc.SaveAs(ref newpath, 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);


                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
            finally
            {
                if (doc != null)
                {
                    doc.Close(ref missing, ref missing, ref missing);
                    cls.Quit(ref missing, ref missing, ref missing);
                }
            }
            return true;
        }

问题补充: 这个是在表格数据量为1000行的时候,出现的
yanghao的主页 yanghao | 菜鸟二级 | 园豆:202
提问于:2011-04-10 23:13
< >
分享
所有回答(1)
0

1把这个方法放在backgroundwork执行下看看是不是效果会好点

2Word.Row row = table.Rows[1]; 是1还是i 如果是1的话能否放在循环外面

3object newRow = row;能否把定义newrow放在循环外面,循环内只赋值

4如果把行数减小能否执行成功

死白的man | 园豆:2135 (老鸟四级) | 2011-04-11 10:48
感谢你的回答,我会按这个先优化下,但是觉得这个还不是最关键的因素,这个循环再循环次数较少的情况下能正常运行通过所有的代码,但是如果特别多的话,就有问题了,感觉的当数据量多的时候,这个word是生成了的,但是,没有写入进来,就好像在内存中,就是输出不来一样,跟response的有个属性类似。。。。
支持(0) 反对(0) yanghao | 园豆:202 (菜鸟二级) | 2011-04-11 19:13
一个笨办法 比如可以设置每100行数据,保存一次word
支持(0) 反对(0) 死白的man | 园豆:2135 (老鸟四级) | 2011-04-12 08:49
我最终优化的版本的思路是这样的:先生成html table 并作为html页面保存,然后用word打开生成的html文件,在内部copy,粘贴,即可解决效率问题,因为对html的表格进行生成以及合并单元格的操作比直接操作word的api的时间要少非常多,现在的速度比较满意,生成7-8M的word,共计340多页,累计操作4个表,数据行数共计8000行的样子,生成时间是60秒左右。 希望对以后出现类似问题的朋友有帮助!
支持(0) 反对(0) yanghao | 园豆:202 (菜鸟二级) | 2011-04-15 12:31
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册