最終還是要使用NPOi了。剛開始做的是用com組件,發現如果本機不按照excel就不能使用,后來把其中一支改為了用Itextsharp產生pdf,但是還有幾支批次要產生Excel,只能改用NPOI了。不過這也是一種學習了,呵呵,3種方法都用到了。
在文章開始必須先申明,我的NPOI組件版本為1.2.4
1.談談我用到Com組件和NPOi組件的感覺
》NPOI不用安裝Excel,這也是我要換NPOI的主要原因
》NPOi組件產生Excel的速度明顯感覺比COM組件快
》NPOI對Excel的操作沒COM組件強大,可能畢竟都是微軟的東西,舉個例子,COM可以區域設置樣式等,NPOI好像只能一個單元格設置
2.使用過程
(1)怎么產出
string strFileName ="my excel";//文件名稱 string strPath = AppConfigString.FilePath + strFileName+".xls";//文件完整路徑 HSSFWorkbook workbook = new HSSFWorkbook(); MemoryStream ms = new MemoryStream(); FileStream file = new FileStream(strPath, FileMode.Create); try { ISheet sheet = workbook.CreateSheet(strFileName); //write sheet here workbook.Write(ms); ms.WriteTo(file); ms.Flush(); } finally { ms.Close(); file.Close(); }
(2)設計產生的Excel
基礎操作一:為單元格賦值並合並單元格
sheet.AddMergedRegion(new CellRangeAddress(0, 2, 0, 4)); IRow row = sheet.CreateRow(0); row.HeightInPoints = (float)28.5; ICell cell = row.CreateCell(0); cell.SetCellValue("XXXXXX \r\n XXXXXX"); //必須設置style.WrapText = true 時\r\n才有效 cell.CellStyle = styleHead;
上面這段代碼的意思是:合並第1行到第3行,第1列到第5列的的單元格,並為其設置高度為28.5,然后為此合並的單元格賦值和設置樣式。
當然也可以不合並,直接為一個單元格賦值,這時去掉第一行的代碼就ok了。
注意:NPOI的行和列是從0開始的
基礎操作二:每列的列寬固定
由於要使報表美觀,我做的報表的列寬是固定的
//要設置的實際列寬中加上列寬基數:0.72 //sheet1.SetColumnWidth(0, 50 * 256); // 在EXCEL文檔中實際列寬為49.29 sheet.SetColumnWidth(0, (int)((20 + 0.72) * 256));//A sheet.SetColumnWidth(1, (int)((25 + 0.72) * 256));//B sheet.SetColumnWidth(2, (int)((15 + 0.72) * 256));//C
基礎操作三:樣式的設定
樣式的設定就有點麻煩了,每個單元格都要單獨設定樣式
ICellStyle style = workbook.CreateCellStyle(); style.Alignment = HorizontalAlignment.CENTER;//左右居中 style.VerticalAlignment = VerticalAlignment.CENTER;//上下居中 style.WrapText = true;//自動換行 style.BorderBottom = CellBorderType.THIN;//下邊框為細線邊框 style.BorderLeft = CellBorderType.THIN;//左邊框 style.BorderRight = CellBorderType.THIN;//右邊框 style.BorderTop = CellBorderType.THIN;//上邊框 style.FillForegroundColor = HSSFColor.YELLOW.index;//背景色為黃色 style.FillPattern = FillPatternType.SOLID_FOREGROUND;//填充圖案為全色 IFont font = workbook.CreateFont(); font.FontName = "新細明體"; font.FontHeightInPoints = 12; font.Boldweight = short.MaxValue;//加粗 style.SetFont(font);
基礎操作四:把DataTable的數據寫入例子
int IBeginCount = 7;//開始寫數據的行數 int IColumnCount = 20;//數據列數 int ITotalCount = dt.Rows.Count;//表的數據行數 int IFoot = IBeginCount + ITotalCount;//開始寫頁尾的數 for (int i = IBeginCount; i < IBeginCount + ITotalCount; i++) { row = sheet.CreateRow(i); for (int j = 0; j < IColumnCount; j++) { cell = row.CreateCell(j); cell.SetCellValue(dt.Rows[i - IBeginCount][j].ToString()); if (j == 1) { cell.CellStyle = styleRed; } else { cell.CellStyle = styleTable; } } }
上面四個操作就可以產生出基本的excel文件了
3.自己的一些研究
下面的都是自己的一些研究過程,有些地方還不太清楚,與大家一起學習下
自適應寬度
博文名稱: NPOI自適應寬度不支持中文解決方案
博文地址:http://blog.csdn.net/jerry_cool/article/details/7000085
注意:里面有個問題,單元格的寬度不能大於255,所以還要在程序里面添加
If(length>255) length=255,不然如果有數據長度過長就會報錯。
設置純色的背景顏色
為了找到這個設置,自己鼓搗了一些時間
最容易想到的肯定是要直接設置了,這樣簡單粗暴
styleYellow.FillBackgroundColor = HSSFColor.YELLOW.index;
styleYellow.FillPattern = FillPatternType.SOLID_FOREGROUND;
我設置的為黃色,但是顯示的確不是黃色,雖然有填充,但是卻是黑色。
上面的方法不ok那我就要繼續找了
看了NPOI的官方教程:NPOI 1.2.4 教程 – 2.2.6設置單元格的背景和圖案
地址:http://tonyqus.sinaapp.com/archives/169
第一步:我設置
styleYellow.FillPattern = FillPatternType.NO_FILL;
styleYellow.FillBackgroundColor = HSSFColor.YELLOW.index;
可是根本就沒有顏色,根本就沒有填充,這時就算設置了FillForegroundColor了沒用背景顏色
第二步:我隨便選了一個圖案進行設置
styleYellow.FillForegroundColor = HSSFColor.BLACK.index;
styleYellow.FillBackgroundColor = HSSFColor.YELLOW.index;
styleYellow.FillPattern = FillPatternType.LESS_DOTS;
這時背景顏色是黃色,但是有圖案進行干擾,值得注意的是,我不設置FillForegroundColor就沒有FillBackgroundColor這個顏色,媽蛋,這是要鬧哪樣?我只想說,我不要圖案。
最后我找到了方法
styleYellow.FillForegroundColor = HSSFColor.YELLOW.index;
styleYellow.FillPattern = FillPatternType.SOLID_FOREGROUND;
為什么是用圖案的FillForegroundColor,圖案的全是這個顏色就對了…
怎么設置行高自適應
COM組件有個AutoFit()方法全局設置為行高自適應,但是NPOI找了很久也沒有找到,在網上也沒這方面的例子。但是我發現有時候會自動調整高度,當設置了自動換行后,有些數據行會自動調整高度,有些則不會,但是當我為前幾行設置高度后,就又可以自動調整高度了。不太清楚這個處理原理,求指教。
合並單元格
sheet.AddMergedRegion(new CellRangeAddress(0, 0, 6, 15));
這里不講用法,只是有個地方要注意下。
雖然合並時取的值是最左上角單元格的數據,但是我設置0行6列為有下邊框,但是其他合並的單元格並沒有下邊框,說明樣式不適用,還是乖乖的每個單元格加吧。
這些就是我的一些操作,當然NPOI還是比較博大精深的,還有待學習