作一个Excel exporter的组件

在博客园搜索了一下,导出Excel方法。
感觉没有什么价值的东西(收回这句,我又重新用关键字"excel xml导出"搜了一下,发现一些好东西分享)
无非是把datagrid存成excel,或者是建立一个模板,导出一个excel(只讲讲如何用.net来操作excel,网上到处都是)。

.net与excel的结合应用,我自己也写过三篇文章。

a universal class to complete import data from an excel file into a database (垃圾文章)

关于excel在asp.net中使用 (10分给7.5分;实际上是如何建立通用的可配置的,导入Excel数据的解决方案)

利用接口灵活实现Excel导入/到出数据功能 (垃圾文章)

这里言归正传,我下面说说如何建立一个灵活的、可配置的导出数据到Excel的解决方案。

告诉我,你是不是会经常碰到要导出这样的数据格式



aboutexcel_1.jpg

描述一下我们要干什么:
1.支持多表头定义。
2.固定的某格填入固定值
3.有一个数据区
4.某列某行可能要根据某些数据条件插入不同的背景,图片,备注。
甚至还有要求这样的格式

难道我们要每次用代码写,而不能只修改一下配置文件就完成么?


aboutexcel_2.jpg

这都是没有问题的,只要你 明白我的思路发挥一下自己的想像能力就可以作到扩展。
对,扩展,这就是我要强调的内容。

很多的文章的代码,无法帮你扩展,而只能让你去拷贝,这不是我们想要的。

来让我们加快速度来认识一下根据上面要求,扩展的xml文件

aboutexcel_3.jpg

abcd四个地方描述我们的excel会以那种方式,哪个sheet,哪些固定格,哪些列输出哪些内容。
对它建立了数据导出到Excel的对应关系。

cssClass是描述样式类
DBToExceLRelation 是描述总的数据对应关系类(它可能包含多个sheet对应关系)
FixedItem是固定格类
RelationItem是数据区对应类(它是一个可递归类)
SheetMapRelation这是一个excelsheet类(它包含FixedItem,RelationItem,cssClass)
如下图:


aboutexcel_4.jpg


接着来看看我们的导出接口
 1 None.gif using System;
 2 None.gifusing System.Data;
 3 None.gif
 4 None.gifusing excelExporter.Configs;
 5 None.gifusing Excel;
 6 None.gif
 7 None.gif
 8 None.gifnamespace excelExporter.Exporter
 9 None.gif{
10 None.gif    public delegate void OnDataBindHandler(Excel.Range excelRange,DataRow row,String ColumnName);
11 None.gif    ///  < summary >
12 None.gif    /// IConvertor 的摘要说明。
13 None.gif    ///  </ summary >
14 None.gif    public interface IExporter
15 None.gif    {
16 None.gif
17 None.gif        String Execute(System.Data.DataSet ds,DBToExceLRelation dbExcelRealtion,String filePath);
18 None.gif
19 None.gif        
20 None.gif        event OnDataBindHandler OnDataBind;
21 None.gif        
22 None.gif
23 None.gif    }
24 None.gif}
25 None.gif

注意我们申明了一个事件,这样我们就可以处理特殊问题了。
如这些问题
某列某行可能要根据某些数据条件插入不同的背景,图片,备注。

下面是创建excel的一部分代码,这里完成了创建固定格,创建表头,创建数据区的。
 1 None.gif protected   virtual   void  CreateExcel()
 2 ExpandedBlockStart.gifContractedBlock.gif         dot.gif {
 3InBlock.gif
 4InBlock.gif
 5InBlock.gif            try
 6ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
 7InBlock.gif                app = new  Excel.ApplicationClass();
 8ExpandedSubBlockEnd.gif            }

 9InBlock.gif            catch(System.Exception ex)
10ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
11InBlock.gif                throw new Exception("无法实例化Excel对象;<br/>details:<hr size=1/>"+ex.Message);
12ExpandedSubBlockEnd.gif            }

13InBlock.gif            app.DisplayAlerts = false;
14InBlock.gif
15InBlock.gif            //            //app.UserControl = true;
16InBlock.gif            wbs = app.Workbooks;
17InBlock.gif            int NowSheet =0;
18InBlock.gif            try
19ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
20InBlock.gif                
21InBlock.gif                //wbc  = wbs.Open(_filepath,_objOpt,_objOpt,_objOpt,_objOpt,_objOpt,_objOpt,_objOpt,_objOpt,_objOpt,_objOpt,_objOpt,_objOpt,_objOpt,_objOpt);    
22InBlock.gif                wbc = wbs.Add(_objOpt);
23InBlock.gif                for(int sheetIndex=0;sheetIndex<this._dbrelation.sheets.Length;sheetIndex++)
24ExpandedSubBlockStart.gifContractedSubBlock.gif                dot.gif{
25InBlock.gif
26InBlock.gif                    SheetMapRelation sheetmapR = _dbrelation.sheets[sheetIndex];
27InBlock.gif                    NowSheet = sheetIndex+1;
28InBlock.gif                    
29InBlock.gif                    if(sheetmapR.SheetName!="")
30ExpandedSubBlockStart.gifContractedSubBlock.gif                    dot.gif{
31InBlock.gif                        wbc.Windows[NowSheet].Zoom = sheetmapR.WindowZomm;
32InBlock.gif                        //wbc.Windows[NowSheet].
33InBlock.gif                        ws= (Excel.Worksheet)wbc.Worksheets.get_Item(NowSheet);
34InBlock.gif                        ws.Name = sheetmapR.SheetName;
35InBlock.gif                        if(Convert.ToBoolean(ws.Cells.Select()))
36ExpandedSubBlockStart.gifContractedSubBlock.gif                        dot.gif{
37InBlock.gif                            
38InBlock.gif                            Excel.Range allrange =  (Excel.Range)wbc.Windows[NowSheet].Selection;
39InBlock.gif                            allrange.Font.ColorIndex = _dbrelation.DataCss.FontColorIndex;
40InBlock.gif                            allrange.Font.Name = _dbrelation.DataCss.FontName;
41InBlock.gif                            allrange.Font.Size  =  _dbrelation.DataCss.FontSize;
42InBlock.gif                            
43ExpandedSubBlockEnd.gif                        }

44InBlock.gif
45InBlock.gif                    
46InBlock.gif
47InBlock.gif                        firstRange = ws.get_Range(sheetmapR.DataStartRange.Trim().ToUpper(),this._objOpt);
48InBlock.gif                        //取消全部选中
49InBlock.gif                        firstRange.Select();
50InBlock.gif
51InBlock.gif
52ExpandedSubBlockStart.gifContractedSubBlock.gif                        /**////创建固定格
53InBlock.gif                        CreateFixedRange(sheetmapR.FixedItems);
54ExpandedSubBlockStart.gifContractedSubBlock.gif                        /**////创建表头
55InBlock.gif                        CreateTitle(sheetmapR.Items,sheetmapR.MaxDepth,firstRange,0);
56InBlock.gif
57InBlock.gif                        Excel.Range datastartrange = firstRange.get_Offset(sheetmapR.MaxDepth,_objOpt);
58InBlock.gif                        if(_ds!=null&&_ds.Tables[sheetIndex]!=null)
59ExpandedSubBlockStart.gifContractedSubBlock.gif                            CreateDataRange(datastartrange,sheetmapR,_ds.Tables[sheetIndex]);/**////创建数据区
60ExpandedSubBlockEnd.gif                    }

61ExpandedSubBlockEnd.gif                }

62InBlock.gif
63InBlock.gif                 _fileName = System.DateTime.Now.ToString("yy_MM_dd-hh_mm_ss_ff")+".xls";
64InBlock.gif                String tempName = _filepath+"/" +_fileName;
65InBlock.gif                wbc.SaveAs(tempName,_objOpt,_objOpt,_objOpt,_objOpt,_objOpt,Excel.XlSaveAsAccessMode.xlExclusive,_objOpt,_objOpt,_objOpt,_objOpt,_objOpt);
66InBlock.gif
67InBlock.gif        
68ExpandedSubBlockEnd.gif            }

69InBlock.gif            catch(System.Exception ex)
70ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
71InBlock.gif                throw new Exception("无法正确创建Excel文件;<br/>details:<hr size=1/>"+"创建第 "+NowSheet.ToString() +" sheet:"+ex.Message);
72ExpandedSubBlockEnd.gif            }

73InBlock.gif            finally
74ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
75InBlock.gif                this.Dispose();
76ExpandedSubBlockEnd.gif            }

77ExpandedBlockEnd.gif        }

其中创建多表头是一个难点,我已经在blog上谈过几次,
这篇文章说了说基础:多表头的两个东西,宽度,深度。
http://www.cnblogs.com/king_astar/archive/2005/05/11/153071.html

最后调用如下,


None.gif DBToExceLRelation dbt  =   new  DBToExceLRelation();
None.gif            dbt 
=  dbt.deserialize(Server.MapPath( " excelexpoetertest.xml " ));
None.gif
None.gif            BaseExporter b 
=   new  BaseExporter();
None.gif            String filename 
=  b.Execute(dt.DataSet,dbt,Server.MapPath( " ./excels " ));


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值