使用NPOI生成Excel級聯列表

目錄html

1    概要    1git

2    磨刀不誤砍柴工——先學會Excel中的操做    2github

3    利用NPOI生成導入模板    7ide

3.1    設置workbook&sheet    8函數

3.2    生成數據Sheet,並按規則列好    8spa

3.3    添加名稱,並指定數據範圍(綁定數據源)    93d

3.4    寫入大類和小類的數據驗證    11code

 

  1. 概要

    博客使用Word發博,發佈後,排版會出現不少問題,敬請諒解。另外Word發博代碼格式顯示凌亂,所以相關代碼均使用圖片替代。可加羣(.NET 1羣:85318032)獲取原始文檔。 orm

好久沒發博客了,由於實在是太忙了(請容許我找個藉口)。最近沉澱了不少內容,固然不少都差很少忘記了,不過我仍是會在有時間的前提下逐步一一道來吧。最近作了一個批量下單的模板導出,由於訂單中有商品大類和小類的概念,並且類型很是多,爲了方便用戶選擇以及確保數據的合法性,所以級聯選擇勢在必行。不過,在此以前,本人就算是在Excel中操做都不會設置下拉,跟別說級聯下拉了,而且關於使用代碼生成級聯下拉這塊,網上並無相關的能夠值得借鑑的內容,可是不管如何,Excel小白仍是要挑戰挑戰的。折騰了一下午,總算搞定,並且順便學會了Excel中的序列和級聯。仍是挺有成就感的。鑑於網上這塊有價值的內容很少,因而在此分享此內容以及相關核心代碼。htm

官方博客:http://www.cnblogs.com/codelove/

相關開源庫地址:https://github.com/xin-lai

交流QQ羣(.NET 1羣):85318032

交流QQ羣(Magicodes開源庫交流羣):346487194

Nuget包地址:https://www.nuget.org/packages?q=magicodes

 

  1. 磨刀不誤砍柴工——先學會Excel中的操做

首先,咱們能夠參考這個教程(來自百度經驗):

http://jingyan.baidu.com/article/5553fa82035ce565a23934ba.html

這裏有一點須要特別注意的,由於開發人員用的Excel版本都比較高,好比個人是2016,估計通常也是2013吧,特別坑爹的是,網上大部分教程是2010或者如下版本的,而在2013或以上版本微軟將某個菜單的文字改了,以下圖所示的地方:

這個有效性菜單你會發如今高版本沒法找到,我找了半天,終於找到了:

就是這個圖標!!!如今叫"數據驗證"!!!

經過以上教程,咱們能夠學會配置了Excel級聯列表:

數據源以下:

名稱管理以下:

級聯效果以下:

搞定了Excel,咱們學到了如下幾個概念:

  1. 經過名稱管理器,咱們能夠定義序列,或者叫列表和數據源吧
  2. 經過數據驗證,咱們能夠設置當單元格所綁定的序列

  3. 經過INDIRECT函數,咱們能夠實現下拉級聯效果:

    其實這個級聯的實現的思路頗有意思,經過INDIRECT獲取到關聯單元格的值,而後這個值就是關聯列表的序列名稱。

    搞懂了以上理論,而後咱們再開車。沒有理論,不少時候就是瞎折騰!因此老司機開車不能瞎開,得有理論。

    1. 利用NPOI生成導入模板

其實用NPOI仍是用Aspose.Cells,這個都不要緊。畢竟咱們掌握了理論,咱們有理由相信,這兩位都是好同志。在有RMB的前提下,咱們願意支持商業的,沒RMB,開源的也能玩得飛起。好了,至於爲何選擇NPOI,很簡單,由於咱們沒錢,並且不喜歡盜版。

如今我來講說思路(思路是高於開發的,不少時候若是作一個東西沒有思路,那就很容易"做死",在開發過程當中要有意識的培養本身的思路,一方面是思路的造成能夠在不少場景遷移借鑑,另外一方面是既保障靈活性、擴展性和嚴謹性的前提下,又少走彎路。最後,思路是本身的,代碼是靠抄的。):

  1. 設置workbook&sheet

NOPI操做Workbook和Sheet的代碼網上不少,我這裏就不過多搬運了,核心代碼爲:

HSSFWorkbook workbook = new HSSFWorkbook();//建立workbook

ISheet sheet = workbook.CreateSheet("sheet1");//建立sheet

IRow row = sheet.CreateRow(0);//添加行

row.CreateCell(0).SetCellValue("Test");//單元格寫值

  1. 生成數據Sheet,並按規則列好

根據上面的代碼,咱們根據咱們的業務邏輯很容易生成如下內容:

注意這個邏輯!必定要正確,並且對應上!

  1. 添加名稱,並指定數據範圍(綁定數據源)

核心代碼爲:

IName range = workbook.CreateName();//建立名稱

range.NameName = bigCategory.CategoryName;//設置名稱

var colName = GetExcelColumnName(colIndex);//根據序號獲取列名,具體代碼見下文

range.RefersToFormula = string.Format("{0}!${3}${2}:${3}${1}",

sheetName,

smallList.Count.ToString(),

2,

colName);

//設置引用位置

//參數1爲引用的Sheet名稱

//參數2爲行數(數據行數)

//參數3爲起始行數(從第二行開始,忽略列頭,列頭是給咱們看的)

//參數4爲列名(好比A、B、AA、AB這種)

 

獲取列名的代碼爲:

/// <summary>

/// 獲取Excel列名

/// </summary>

/// <param name="columnNumber">列的序號</param>

/// <returns></returns>

private string GetExcelColumnName(int columnNumber)

{

int dividend = columnNumber;

string columnName = String.Empty;

int modulo;

 

while (dividend > 0)

{

modulo = (dividend - 1) % 26;

columnName = Convert.ToChar(65 + modulo).ToString() + columnName;

dividend = (int)((dividend - modulo) / 26);

}

 

return columnName;

}

經過以上代碼,就能夠定義Excel中的名稱了,對應如圖所示:

  1. 寫入大類和小類的數據驗證

基於咱們的理解,而後結合NPOI的API,咱們很快就能夠寫出一下代碼了:

//定義Cell範圍,參數1:起始行數,參數2:結束行數,參數3:起始列數,參數4:結束列數

CellRangeAddressList regions = new CellRangeAddressList(1, 65535, lastBigIndex, lastBigIndex);

//綁定序列地址

DVConstraint constraint = DVConstraint.CreateFormulaListConstraint("產品大類");

//定義數據驗證

HSSFDataValidation dataValidate = new HSSFDataValidation(regions, constraint);

//添加數據驗證

sheet.AddValidationData(dataValidate);

如上面代碼所示,這裏是設置大類的數據驗證。如圖:

效果:

設置級聯的數據驗證:

var smallColIndex = i - 1;

//與大類關聯

var colName = GetExcelColumnName(lastBigIndex + 1);

//這裏只設置了該列的500行,能夠按本身的狀況來寫入

for (int j = 1; j <= 500; j++)

{

//定義Cell範圍,參數1:起始行數,參數2:結束行數,參數3:起始列數,參數4:結束列數

//這裏的範圍是單個單元格,由於咱們的公式用到了具體的單元格地址

CellRangeAddressList regions = new CellRangeAddressList(j, j, smallColIndex, smallColIndex);

//使用INDIRECT函數,這裏指定了具體地址

DVConstraint constraint = DVConstraint.CreateFormulaListConstraint(string.Format("INDIRECT(${0}${1})", colName, j + 1));

HSSFDataValidation dataValidate = new HSSFDataValidation(regions, constraint);

sheet.AddValidationData(dataValidate);

}

效果如圖:

好了,整個導出的主要邏輯就是這些。理解了思想,再結合官方API就能夠很快搞定了。

整個分享就到這裏了,如此看來,Excel仍是大有可爲的,不經過宏就能夠作不少事情。並且Excel還能夠直接鏈接外部數據源,包括OData服務等,有興趣的小夥伴能夠研究研究。

本次開車到此結束。

相關文章
相關標籤/搜索