首先謝謝大家來到這里支持我!
MyNPOI是我花了5個下班的晚上寫的,但還有很多不完善的地方。我特將我辛辛苦苦寫的源碼奉上,希望大家能將它補充,在未來能夠分享。一直秉着技術應該分享出去,所以如果你在MyNPOI源碼的基礎上進行的任何修改如果進行了商業交易,則違反了MyNPOI的分享原則,我有權進行追究。MyNPOI在修改源碼時候,必須加上我的博客園昵稱 AaronYang,表示對我的支持,謝謝大家的合作。MyNPOI的版權和NPOI一致,再次聲明。
目錄 (Catalog)
(一) 下載MyNPOI.dll
(二) DEMO下載 : 卷一 卷二 兩個下載完了,一起解壓
五 、附錄一
六、 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才不會設置錯
這里我局二級表頭的例子
二級表頭例子的 要顯示的第一列 合並了第一第二行,以左上角的位置,也就是第一行,第一列,列的索引是0,所以這里就是0
同理1,然后就是第一行合並三個,根據,0,1,然后下個是2,所以是2,
繼續寫,同行的就是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的名稱
附錄(二)