NPOI操作Excel常用函數


最近因項目接觸了NPOI,感覺還是蠻不錯的,網絡上的教程普遍版本較老,本篇記錄所常用操作,采用NPOI 2.0版本。

推薦:

新建Excel

HSSFWorkbook hssfworkbook =newHSSFWorkbook();
ISheet sheet1 = hssfworkbook.CreateSheet("sheet1");//建立Sheet1

 

保存(導出)Excel
FileStream file =newFileStream(@"e:\HSSFWorkbook.xls",FileMode.Create);
hssfworkbook.Write(file);
file.Close();

 

導入Excel
FileStream file =newFileStream(@"template/Template.xls",FileMode.Open,FileAccess.Read);
hssfworkbook =newHSSFWorkbook(file);

 

添加文字
ICell cell1 =HSSFCellUtil.CreateCell(sheet1.CreateRow(0),0,"A1");//添加A1到A1單元,並對Row0實例化
ICell cell2 = HSSFCellUtil.CreateCell(sheet1.GetRow(0), 1, " B1 ");//添加B1到B1單元,此方法需Row0實例化后才可使用
sheet1.GetRow(0).CreateCell(2).SetCellValue("C1");//添加C1到C1單元,此方法需Row0實例化才可使用
sheet1.CreateRow(1).CreateCell(0).SetCellValue("A2");//添加A2到A2單元,並對Row1實例化
 
注意添加文字時候對單元格實例化問題,如果在同一單元格,多次實例化后,會覆蓋同行的文字。提供了兩種添加文字方式,各有優缺點吧。

 

設置字體格式
IFont font1 = hssfworkbook.CreateFont();
font1.FontName="宋體";//字體
font1.FontHeightInPoints = 20;//字號
font1.Color = HSSFColor.RED.index;//顏色
font1.Boldweight = 700;//粗體
font1.IsItalic = true;//斜體
font1.Underline = (byte)FontUnderlineType.DOUBLE;//添加雙下划線
 
ICellStyle style1 = hssfworkbook.CreateCellStyle();
style1.SetFont(font1);
字體格式綁定在Style中,Style包含了字體格式、顏色、邊框等設置,當設置好Style后,賦值給單元格即可。
 
cell1.CellStyle= style1;
sheet1.GetRow(1).GetCell(0).CellStyle= style1;

 

合並單元格

sheet1.AddMergedRegion(newCellRangeAddress(2,3,0,1));//合並A3-B4

//CellRangeAddress(起始行,終止行,起始列,終止列);

 

添加邊框

ICellStyle style2 = hssfworkbook.CreateCellStyle(); style2.BorderBottom= NPOI.SS.UserModel.BorderStyle.THINstyle2.BorderLeft=NPOI.SS.UserModel.BorderStyle.THINstyle2.BorderRight= NPOI.SS.UserModel.BorderStyle.THINstyle2.BorderTop= NPOI.SS.UserModel.BorderStyle.THIN;

 

//添加斜線

style2.BorderDiagonal = BorderDiagonal.BACKWARD; style2.BorderDiagonalLineStyle= NPOI.SS.UserModel.BorderStyle.THIN;
cell2.CellStyle= style2;

添加邊框要對上下左右邊框都進行描述。

 

設置對齊相關設置

ICellStyle style3 = hssfworkbook.CreateCellStyle(); style3.Alignment= NPOI.SS.UserModel.HorizontalAlignment.CENTER;//居中style3.VerticalAlignment=VerticalAlignment.CENTER;//垂直居中 style3.WrapText=true;//自動換行

sheet1.GetRow(0).GetCell(2).CellStyle= style3;

 

--======================補充

通常正常導出的Excel文件的單元格內容顯示不全,那么如何設置才能顯示全呢,通過如下兩種方式解決

1、縮小字體填充

2、設置列寬

第一種方式

HSSFWorkbook wk = new HSSFWorkbook();//你用來操作的HSSFWorkbook的實例
ICellStyle cellStyle = wk.CreateCellStyle();
cellStyle.ShrinkToFit = true; //縮小字體填充
ICell Cell = sheet.CreateRow(0).CreateCell(0); Cell.CellStyle = cellStyle; Cell.SetCellValue("測試格式效果");
  • 注意:
  • 創建樣式是基於HSSFWorkbook,而不是ISheet。

第二種方式

解決方法一:通過sheet.AutoSizeColumn(i)  這個方法只對英文與數字有效,對中文無效

解決方法二:設置列寬只有一函數sheet.SetColumnWidth(),該函數有兩個參數,第一個是行索引,第二個是行列寬

 

 

for (int columnNum = 0; columnNum <= 26; columnNum++)
            {
                int columnWidth = ffSheet.GetColumnWidth(columnNum) / 256;//獲取當前列寬度
                for (int rowNum = 1; rowNum <= ffSheet.LastRowNum; rowNum++)//在這一列上循環行
                {
                    IRow currentRow = ffSheet.GetRow(rowNum);
                    ICell currentCell = currentRow.GetCell(columnNum);
                    int length = Encoding.GetEncoding("GB2312").GetBytes(currentCell.ToString()).Length;//獲取當前單元格的內容寬度
                    if (columnWidth < length + 1)
                    {
                        columnWidth = length + 1;
                    }//若當前單元格內容寬度大於列寬,則調整列寬為當前單元格寬度,后面的+1是我人為的將寬度增加一個字符
                }
                ffSheet.SetColumnWidth(columnNum, columnWidth * 256);
            }

   columnNum是列號,從0開始循環到表格最后一列,循環的范圍可以自己指定,原理很簡單,就是在先循環列,在列上循環行,比對行內容寬度與列寬度,若行內容寬度大於列寬則增大列寬,循環以后,每列寬度等於該列中最寬的那一行的寬度。

     值得注意的是使用UTF8編碼來計算的,在UTF8編碼中數字和英文字母寬度為2,漢字寬度為3。而且字號越小,其效果就越好。在實際使用中內容為10磅的時候,其效果就相當不錯。發現使用GB2312更好,UTF8列太寬

      僅僅有寬度自適應是不夠的,寬度自適應只是針對較短的內容而言的,如果單元格內容很長采用這個方法會將表格拉的非常寬。下面來談一談高度自適應解決方法,高度自適應是指內容換行后行高能夠自動增加以完整的顯示內容,高度自適應是我自己想出來的,和寬度自適應很類似:

 for (int rowNum = 2; rowNum <= ffSheet.LastRowNum; rowNum++)
            {
                IRow currentRow = ffSheet.GetRow(rowNum);
                ICell currentCell = currentRow.GetCell(27);
                int length = Encoding.UTF8.GetBytes(currentCell.ToString()).Length;
                currentRow.HeightInPoints = 20 * (length / 60 + 1);
            }

參考文檔:

http://blog.csdn.net/echoshinian100/article/details/38540321

http://www.cnblogs.com/likeli/p/3896667.html?utm_source=tuicool&utm_medium=referral

 


免責聲明!

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



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