相關更新記錄情況:
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 下載
大致殼這樣子:
一級表頭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才不會設置錯
這里我局二級表頭的例子
二級表頭例子的 要顯示的第一列 合並了第一第二行,以左上角的位置,也就是第一行,第一列,列的索引是0,所以這里就是0
同理1,然后就是第一行合並三個,根據,0,1,然后下個是2,所以是2,
繼續寫,同行的就是3,4,5,6,7,所以上面一行表面是2,但是它跨了6格到7,所以他的下一個合並就是8,同理標示數字
關於cellregion的設置理解起來還是有難度的
原生NPOI也是這種合並方式處理的
定義好這3個測試json,我們把他們和對應的按鈕綁定,單擊了,就把json放到文本框中顯示
①根據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的時候設置了文件名沒有任何作用。
運行效果:
打開Excel,這里我在json中設置背景顏色,字體顏色等等
整體表頭演示
關於表身演示
接下來我們創建一個類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列都顯示,“不完全”就是指定列顯示
完全的代碼如下:就是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