关于报表处理大量数据的算法优化

几乎所有的比较大型的项目都会有报表模块,然而报表生成的效率很重要。
我实用的是word生成报表,word做报表提高效率的关键在自动生成表格的时候。插入文字和图片是很快的而且一般的图片和可插入的文字都是很少的。
在这里介绍2种生成表格的方法:
一:用APP下的TABLE对象直接插入
PTable= _Doc.Tables.Add(_Doc.Application.Selection.Range, TableRows, 5, ref Missing, ref Missing);
参数:第一个: 要插入的位置 Selection.Range代表鼠标光标所在的位置,另外大多情况下用在word模版中插入标签的形式获取range 
eg: foreach (Bookmark bm in _Doc.Bookmarks)
                {
                   if (bm.Name == Label)
                    {
                        PBookMarker = bm;
                     PRange = bm.Range;
                        break;
                  }
              }
代码段执行完,即可得到所需标签的range:(标签是事先插入在word模版中)
参数2:表格行数 
参数3:表格列数
参数4,5:不是很清楚。可能是表格默认的样式什么的

填写数据:
比如一个2x2表格
for(int i=1;i<=2;i++)
{
for(int j=1;j<=2;j++)
{
PTable.Cell(i,j).Range.Text ="数据";
}
}
注意:在word中所有索引都是从1开始 不是0

在数据量小的情况下,生成速率还是很快的。不过数据大了画,就会卡死。这样就没办法用了,我调试了一下,主要是在填写数据和插入表格(一行一行插表)时候很慢。是还非常慢。
(给表格增加一行      PTable. Rows.Add(ref prow);    即时改用一次行插入所有行也是很慢)

方法一完全适用数据量比较小的要求。
方法二:

在处理表格时候用HTML标签的 table 生成表格,然后贴如word中 :
缺点:比较麻烦:
优点:效率飞快
关于HTML方法也用2中可用:
第一:
Pdata是HTML字符串(里面只有table表的那部分)
      object DateType = WdPasteDataType.wdPasteHTML; //设置粘贴文本类型
  DataObject clipDO = new DataObject();
                        clipDO.SetData(DataFormats.Html, FormatHtmlString(Pdata.ToString()));
Clipboard.SetDataObject(clipDO, true); //将文本复制到系统剪贴板中
                        object istrue = true;
                   bm.Range.PasteSpecial(ref Missing, ref Missing, ref Missing, ref Missing, ref DateType, ref Missing, ref Missing);


 protected string FormatHtmlString(string html) //将只有table表部分的HTML字符串生成完整的可插入woed中的字符串 关键代码
        {
            StringBuilder sb = new StringBuilder();
            Encoding encoding = Encoding.GetEncoding("utf-8");
            string Header = @"Version: 1.0
                        StartHTML: {0:000000}
                        EndHTML: {1:000000}
                        StartFragment: {2:000000}
                        EndFragment: {3:000000}";
            string HtmlPrefix = @"
!DOCTYPE HTML PUBLIC ""-//W3C//DTD HTML 4.0 Transitional//TR""
html
head
meta http-equiv=Content-Type content=""text/html; charset={0}""
head
body
!--StartFragment--
"; 
            HtmlPrefix = string.Format(HtmlPrefix, encoding.WebName);


            string HtmlSuffix = @"
<!--EndFragment-->
</body>
</html>
";
            int HeaderLength = encoding.GetByteCount(Header);
            HeaderLength -= 16;
            int PrefixLength = encoding.GetByteCount(HtmlPrefix);
            int HtmlLength = encoding.GetByteCount(html);
            int SuffixLength = encoding.GetByteCount(HtmlSuffix);


            int StartHtml = HeaderLength;
            int StartFragment = StartHtml + PrefixLength;
            int EndFragment = StartFragment + HtmlLength;
            int EndHtml = EndFragment + SuffixLength;
            sb.AppendFormat(Header, StartHtml, EndHtml, StartFragment, EndFragment);
            sb.Append(HtmlPrefix);
            sb.Append(html);
            sb.Append(HtmlSuffix);
            return sb.ToString();
        }

这段代码就可以在word中插入表格了:PasteSpecial这个方法插HTML很男用,一不小心就报错了,我折腾了许久,终于成功 不过现在还不可以插入中文(是乱码)。

方法二:
说好不好 说坏不坏 :
跟上面的很类似,不过用的方法不一样 
用的是 插入文件的方式:
bm.Range.InsertFile(SaveAsHtmlFile(Pdata.ToString()), ref Missing, ref Missing, ref Missing, ref Missing);

protected string SaveAsHtmlFile(string Pdata) //根据HTML字符串生成一个HTML文件 比返回他的路径 
        {
            try
            {
                string Path = "C:\\Windows\\temp\\" + DateTime.Now.ToString().Replace("/", "_").Replace(":","_").Trim() + ".html";
                System.IO.File.WriteAllText(Path, Pdata, Encoding.UTF8);
                return Path;
            }
            catch { return ""; }
        }
eg: 下面就是一个Pdata 字符串
<HTML>
<HEAD>
</HEAD>
<BODY>
<TABLE>
<tr>
<td>21</td>
<td>22</td>
</tr>
<tr>
<td>11</td>
<td>12</td>
</tr>
</TABLE>
</BODY>
</HTML>
缺点:中间要保存一次,效率慢了一点
优点:HTML对象很好构建,简单上手,不管怎么说比直接用TABLE快的多了

以上的代码我测试过1万条的数据:35秒左右(PasteSpecial) 
InsertFile 会慢一点  但比TABLE快很多很多

要是你看了以后很晕乎,那就先看点基础教材 我贴个附件
点击打开链接


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值