【茗洋AaronYang】MyNPOI V1.2發布並開放源碼,讓.NET Excel導出將簡單進行到底


 

首先謝謝大家來到這里支持我!

 

MyNPOI是我花了5個下班的晚上寫的,但還有很多不完善的地方。我特將我辛辛苦苦寫的源碼奉上,希望大家能將它補充,在未來能夠分享。一直秉着技術應該分享出去,所以如果你在MyNPOI源碼的基礎上進行的任何修改如果進行了商業交易,則違反了MyNPOI的分享原則,我有權進行追究。MyNPOI在修改源碼時候,必須加上我的博客園昵稱 AaronYang,表示對我的支持,謝謝大家的合作。MyNPOI的版權和NPOI一致,再次聲明。

 

 

目錄 (Catalog) 

一、簡介

二、更新說明

三、用法

         (一)  下載MyNPOI.dll

         (二)  DEMO下載 : 卷一       卷二       兩個下載完了,一起解壓

四、我們開始GO

       (一)代碼寫的基本流程

       (二)第一課  Demo ,基本課程

                     (一)一級表頭

                                 統一寬度和font屬性演示
                                 關於其他屬性演示

                     (二)多級表頭

                                  二級表頭

                                  三級表頭

 

       (三)第二課  設置Excel屬性

       (四)第三課 分組Excel導出

     (五)第四課  表頭定義技巧

       (六)第五課  在ASP.NET中的使用

       (七)第六課  在ASP.NET MVC中的使用

       (八)第七課  公開了的一些其他輔助方法

五 附錄一

       附錄二

六、 MyNPOI源代碼下載

      (使用源碼和修改源碼,請保留聲明我的 博客園昵稱和地址,表示支持)

 

 

        

 

 

 

 

 

 

 

 

 

 

 

 

簡介(Introduction)

MyNPOI是 AaronYang(茗洋)基於開源Excel導出的組件NPOI二次封裝,使得.net方向 Excel操作更加簡單的一個類庫。它不是重寫NOPI,對NOPI的源碼進行改寫,這里保留NPOI的版權聲明。最低框架使用.net framework4.0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

更新說明(Update History)

  MyNPOI v1.2 (偏向於Excel導出):

       (一)輕松支持表頭JSON設計,可以把JSON放在文件里(表頭模版只是個字符串),更小的excel模版,

                  1. 邊框,字體屬性,背景顏色,寬高,復雜表頭等

                  2. 更多 具體請參照附錄(一)

       (二)基於NPOI,服務器免裝Office軟件,避免版權糾紛,性能更加優越

       (三)輕松 支持本地導出存儲,支持Web導出下載,自定義列Lambda風格定義導出

       (四)輕松支持 分組導出,思想跟EasyUI的datagrid分組一樣

       (五)輕松支持設置 Excel 屬性,第二個Excel身份信息

       (六)開放本地導出接口和Web下載接口

                 1.測試使用環境:桌面本地存儲:Winfrom

                                          Web導出下載:ASP.NET,ASP.NET MVC

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

用法(Usage)

前提:下載所需類庫

          使用Visual Studio 2010

          電腦安裝 .NET Framework4.0

 

基本使用

我們建立Winform程序, 並引用 MyNPOI類庫

添加一個測試實體類,我們以學校的考試的記錄為例子

學生ID,學生姓名,考試時間,各科成績,總分,這幾個屬性來說明和演示MyNPOI的使用

實體類如下:

public  class ExamEntity
    {
        public int Id { get; set; }
        /// <summary>
        /// 學生姓名
        /// </summary>
        public string Name { get; set; }
        public bool Sex { get; set; }
        /// <summary>
        /// 考試時間,每次考試時間
        /// </summary>
        public DateTime ExamTime { get; set; }
        /*各科成績,語數英 物化生*/
        public int Chinese { get; set; }
        public int English { get; set; }
        public int Math { get; set; }
        public int Wuli { get; set; }
        public int HuaXue { get; set; }
        public int ShengWu { get; set; }
        /// <summary>
        /// 總分
        /// </summary>
        public int SumCount { get; set; }
 
    }

表頭基本模版如下:

{ 'root':{'rowspan':1,'sheetname':'學生成績統計','defaultwidth':12,'defaultheight':55,'head':[  {
                                                                      'title':'排序',
                                                                      'cellregion':'0,0,0,0'
                                                                   },{
                                                                      'title':'二列',
                                                                      'cellregion':'0,0,0,0'
                                                                   }, {
                                                                      'title':'三列',
                                                                      'cellregion':'0,0,0,0'
                                                                   } ]
                                                                }
                                                               }

 

 

 

 

 

 

 

 

 

 

 

 

 

我們開始GO

 

 

代碼寫的基本流程:

First:定義表頭JSON,如果拼接麻煩,可在string類加入特殊字符,例如 [$HeadTitle],然后調用string的replace方法替換字符

Second:處理好數據源(表身數據)

Third:可選:建立分組集合,或者設置Excel屬性

Fourth:開始導出(選擇Web,還是本地存儲)

 

關於JSON表頭的cellRegion屬性講解,理解它才能定義好合並表頭,不采用轉換,原因 原生NPOI也是這種表頭設計思想,如果設定了,則在MyNPOI處理的時候,會多了很多性能的損失,所以直接采用數字。NPOI也是數字,加入MyNPOI滿足不了你的需求,你可以用NPOI原生的去寫,到時也會去寫了

 

首先我們要在表格里面畫出基本的位置圖,然后合並等問題才好寫,如果你的上面的數字自己會標了,你的cellregion才不會設置錯

image

這里我局二級表頭的例子

二級表頭例子的  要顯示的第一列 合並了第一第二行,以左上角的位置,也就是第一行,第一列,列的索引是0,所以這里就是0

同理1,然后就是第一行合並三個,根據,0,1,然后下個是2,所以是2,

image

繼續寫,同行的就是3,4,5,6,7,所以上面一行表面是2,但是它跨了6格到7,所以他的下一個合並就是8,同理標示數字

關於cellregion的設置理解起來還是有難度的

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

第一課  Demo ,基本課程

 

一級表頭

最終導出效果:

 

 

代碼如下:

定義一個數據源,這里不使用數據庫

  public List<ExamEntity> exam = new List<ExamEntity> { 
          new ExamEntity{Id=1,Name="張三",ExamTime=Convert.ToDateTime("2013-03-01 08:30:00"),Chinese=122,English=111,Math=90,Wuli=50,HuaXue=80,ShengWu=40,SumCount=493},
          new ExamEntity{Id=1,Name="張三",ExamTime=Convert.ToDateTime("2013-04-01 08:30:00"),Chinese=109,English=100,Math=100,Wuli=90,HuaXue=70,ShengWu=60,SumCount=529},
          new ExamEntity{Id=1,Name="張三",ExamTime=Convert.ToDateTime("2013-05-01 08:30:00"),Chinese=109,English=100,Math=100,Wuli=90,HuaXue=70,ShengWu=60,SumCount=529},
           new ExamEntity{Id=2,Name="李四",ExamTime=Convert.ToDateTime("2013-03-01 08:30:00"),Chinese=122,English=111,Math=90,Wuli=50,HuaXue=80,ShengWu=40,SumCount=493},
          new ExamEntity{Id=2,Name="李四",ExamTime=Convert.ToDateTime("2013-04-01 08:30:00"),Chinese=109,English=100,Math=100,Wuli=90,HuaXue=70,ShengWu=60,SumCount=529},
          new ExamEntity{Id=2,Name="李四",ExamTime=Convert.ToDateTime("2013-05-01 08:30:00"),Chinese=109,English=100,Math=100,Wuli=90,HuaXue=70,ShengWu=60,SumCount=529},
          new ExamEntity{Id=3,Name="王五",ExamTime=Convert.ToDateTime("2013-03-01 08:30:00"),Chinese=122,English=111,Math=90,Wuli=50,HuaXue=80,ShengWu=40,SumCount=493},
          new ExamEntity{Id=3,Name="王五",ExamTime=Convert.ToDateTime("2013-04-01 08:30:00"),Chinese=109,English=100,Math=100,Wuli=90,HuaXue=70,ShengWu=60,SumCount=529},
          new ExamEntity{Id=4,Name="陳流",ExamTime=Convert.ToDateTime("2013-05-01 08:30:00"),Chinese=109,English=100,Math=100,Wuli=90,HuaXue=70,ShengWu=60,SumCount=529}
        };

 

定義表頭JSON

 string jsonhead = @"{ 'root':{'rowspan':1,'sheetname':'學生成績','defaultwidth':12,'defaultheight':55,'head':[ {
                                                                      'title':'編號',
                                                                      'cellregion':'0,0,0,0'
                                                                   },
                                                                  {
                                                                      'title':'學生姓名',
                                                                      'cellregion':'0,0,1,1'
                                                                 },
                                                                    {
                                                                      'title':'性別',
                                                                      'cellregion':'0,0,2,2'
                                                                 }, {
                                                                      'title':'考試時間',
                                                                      'cellregion':'0,0,3,3'
                                                                 }, {
                                                                      'title':'語文',
                                                                      'cellregion':'0,0,4,4'
                                                                 }, {
                                                                      'title':'數學',
                                                                      'cellregion':'0,0,5,5'
                                                                 }, {
                                                                      'title':'英語',
                                                                      'cellregion':'0,0,6,6'
                                                                 }, {
                                                                      'title':'物理',
                                                                      'cellregion':'0,0,7,7'
                                                                 }, {
                                                                      'title':'化學',
                                                                      'cellregion':'0,0,8,8'
                                                                 }, {
                                                                      'title':'生物',
                                                                      'cellregion':'0,0,9,9'
                                                                 }, {
                                                                      'title':'總分',
                                                                      'cellregion':'0,0,10,10'
                                                                 }
                                                                    ]
                                                                }
                                                               }";

導出:

   new ExportBuilder<ExamEntity>().Column(a => a.Id.ToString())
                                                                        .Column(a => a.Name)
                                                                        .Column(x => x.Sex ? "男" : "女")
                                                                       .Column(a => a.ExamTime.ToString("yyyy-MM-dd"))
                                                                       .Column(a => a.Chinese.ToString())
                                                                       .Column(a => a.Math.ToString())
                                                                       .Column(a => a.English.ToString())
                                                                       .Column(a => a.Wuli.ToString())
                                                                       .Column(a => a.HuaXue.ToString())
                                                                       .Column(a => a.ShengWu.ToString())
                                                                       .Column(a => a.SumCount.ToString())
                                                                       .ExportToLocal(exam, "c:\\test" + new Random().Next(100000) + ".xls", rtxJson.Text);

 

說明一下:

這里的Column 注意順序要和 json中對的上,你Column了幾個,就導出了幾個

Column必須是個string的值,你可以在里面放個lambda 二次處理

 

ExportToLocal(數據源,文件要存儲的路徑,表頭JSON格式的字符串)

就可以本地存儲了

 

順便演示下表頭的JSON改變后的效果如下:

高度和寬度設置,defaultwidth設置后,width不生效,defaultheight設置了,height不生效。defaultheight感覺沒用,建議不用了。因為表頭的搞完全可以直接由某個單元格的高度決定,建議設置一個cell中的height就夠了。width可以試試

 

 

 

 

 

 

 

 

 

 

 

 

 

統一寬度和font屬性演示:

 

 

 

 

 

 

 

 

 

關於其他屬性演示

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2.  多級表頭

他們只是個表頭的JSON不一樣,重點是要理解 cellregion這個屬性,這里我只貼JSON代碼了

最終導出效果:

  

 

 

代碼如下:

二級的JSON格式的字符串

{ 'root':{'rowspan':2,'sheetname':'學生成績','defaultwidth':12,'head':[ {
                                                                      'title':'編號',
                                                                       'height':30,
                                                                      'cellregion':'0,1,0,0'
                                                                   },
                                                                  {
                                                                      'title':'學生姓名',
                                                                      'cellregion':'0,1,1,1'
                                                                 },
                                                                    {
                                                                      'title':'性別',
                                                                      'cellregion':'0,1,2,2'
                                                                 }, {
                                                                      'title':'考試時間',
                                                                      'cellregion':'0,1,3,3'
                                                                 }, {
                                                                      'title':'主科目',
                                                                      'cellregion':'0,0,4,6'
                                                                 }, {
                                                                      'title':'副科目',
                                                                      'cellregion':'0,0,7,9'
                                                                 }, 
                                                                {
                                                                      'title':'語文',
                                                                      'height':35,  
                                                                      'cellregion':'1,1,4,4'
                                                                 }, {
                                                                      'title':'數學',
                                                                      'cellregion':'1,1,5,5'
                                                                 }, {
                                                                      'title':'英語',
                                                                      'cellregion':'1,1,6,6'
                                                                 }, {
                                                                      'title':'物理',
                                                                      'cellregion':'1,1,7,7'
                                                                 }, {
                                                                      'title':'化學',
                                                                      'cellregion':'1,1,8,8'
                                                                 }, {
                                                                      'title':'生物',
                                                                      'cellregion':'1,1,9,9'
                                                                 }, {
                                                                      'title':'總分',
                                                                      'cellregion':'0,1,10,10'
                                                                 }
                                                                    ]
                                                                }
                                                               }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

三級表頭例子:

最終效果:

 

三級表頭 JSON設計

{ 'root':{'rowspan':3,'sheetname':'學生成績','defaultwidth':12,'head':[ {
                                                                       'title':'編號',
                                                                       'height':54,
                                                                      'cellregion':'0,2,0,0'
                                                                   },
                                                                  {
                                                                      'title':'學生姓名',
                                                                      'cellregion':'0,2,1,1'
                                                                 },
                                                                    {
                                                                      'title':'性別',
                                                                      'cellregion':'0,2,2,2'
                                                                 }, {
                                                                      'title':'考試時間',
                                                                      'cellregion':'0,2,3,3'
                                                                 }, {
                                                                      'title':'主科目',
 'height':18,
                                                                      'cellregion':'0,0,4,6'
                                                                 }, {
                                                                      'title':'副科目',
                                                                      'cellregion':'0,1,7,9'
                                                                 }, 
                                                                     {
                                                                      'title':'必修課',
                                                                    'height':18,
                                                                      'cellregion':'1,1,4,5'
                                                                 }, {
                                                                      'title':'選修課',
                                                                      'cellregion':'1,1,6,6'
                                                                 }, 
                                                                {
                                                                      'title':'語文',
                                                                      'height':18,  
                                                                      'cellregion':'2,2,4,4'
                                                                 }, {
                                                                      'title':'數學',
                                                                      'cellregion':'2,2,5,5'
                                                                 }, {
                                                                      'title':'英語',
                                                                      'cellregion':'2,2,6,6'
                                                                 }, {
                                                                      'title':'物理',
                                                                      'cellregion':'2,2,7,7'
                                                                 }, {
                                                                      'title':'化學',
                                                                      'cellregion':'2,2,8,8'
                                                                 }, {
                                                                      'title':'生物',
                                                                      'cellregion':'2,2,9,9'
                                                                 }, {
                                                                      'title':'總分',
                                                                      'cellregion':'0,2,10,10'
                                                                 }
                                                                    ]
                                                                }
                                                               }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

第二課  設置Excel屬性

 

首先定義一個ExcelProperty屬性,這是我封裝好的,以后可能再去拓展屬性,現在我只寫了10個,我也提供了一個構造函數

   ExcelProperty ep = new ExcelProperty();
            ep.LastAuthor = "楊洋最后修改人";
            ep.Author = "楊洋作者";
            ep.Company = "AaronYang工作室";
            ep.Subject = "MyNPOIV1.2導出測試";
            ep.Comments = "今天是2013年6月2日18:19:39";
            ep.ApplicationName = "MyNPOI測試";
            ep.Title = "學生成績統計";
            ep.KeyWord = "報表  學生成績";
            ep.Catagory = "學生成績";
            ep.Manager = "楊洋管理者";

 

默認說明:

        /// <param name="company">公司名稱 默認AaronYang</param>
        /// <param name="author">作者信息,默認 楊洋</param>
        /// <param name="ApplicationName">創建程序信息</param>
        /// <param name="LastAuthor">xls文件最后保存者信息</param>
        /// <param name="Comments">填加xls文件作者信息,備注</param>
        /// <param name="title">填加xls文件標題信息</param>
        /// <param name="Subject">填加文件主題信息</param>
        /// <param name="keyWord">關鍵詞</param>
        /// <param name="catagory">類別</param>
        /// <param name="manager">管理者</param>

使用:

在導出之前,使用SetExcelProperty方法

 

SetExcelProperty(ExcelProperty對象) 設置文件屬性

 

效果如下:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

第三課  分組Excel導出

 

效果圖:

 

代碼:

    在導出之前首先將數據源按某類降序或者升序,保證數據也是分組狀的

      我們使用最終要導出的 重載方法

     ExportToLocal(數據源,文件要存儲的路徑,表頭JSON格式的字符串,分組數量集合,受影響列的索引)     

 

 

    

整體代碼如下:(我把數據源的數據調整了一下,不過不礙事)

//1 . 處理數據源
                List<ExamEntity> exams = exam.OrderByDescending(x => x.Name).ThenByDescending(x=>x.ExamTime).ToList<ExamEntity>();
 
                //2. 每組的數量
                List<GroupClass> group = (from p in exams
                                          group p by p.Name  into g
                                       select new GroupClass
                                       {
                                           groupCount = g.Count()
                                       }).ToList<GroupClass>();
 
                //3. 設置要分組的列的索引,從剛開始,姓名列,在1處
                int columnIndex=1;
                //3. 導出
                new ExportBuilder<ExamEntity>().Column(a => a.Id.ToString()).Column(a => a.Name)
                                                                          .Column(x => x.Sex ? "男" : "女")
                                                                         .Column(a => a.ExamTime.ToString("yyyy-MM-dd"))
                                                                         .Column(a => a.Chinese.ToString())
                                                                         .Column(a => a.Math.ToString())
                                                                         .Column(a => a.English.ToString())
                                                                         .Column(a => a.Wuli.ToString())
                                                                         .Column(a => a.HuaXue.ToString())
                                                                         .Column(a => a.ShengWu.ToString())
                                                                         .Column(a => a.SumCount.ToString())
                                                                         .ExportToLocal(exams, "c:\\test" + new Random().Next(100000) + ".xls", rtxJson.Text, group, columnIndex);

這里的 ExportToLocal(處理后的數據源,….)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

第四課  表頭定義技巧

 

有時候,我們的sheetName不固定,或者在表頭之上還有總標題(如例子,2013年2月至…成績表這個標題),里面的內容也不固定,拼寫JSON有些麻煩,我們可以這樣做

如下需求

 

至於表標題也看做是一列 表頭的一部分,這里本來表頭是3個的,現在就是4了,只不過第一個單元格是合並的而已

里面的文字,JSON中我們定義[$Title]為表標題,[$SheetName]定義sheetname

則JSON定義我們可以這樣寫

 

  string jsonhead = @"{ 'root':{'rowspan':4,'sheetname':'[$sheetName]','defaultwidth':12,'head':[ 
                                                                   {
                                                                       'title':'[$Title]',
                                                                       'height':34,
                                                                        'bgcolor':'#ffffff',
                                                                        'cellregion':'0,0,0,10'
                                                                   },
                                                                        {
                                                                       'title':'編號',
                                                                       'height':54,
                                                                      'cellregion':'1,3,0,0'
                                                                   },
                                                                  {
                                                                      'title':'學生姓名',
                                                                      'cellregion':'1,3,1,1'
                                                                 },
                                                                    {
                                                                      'title':'性別',
                                                                      'cellregion':'1,3,2,2'
                                                                 }, {
                                                                      'title':'考試時間',
                                                                      'cellregion':'1,3,3,3'
                                                                 }, {
                                                                      'title':'主科目',
                                                                      'height':18,
                                                                      'cellregion':'1,1,4,6'
                                                                 }, {
                                                                      'title':'副科目',
                                                                      'cellregion':'1,2,7,9'
                                                                 }, 
                                                                     {
                                                                      'title':'必修課',
                                                                      'height':18,
                                                                      'cellregion':'2,2,4,5'
                                                                 }, {
                                                                      'title':'選修課',
                                                                      'cellregion':'2,2,6,6'
                                                                 }, 
                                                                {
                                                                      'title':'語文',
                                                                      'height':18,  
                                                                      'cellregion':'3,3,4,4'
                                                                 }, {
                                                                      'title':'數學',
                                                                      'cellregion':'3,3,5,5'
                                                                 }, {
                                                                      'title':'英語',
                                                                      'cellregion':'3,3,6,6'
                                                                 }, {
                                                                      'title':'物理',
                                                                      'cellregion':'3,3,7,7'
                                                                 }, {
                                                                      'title':'化學',
                                                                      'cellregion':'3,3,8,8'
                                                                 }, {
                                                                      'title':'生物',
                                                                      'cellregion':'3,3,9,9'
                                                                 }, {
                                                                      'title':'總分',
                                                                      'cellregion':'1,3,10,10'
                                                                 }
                                                                    ]
                                                                }
                                                               }";
            string title = "2013年2月至5月 AaronYang學院學生成績表";
            jsonhead = jsonhead.Replace(@"[$Title]", title).Replace(@"[$sheetName]", title);

 

其他代碼跟上一個例子一樣

效果圖:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

第五課  在ASP.NET中的使用

 

1.基本使用 參照 第一課到第四課

2.導出后下載,唯一跟存儲到本地不一樣的就是使用Export方法,然后傳入參數,就可以直接下載了,非常方便簡單。

    

   ①新建ASP.NET項目,然后在Default.aspx頁面上拖一個按鈕,雙擊,我們在后台的代碼如下:

     

 

②引用MyNPOI,我們可以直接復制第一課中的代碼,只需將最后的ExportToLocal改成Export就可以了,具體用法和ExportToLocal一樣,分 分組導出和不分組導出

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using MyNPOI.Excel;
 
namespace WebTest
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
 
        }
 
        public List<ExamEntity> exam = new List<ExamEntity> { 
          new ExamEntity{Id=1,Name="張三",ExamTime=Convert.ToDateTime("2013-03-01 08:30:00"),Chinese=33,English=33,Math=33,Wuli=33,HuaXue=33,ShengWu=33,SumCount=333},
          new ExamEntity{Id=1,Name="張三",ExamTime=Convert.ToDateTime("2013-04-01 08:30:00"),Chinese=34,English=34,Math=34,Wuli=34,HuaXue=34,ShengWu=34,SumCount=34},
          new ExamEntity{Id=1,Name="張三",ExamTime=Convert.ToDateTime("2013-05-01 08:30:00"),Chinese=35,English=35,Math=35,Wuli=35,HuaXue=35,ShengWu=35,SumCount=35},
           new ExamEntity{Id=2,Name="李四",ExamTime=Convert.ToDateTime("2013-03-01 08:30:00"),Chinese=43,English=43,Math=43,Wuli=43,HuaXue=43,ShengWu=43,SumCount=43},
          new ExamEntity{Id=2,Name="李四",ExamTime=Convert.ToDateTime("2013-04-01 08:30:00"),Chinese=44,English=44,Math=44,Wuli=44,HuaXue=44,ShengWu=44,SumCount=44},
          new ExamEntity{Id=2,Name="李四",ExamTime=Convert.ToDateTime("2013-05-01 08:30:00"),Chinese=45,English=45,Math=45,Wuli=45,HuaXue=45,ShengWu=45,SumCount=45},
          new ExamEntity{Id=2,Name="李四",ExamTime=Convert.ToDateTime("2013-02-01 08:30:00"),Chinese=25,English=25,Math=25,Wuli=25,HuaXue=25,ShengWu=25,SumCount=25},
          new ExamEntity{Id=3,Name="王五",ExamTime=Convert.ToDateTime("2013-03-01 08:30:00"),Chinese=53,English=53,Math=53,Wuli=53,HuaXue=53,ShengWu=53,SumCount=53},
          new ExamEntity{Id=3,Name="王五",ExamTime=Convert.ToDateTime("2013-04-01 08:30:00"),Chinese=54,English=54,Math=54,Wuli=54,HuaXue=54,ShengWu=54,SumCount=54},
          new ExamEntity{Id=4,Name="陳六",ExamTime=Convert.ToDateTime("2013-05-01 08:30:00"),Chinese=65,English=65,Math=65,Wuli=65,HuaXue=65,ShengWu=65,SumCount=65}
        };
        protected void Button1_Click(object sender, EventArgs e)
        {
            string jsonhead = @"{ 'root':{'rowspan':1,'sheetname':'學生成績','defaultwidth':12,'defaultheight':55,'head':[ {
                                                                      'title':'編號',
                                                                      'cellregion':'0,0,0,0'
                                                                   },
                                                                  {
                                                                      'title':'學生姓名',
                                                                      'cellregion':'0,0,1,1'
                                                                 },
                                                                    {
                                                                      'title':'性別',
                                                                      'cellregion':'0,0,2,2'
                                                                 }, {
                                                                      'title':'考試時間',
                                                                      'cellregion':'0,0,3,3'
                                                                 }, {
                                                                      'title':'語文',
                                                                      'cellregion':'0,0,4,4'
                                                                 }, {
                                                                      'title':'數學',
                                                                      'cellregion':'0,0,5,5'
                                                                 }, {
                                                                      'title':'英語',
                                                                      'cellregion':'0,0,6,6'
                                                                 }, {
                                                                      'title':'物理',
                                                                      'cellregion':'0,0,7,7'
                                                                 }, {
                                                                      'title':'化學',
                                                                      'cellregion':'0,0,8,8'
                                                                 }, {
                                                                      'title':'生物',
                                                                      'cellregion':'0,0,9,9'
                                                                 }, {
                                                                      'title':'總分',
                                                                      'cellregion':'0,0,10,10'
                                                                 }
                                                                    ]
                                                                }
                                                               }";
            new ExportBuilder<ExamEntity>().Column(a => a.Id.ToString())
                                                                      .Column(a => a.Name)
                                                                      .Column(x => x.Sex ? "男" : "女")
                                                                     .Column(a => a.ExamTime.ToString("yyyy-MM-dd"))
                                                                     .Column(a => a.Chinese.ToString())
                                                                     .Column(a => a.Math.ToString())
                                                                     .Column(a => a.English.ToString())
                                                                     .Column(a => a.Wuli.ToString())
                                                                     .Column(a => a.HuaXue.ToString())
                                                                     .Column(a => a.ShengWu.ToString())
                                                                     .Column(a => a.SumCount.ToString())
                                                                     .Export(exam, "學生成績第" + new Random().Next(100000) + "份導出.xls", jsonhead);
        }
    }
}

效果圖:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

第六課  在ASP.NET MVC中的使用

 

①新建ASP.NET MVC項目

 

② 使用默認的HomeController,在進入Index action對應的 Index view

③ 添加一個a 超鏈接html標簽,綁定一個JavaScript單擊事件

 

單擊事件代碼如下:

<script type="text/javascript">
    function ExportExcel() {
        top.location.href = "/Home/ExcelExport";
    }
</script>

然后我們在HomeController中添加對應的 ExcelExport action,在Model文件夾下添加ExamEntity實體,Controller中添加數據源

這些步驟我就不寫了

代碼如下:ExcelExport 中的代碼和 在ASP.NET中演示的一模一樣就行了

寫完HomeController中代碼如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MVCWeb.Models;
using MyNPOI.Excel;
 
namespace MVCWeb.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            ViewBag.Message = "Modify this template to jump-start your ASP.NET MVC application.";
 
            return View();
        }
 
        public ActionResult About()
        {
            ViewBag.Message = "Your app description page.";
 
            return View();
        }
 
        public ActionResult Contact()
        {
            ViewBag.Message = "Your contact page.";
 
            return View();
        }
        public List<ExamEntity> exam = new List<ExamEntity> { 
          new ExamEntity{Id=1,Name="張三",ExamTime=Convert.ToDateTime("2013-03-01 08:30:00"),Chinese=33,English=33,Math=33,Wuli=33,HuaXue=33,ShengWu=33,SumCount=333},
          new ExamEntity{Id=1,Name="張三",ExamTime=Convert.ToDateTime("2013-04-01 08:30:00"),Chinese=34,English=34,Math=34,Wuli=34,HuaXue=34,ShengWu=34,SumCount=34},
          new ExamEntity{Id=1,Name="張三",ExamTime=Convert.ToDateTime("2013-05-01 08:30:00"),Chinese=35,English=35,Math=35,Wuli=35,HuaXue=35,ShengWu=35,SumCount=35},
           new ExamEntity{Id=2,Name="李四",ExamTime=Convert.ToDateTime("2013-03-01 08:30:00"),Chinese=43,English=43,Math=43,Wuli=43,HuaXue=43,ShengWu=43,SumCount=43},
          new ExamEntity{Id=2,Name="李四",ExamTime=Convert.ToDateTime("2013-04-01 08:30:00"),Chinese=44,English=44,Math=44,Wuli=44,HuaXue=44,ShengWu=44,SumCount=44},
          new ExamEntity{Id=2,Name="李四",ExamTime=Convert.ToDateTime("2013-05-01 08:30:00"),Chinese=45,English=45,Math=45,Wuli=45,HuaXue=45,ShengWu=45,SumCount=45},
          new ExamEntity{Id=2,Name="李四",ExamTime=Convert.ToDateTime("2013-02-01 08:30:00"),Chinese=25,English=25,Math=25,Wuli=25,HuaXue=25,ShengWu=25,SumCount=25},
          new ExamEntity{Id=3,Name="王五",ExamTime=Convert.ToDateTime("2013-03-01 08:30:00"),Chinese=53,English=53,Math=53,Wuli=53,HuaXue=53,ShengWu=53,SumCount=53},
          new ExamEntity{Id=3,Name="王五",ExamTime=Convert.ToDateTime("2013-04-01 08:30:00"),Chinese=54,English=54,Math=54,Wuli=54,HuaXue=54,ShengWu=54,SumCount=54},
          new ExamEntity{Id=4,Name="陳六",ExamTime=Convert.ToDateTime("2013-05-01 08:30:00"),Chinese=65,English=65,Math=65,Wuli=65,HuaXue=65,ShengWu=65,SumCount=65}
        };
        
        public ActionResult ExcelExport()
        {
            //導出代碼
            string jsonhead = @"{ 'root':{'rowspan':1,'sheetname':'學生成績','defaultwidth':12,'defaultheight':55,'head':[ {
                                                                      'title':'編號',
                                                                      'cellregion':'0,0,0,0'
                                                                   },
                                                                  {
                                                                      'title':'學生姓名',
                                                                      'cellregion':'0,0,1,1'
                                                                 },
                                                                    {
                                                                      'title':'性別',
                                                                      'cellregion':'0,0,2,2'
                                                                 }, {
                                                                      'title':'考試時間',
                                                                      'cellregion':'0,0,3,3'
                                                                 }, {
                                                                      'title':'語文',
                                                                      'cellregion':'0,0,4,4'
                                                                 }, {
                                                                      'title':'數學',
                                                                      'cellregion':'0,0,5,5'
                                                                 }, {
                                                                      'title':'英語',
                                                                      'cellregion':'0,0,6,6'
                                                                 }, {
                                                                      'title':'物理',
                                                                      'cellregion':'0,0,7,7'
                                                                 }, {
                                                                      'title':'化學',
                                                                      'cellregion':'0,0,8,8'
                                                                 }, {
                                                                      'title':'生物',
                                                                      'cellregion':'0,0,9,9'
                                                                 }, {
                                                                      'title':'總分',
                                                                      'cellregion':'0,0,10,10'
                                                                 }
                                                                    ]
                                                                }
                                                               }";
            new ExportBuilder<ExamEntity>().Column(a => a.Id.ToString())
                                                                      .Column(a => a.Name)
                                                                      .Column(x => x.Sex ? "男" : "女")
                                                                     .Column(a => a.ExamTime.ToString("yyyy-MM-dd"))
                                                                     .Column(a => a.Chinese.ToString())
                                                                     .Column(a => a.Math.ToString())
                                                                     .Column(a => a.English.ToString())
                                                                     .Column(a => a.Wuli.ToString())
                                                                     .Column(a => a.HuaXue.ToString())
                                                                     .Column(a => a.ShengWu.ToString())
                                                                     .Column(a => a.SumCount.ToString())
                                                                     .Export(exam, "學生成績第" + new Random().Next(100000) + "份導出.xls", jsonhead);
            return Json("Succeed");
        }
     
    }
}

跟ASP.NET中一模一樣

運行效果:

 

 

 

 

 

 

 

 

 

 

 

第七課  公開了的一些其他輔助方法

 

為了防止,暫時MyNPOI完成在下的需求,我公開了,這幾個擴展方法,可以將HSSFWorkbook對象下載或者存儲,SaveToStream將HSSFWorkbook對象轉換成 MemoryStream對象,在下可以使用原生的NPOI將所有的操作完成后,提交一個HSSFWorkbook對象就可以完成下載或者本地存儲

 

這里就不演示了。

 

 

 

 

 

 

 

 

 

 附錄(一)

示例一:

{ 'root':{'rowspan':2,'sheetname':'[#sheetNa]','defaultwidth':15,'defaultheight':45,'head':[ 
                                                                   {
                                                                      'title':'我是表頭標題',
                                                                      'fontsize':14,
                                                                      'bgcolor':'#ffffff',
                                                                      'cellregion':'0,0,0,8',
                                                                      'height':50
                                                                   },
                                                                   {
                                                                      'title':'客戶經理',
                                                                      'cellregion':'1,1,0,0',
                                                                   },
                                                                   {
                                                                      'title':'時間',
                                                                      'cellregion':'1,1,1,1',
                                                                   },
                                                                   {
                                                                      'title':'電話',
                                                                      'cellregion':'1,1,2,2',
                                                                   },
                                                                   {
                                                                      'title':'在線',
                                                                      'cellregion':'1,1,3,3',
                                                                   },
                                                                   {
                                                                      'title':'郵件',
                                                                      'cellregion':'1,1,4,4',
                                                                   },
                                                                   {
                                                                      'title':'面談',
                                                                      'cellregion':'1,1,5,5',
                                                                   },
                                                                   {
                                                                      'title':'短信',
                                                                      'cellregion':'1,1,6,6',
                                                                   },
                                                                   {
                                                                      'title':'其它',
                                                                      'cellregion':'1,1,7,7',
                                                                   },
                                                                   {
                                                                      'title':'合計',
                                                                      'cellregion':'1,1,8,8',
                                                                   }
                                                                 ]
                                                                 }
                                                                }

   必要項:

    title:單元格要顯示的文字,必填

    cellregion:合並單元格的位置,索引從0開始。(fromRow,toRow,fromColumn,toColumn)

                          例如 ‘cellregion’: ‘1,3,2,4’,就是從第二行到第4行行合並,然后從第二行第三列開始到第二行的的第五列合並結束

                                   ‘cellregion’:‘0,0,0,0’ 這個合並后的效果肯定是第一行第一列,也相當於沒合並

    rowspan: 表頭一共占用了多少行,暫時必填選項,普通的一行就是1

    可選項:

     border修復完成,全局設置border樣式,例如樣式

    { 'root':{'rowspan':2,'sheetname':'學生考試信息','defaultwidth':12,'defaultheight':35,'bordercolor':'#ED3C3C','borderstyle':'solid','head':[ {

        .....

     關於bordercolor為16進制顏色值,默認黑色

     關於borderstyle樣式的可用值(默認 solid):none,solid,dashed,dotted,double

    align:單元格水平顯示方式,默認:居中,可用的值有left,center,right

    valign:單元格垂直顯示方式,默認:居中,可用的值有 top,center,bottom

    bgcolor: 單元格背景顏色,支持16進制,例如#ffffff,默認 灰色

    width: 單元格寬度(列寬),在 多行合並時候,寬度設置可能有問題,但是通過全局的 defaultwidth:可修復,暫未解決,可有可無

                   但是單行表頭的當然沒事,采取defaultwidth方式,是平均寬度

    height: 單元格的高度,也就是行高,也可以使用全局的defaultheight,定義個全局的相等高度

    IsItalic:是否是斜體,默認 false

    IsStrikeout:是否有中間線,默認 false

    Underline:是否具有下划線,默認 false

    fontName:字體名稱,例如 “微軟雅黑”,默認“宋體”

    fontcolor:單元格字體顏色,支持16進制,例如#ffffff,默認 黑色

    fontsize:單元格字體大小,默認11,

    fontweight: bold,none,normal      默認 bold

    關於表頭的一些屬性:

   defaultwidth: 如果單元格內沒有設置width,將統一寬度(列寬)設置

   defaultheight:如果單元格內沒有設置height,將統一高度(行寬)設置,發現沒有什么效果

       →補充說明: 如果設置了defaultwidth全局屬性,那么head中的width將不生效,相反如果不設置,head中的width將生效

                              如果設置了defaultheight全局屬性,那么head中的height將不生效,相反如果不設置,head中的height將生效

         

   sheetname:excel中sheet的名稱

 

 

 

 

 

 

 

 

 

 

 

 

 

附錄(二)

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM