使用mht格式做多sheet excel報表

本文介绍了一种使用Excel作为模板,并通过C#进行数据填充的方法来快速生成报表。该方法允许用户直接编辑Excel模板,适用于多sheet的情况,简化了开发过程。

用excel做報表是最常用的形式,文員MM們都用熟了,你叫他們看網頁,人家不習慣嘛!沒辦法,只好挖空心思,誰叫我們好呆是個男人呢!

關于使用mime 等方法做excel園子里有很多論述,如http://www.cnblogs.com/birdshome/archive/2005/07/14/mime_excel_sheets.html,他們研究的太仔細.其實我覺得最多的應用過程是:用excel生成模板,用C#處理模板,加入數據.處理的方法大家很多用xsl,比較規則,我覺得直接用文本處理也是可以的:

1、先用excel做好一個模板,當然可是有多sheet,也可以有圖表等,另存為單一網頁格式.mht;

2、找到每個sheet放數據的表格行,如一般是這個樣子:

 

ContractedBlock.gif ExpandedBlockStart.gif Code
 <![if supportMisalignedColumns]>
 
<tr height=3D0 style=3D'display:none'>
  
<td width=3D72 style=3D'width:54pt'></td>
  
<td width=3D72 style=3D'width:54pt'></td>
 
</tr>
 
<![endif]>

 

我們把它做上特殊標記:

 

ContractedBlock.gif ExpandedBlockStart.gif Code
{@
 
<tr height=3D0 style=3D'display:none'>
  
<td width=3D72 style=3D'width:54pt'>{~a~}</td>
  
<td width=3D72 style=3D'width:54pt'>{~b~}</td>
 
</tr>
@}

 

 其中{~a~}中的a表示字段名,到時我們就對應把它替換為數據.

好,寫一個處理函數:

 

ContractedBlock.gif ExpandedBlockStart.gif Code
    public static string ReplaceHeader(DataTable dtHeaderSrc, string text)
    {
        
if (dtHeaderSrc == null)
            
return text;

        text 
= text.Replace("\r\n""__Sys_Blank__"+ " ";

        
string pattern = @"{@(.*?)@}";
        MatchCollection Matches 
= Regex.Matches(text, pattern);
        
if (Matches.Count > 0)
        {
            StringBuilder sbNew 
= new StringBuilder();
            
foreach (Match nextMatch in Matches)//其實只有一個
            {
                
string item = nextMatch.Value;
                
string fname = item.Substring(2, item.Length - 4).Replace("__Sys_Blank__""\r\n");

                
foreach (DataRow dr in dtHeaderSrc.Rows)
                {
                    
string row = fname.ToLower();
                    
foreach (System.Data.DataColumn dc in dtHeaderSrc.Columns)
                    {
                        
string cName = dc.ColumnName.ToLower();
                        row 
= row.Replace("{~" + cName + "~}", dr[cName].ToString());
                    }

                    sbNew.Append(row);

                }

                text 
= text.Replace(item, sbNew.ToString());
            }
        }

        
return text.Replace("__Sys_Blank__""\r\n"); ;

    }

 

原理簡單,就是找到{@模板@}這個東西,把一行一行數據填進去,組裝起來,然後替換.

具體使用,讀出模板數據text,讀出table,調用這個函數就可以把數據插入後寫成以擴展名.xls的文件就行,當然這里以"{@"為其中的一個sheet,其他的sheet可以以其他特殊符號標記,無非是為了找到替換而已.如果有圖表,只用excel打開就會變化,用其他的就不行啦,所以最好做成缺省是excel打開的文件.

這個方法跟birdshome比就是想讓MM直接編輯模板,不能讓我們做模板(多sheet時)做得太累.

覺悟:有時找這個格式,有時找那個格式,發現直接處理文本是最簡單的格式.

 

转载于:https://www.cnblogs.com/wangxiaohuo/archive/2008/09/20/1294777.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值