[茗洋]自己封裝的MyNPOI,輕松實現可定制的Excel報表數據導出


相關更新記錄情況:

2013年6月3日11:43:51  已經發布,立即查看

 

 

2013年6月1日9:13:16

V1.2 已經准備待續

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

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

  基於NPOI,服務器免裝Office軟件,性能更加優越

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

  輕松  分組導出

  輕松設置 Excel 屬性,第二個Excel身份信息

  絕對輕松能學會的的DEMO 演示

 

  ==========================待開發==========================================

  v1.3   支持Excel 模版導出,JSON表頭設計助手

  v1.4   支持Excel數據導入

  v2.0   大數據智能分Sheet 導出

  v2.1   大數據智能導入

  

v1.2  dll還沒提供下載,等6月1日的

2013年5月29日10:15:14

已經測試通過,分組還具有局限性,解決的思想和datagrid的分組顯示一樣。

Web和本地存儲導出都可以

 

下個版本解決模版導出

 

v1.1 

2013年5月28日0:17:51

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

    { 'root':{'rowspan':2,'sheetname':'按商機類型分類','defaultwidth':12,'defaultheight':35,'bordercolor':'#ED3C3C','borderstyle':'solid','head':[ {

        .....

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

關於borderstyle樣式的可用值:

none
solid
dashed
dotted
double
默認 solid

 

②更簡潔的寫法導出,方法優化,目前純字符導出,導出的Excel無任何類型,支持本地(Local)導出,支持Web導出直接下載

例如本地導出寫法:文件路徑必須含有路徑 ,去掉要求填入的表頭數組,只需指定列,文件路徑,表頭json就可以本地報表導出

  new ExportBuilder<StatisticOpSourceDto>().Column(a => a.SortId.ToString())
                                                                                .Column(a => a.StatisticDate.ToString("yyyy-MM-dd"))
                                                                                .Column(a => a.HTYY.ToString())
                                                                                .Column(a => a.ZXZX.ToString())
                                                                                .Column(a => a.DHZX.ToString()).ExportToLocal(dtp,"c:\\用戶投保信息.xls",txtJsonHead.Text);

web導出下載:,去掉要求填入的表頭數組,只需指定列,文件路徑,表頭json就可以本地報表導出,,去掉要求填入的表頭數組,只需指定列,文件名,表頭json就可以本地報表導出

    new ExportBuilder<StatisticOpSourceDto>().Column(a => a.SortId.ToString())
                                                                               .Column(a => a.StatisticDate.ToString("yyyy-MM-dd"))
                                                                               .Column(a => a.HTYY.ToString())
                                                                               .Column(a => a.ZXZX.ToString())
                                                                               .Column(a => a.DHZX.ToString()).ExportToWeb(dtp, "用戶投保信息.xls", TestAdvanceJson);

已經實現如上,代碼更加整潔和維護

excel具體屬性嵌入 2013年5月28日15:06:22已經實現

 

測試情況:ASP.NET,Winform,ASP.NET MVC3+ 都可以輕松使用

 

下次待實現(想幫助我的可加我為好友):

 

特定的分組指定格式導出

 

具體疑難雜症:

大數據的智能分sheet導出

 

 

 

 

=====================================================================

NPOI 是個很好的做報表Excel導出導入的開源項目,導出時,服務器不用裝任何office,基於NPOI 2.0封裝一個殼

本人無聊將其封裝,暫時只封裝了一類報表定制導出,暫且訂版本號 v1.0,My是我的,茗洋的拼音首字母

源碼暫時先不公開, 相關類庫下載: 開始前往下載

MyNPOI(茗洋NPOI采用表頭與表身生成分離的思想,本來想在json中加個field屬性,結果太死板了,會有很多功能束縛和性能的損失)

預覽版:

v 1.0 preview:

暫時不支持自定義路徑指示,默認生成都是在C盤,作為測試體驗

支持 自定義JSON 定義表頭信息,凡是還有默認的,JSON可不定義,采取默認值方式設置

  一些json,表頭單元格屬性說明:

     必要項:

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

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

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

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

    可選項:

    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還未公開,暫時寫死的默認表頭上的字是加粗的

     

關於表頭的一些屬性:

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

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

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

sheetname:excel中sheet的名稱

 

下個版本v1.0 真實 功能:

支持WEB導出,自定義名稱,自動下載,桌面端自定義地址導出

border設置,由於合並后顯示的border會有問題,暫時尚未實現

下個版本正式發布會 類庫面向大眾,但是現在只是基本功能演示版本

 

 

v1.5版本

   JSON表頭生成助手,例如:Head.Add("一個json單元格子項").Add("一個json單元格子項")…

 

V2.0版本

支持Excel導入變成List<T>類型的處理

根據某列分組導出 Excel,內容里面某列合並的效果

 

V2.2版本

不定數量的列的 導出Excel解決方案導出

 

V3.0版本

Json支持自定義列統計,某列(指定位置)的和,平均數,最小值,最大值

 

 

后續….

 

 

============================================================

使用方法,新建項目,直接引用 MyNPOI.dll

下載我搭好的空格子demo          下載

大致殼這樣子:

image

一級表頭JSON示例

private string TestCommomJson = @"{ 'root':{'rowspan':1,'sheetname':'按商機類型分類','defaultwidth':12,'defaultheight':55,'head':[ {
                                                                      'title':'排序',
                                                                      'align':'center',
                                                                      'bgcolor':'#DE0A0A',
                                                                      'fontsize':14,
                                                                      'fontcolor':'#ffffff',
                                                                      'cellregion':'0,0,0,0',
                                                                      'width':20
                                                                   },
                                                                  {
                                                                      'title':'統計日期',
                                                                      'align':'center',
                                                                       'bgcolor':'#2556C9',
                                                                      'fontsize':14,
                                                                      'fontcolor':'#C96725',
                                                                      'cellregion':'0,0,1,1',
                                                                      'width':80
                                                                 },
                                                                    {
                                                                      'title':'后台預約',
                                                                      'align':'center',
                                                                      'fontsize':14,
                                                                      'cellregion':'0,0,2,2',
                                                                      'width':50
                                                                 }, {
                                                                      'title':'在線咨詢',
                                                                      'align':'center',
                                                                      'fontsize':14,
                                                                      'cellregion':'0,0,3,3',
                                                                      'width':50
                                                                 }, {
                                                                      'title':'電話咨詢',
                                                                      'align':'center',
                                                                      'fontsize':14,
                                                                      'cellregion':'0,0,4,4',
                                                                      'width':50
                                                                 }
                                                                    ]
                                                                }
                                                               }";

二級商機JSON示例

  private string TestAdvanceJson = @"{ 'root':{'rowspan':2,'sheetname':'按商機類型分類','defaultwidth':12,'defaultheight':35,'head':[ {
                                                                      'title':'排序',
                                                                      'align':'center',
                                                                      'bgcolor':'#820C5F',
                                                                      'fontsize':14,
                                                                      'fontcolor':'#FBEC00',
                                                                      'cellregion':'0,1,0,0',
                                                                      'width':30
                                                                   },
                                                                  {
                                                                      'title':'統計日期',
                                                                      'align':'center',
                                                                      'fontsize':14,
                                                                      'cellregion':'0,1,1,1',
                                                                      'width':30
                                                                 },
                                                                   {
                                                                      'title':'商機階段',
                                                                      'align':'center',
                                                                      'fontsize':14,
                                                                      'width':60,
                                                                      'cellregion':'0,0,2,7'
                                                                 },
                                                                  {
                                                                      'title':'商機關閉',
                                                                      'align':'center',
                                                                      'fontsize':14,
                                                                      'cellregion':'0,0,8,10'
                                                                 },
                                                                    {
                                                                      'title':'合計',
                                                                      'align':'right',
                                                                      'cellregion':'0,1,11,11',
                                                                      'bgcolor':'#FFFFFF',
                                                                      'fontsize':14,
                                                                      'fontcolor':'#DF0B0B'
                                                                 },
                                                                    {
                                                                      'title':'挖掘商機',
                                                                      'align':'center',
                                                                      'fontsize':12,
                                                                      'cellregion':'1,1,2,2'
                                                                 },{
                                                                      'title':'獲取認同',
                                                                      'align':'center',
                                                                      'fontsize':12,
                                                                      'cellregion':'1,1,3,3'
                                                                 },{
                                                                      'title':'方案制定',
                                                                      'align':'center',
                                                                      'fontsize':12,
                                                                      'cellregion':'1,1,4,4',
                                                                 },{
                                                                      'title':'問題處理',
                                                                      'align':'center',
                                                                      'fontsize':12,
                                                                      'cellregion':'1,1,5,5'
                                                                 },{
                                                                      'title':'客戶促成',
                                                                      'align':'center',
                                                                      'width':10,
                                                                      'fontsize':12,
                                                                      'cellregion':'1,1,6,6'
                                                                 },{
                                                                      'title':'簽單處理',
                                                                      'align':'center',
                                                                      'fontsize':12,
                                                                      'cellregion':'1,1,7,7'
                                                                 }
                                                               ]}
                                                               }";

三級表頭JSON示例

    private string TestMoreAdvanceJson = @"{ 'root':{'rowspan':3,'sheetname':'按商機類型分類','defaultwidth':12,'defaultheight':35,'head':[ {
                                                                      'title':'排序',
                                                                      'bgcolor':'#FBEC00',
                                                                      'fontsize':14,
                                                                      'fontcolor':'#ffffff',
                                                                      'cellregion':'0,2,0,0',
                                                                      'width':50
                                                                   },
                                                                  {
                                                                      'title':'統計日期',
                                                                      'fontsize':14,
                                                                      'cellregion':'0,2,1,1',
                                                                      'width':50
                                                                 },
                                                                   {
                                                                      'title':'商機階段',
                                                                      'fontsize':14,
                                                                      'cellregion':'0,0,2,7'
                   
                                                                 },{
                                                                      'title':'商機初級階段',
                                                                      'fontsize':14,
                                                                      'cellregion':'1,1,2,4'
                                                                 },{
                                                                      'title':'商機高級階段',
                                                                      'fontsize':14,
                                                                      'cellregion':'1,1,5,7'
                                                                 },
                                                                  {
                                                                      'title':'商機關閉',
                                                                      'fontsize':14,
                                                                      'cellregion':'0,0,8,10'
                                                                 },
                                                                  {
                                                                      'title':'無法促成',
                                                                      'fontsize':12,
                                                                      'fontName':'隸書',
                                                                      'cellregion':'1,2,8,8'
                                                                 },
                                                                    {
                                                                      'title':'重復商機',
                                                                      'fontsize':12,
                                                                      'cellregion':'1,2,9,9'
                                                                 },
                                                                 {
                                                                      'title':'無效商機',
                                                                      'fontsize':12,
                                                                      'cellregion':'1,2,10,10'
                                                                  },
                                                                    {
                                                                      'title':'合計',
                                                                      'fontsize':'14',
                                                                      'cellregion':'0,2,11,11'
                                                                 },
                                                                    {
                                                                      'title':'A',
                                                                      'fontsize':14,
                                                                      'cellregion':'2,2,2,2'
                                                                 },{
                                                                      'title':'B',
                                                                      'fontsize':14,
                                                                      'cellregion':'2,2,3,3'
                                                                 },{
                                                                      'title':'C',
                                                                      'cellregion':'2,2,4,4'
                                                                 },{
                                                                      'title':'D',
                                                                      'cellregion':'2,2,5,5'
                                                                 },{
                                                                      'title':'E',
                                                                      'cellregion':'2,2,6,6'
                                                                 },{
                                                                      'title':'F',
                                                                      'cellregion':'2,2,7,7'
                                                                 }
                                                               ]}
                                                               }";

關於這3個示例的JSON中有cellregion的數字你可能不確定

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

image

這里我局二級表頭的例子

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

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

image

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

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

原生NPOI也是這種合並方式處理的

 

定義好這3個測試json,我們把他們和對應的按鈕綁定,單擊了,就把json放到文本框中顯示

image

 

 

①根據json導出表頭

先引用  using MyNPOI.Excel;

光導出表頭 ,第一個參數是導出的文件名,第二個必須設置true,才能單獨導出表頭,這里只是測試用,真正發布,我會取消此方法

            ExcelHelper ext = new ExcelHelper(null, true);

            ext.SetHead(txtJsonHead.Text);
            System.Diagnostics.Process.Start("c:\\");

調用SetHead生成表頭信息,導出后成功后打開C盤,此版本默認生成的excel都在c盤根目錄,第一個文件名暫時無用,只是測試

關於SetHead中的單獨導出表頭是

的相關代碼:

    FileStream file = new FileStream(@"c:\test" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".xls", FileMode.Create);

所以是test隨機數.xls

所以你在new ExcelHelper的時候設置了文件名沒有任何作用。

 

運行效果:

image

image

打開Excel,這里我在json中設置背景顏色,字體顏色等等

image

整體表頭演示

 

 

關於表身演示

接下來我們創建一個類StatisticOpSourceDto.cs,這里面全是屬性

 

using System;
using System.Collections;
 
namespace TestMyNPOI
{
    public class StatisticOpSourceDto
    {
        public int SortId { get; set; }
        public DateTime StatisticDate
        {
            get;
            set;
        }
 
        public int DHZX
        {
            get;
            set;
        }
        public int ZXZX
        {
            get;
            set;
        }
        public int HTYY
        {
            get;
            set;
        }
    }
}

這里我們手動創建一個數據源,這里我們的數據可以從后台傳來,暫時先List<T>型的,但是表內的數據結構不要太復雜,目前沒有測試負責的數據

未來支持更多的數據源格式,暫時先List<T>

 

   1:          #region 測試的集合體
   2:          public List<StatisticOpSourceDto> dtp = new List<StatisticOpSourceDto> { 
   3:             new StatisticOpSourceDto{SortId=1,StatisticDate=Convert.ToDateTime("2013-05-08"),HTYY=44,ZXZX=5,DHZX=6},
   4:            new StatisticOpSourceDto{SortId=2,StatisticDate=Convert.ToDateTime("2013-05-09"),HTYY=144,ZXZX=45,DHZX=664},
   5:            new StatisticOpSourceDto{SortId=3,StatisticDate=Convert.ToDateTime("2013-05-08"),HTYY=434,ZXZX=578,DHZX=56}
   6:          };
   7:          public string[] titles = { "SortId", "StatisticDate", "HTYY", "ZXZX", "DHZX" }; //測試完全用的
   8:          public string[] titles2 = { "SortId", "StatisticDate", "HTYY", "ZXZX"};  //測試 不完全用的
   9:          #endregion

titles是 綁定T里面的屬性的名稱,不要搞錯了,必須一一對應

我們再添加一個按鈕,這里我們StatisticOpSourceDto有5個屬性,都賦值了,“完全”那個按鈕是 5列都顯示,“不完全”就是指定列顯示

image

完全的代碼如下:就是titles和titles2,兩個參數不一樣,還有linq后的列順序不一樣

這里暫時強烈要求,titles的 字符串 順序,必須與后面最后一個參數的 linq,捕獲的列要一一對應,后期會優化

完全的代碼如下:

   ExcelHelper ext = new ExcelHelper();
            ext.ExportToExcel<StatisticOpSourceDto>(dtp, "20130522報表測試" + DateTime.Now.ToString("mmssfff"), titles,  txtJsonHead.Text,
                   a => a.SortId.ToString(),
                   c => c.StatisticDate.ToString("yyyy-MM-dd"),
                   a => a.HTYY.ToString(),
                   a => a.ZXZX.ToString(),
                   a => a.DHZX.ToString()
                   );

不完全的代碼如下:

    ExcelHelper ext = new ExcelHelper();
            ext.ExportToExcel<StatisticOpSourceDto>(dtp, "20130523報表測試" + DateTime.Now.ToString("mmssfff"), titles2,  txtJsonHead.Text,
              a => a.SortId.ToString(),
              c => c.StatisticDate.ToString("yyyy-MM-dd"),
              a => a.HTYY.ToString(),
              a => a.ZXZX.ToString()
              );

 

這里暫時也是定死在C盤,只需一個文件名,不需要后綴名,下個版本正式發布會 面向大眾
效果圖:

 

整體上,表現表頭與表身分離的思想,更加靈活,如果綁定,程序就要加很多判斷代碼,會有性能損失,且耦合性太高,因為json很容易寫錯,而不容易發現

關於后期,會提供一個表頭生成輔助類

 

 

以上是暫時這樣的解決方案的一個封裝。關於源碼,暫時先不要我問我要的,寫個代碼不容易,至於穩定的時候,會將源碼公開,讓MyNPOI(茗洋NPOI)更加好用。

 

==========================防止別人粘貼復制,茗洋芳竹地址:www.cnblogs.com/fresh-air=======

 

如果你喜歡這樣的封裝,我會繼續下去。歡迎推薦,我是茗洋,原名楊洋

謝絕轉載,茗洋原創,寫個文章不容易。

6月1日發布,基本大眾版本v1.0,到時可以實現web項目的復雜表頭excel導出,導出下載,導出文件存儲到服務器的指定位置

本項目,我自己一個人編寫,有興趣的可以交流

 

相關下載:

已經完成的Demo演示下載:

點擊開始下載               更新日期 2013年5月23日1:21:55


免責聲明!

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



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