利用NPOI組件產Excel完整操作


最終還是要使用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還是比較博大精深的,還有待學習

     

 


免責聲明!

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



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