回顾上一章,我们已经看到了NPOI的强大,使用NOPI我们可以生成一份完整的Excel,包含公式,包含千分位,包含单元格的合并等。在项目中第一次使用到NOPI,所以难免会遇到很多问题,我们可以在这个网站上找到相关的解决方案。
如何在项目中使用这个组件,很简单,只需要去官方网站上下载相应的版本,然后添加应用后就可以使用了。
using NPOI.HSSF.UserModel;
using NPOI.HPSF;
using NPOI.POIFS.FileSystem;
using NPOI.Util;
using NPOI.HSSF.Util;
其中最要的一个类NPOI.HSSF.UserModel.HSSFWorkbook,通过这个类可以加载,创建sheet等。
1.初始化HSSFWorkbook,可以通过加载模版的方式创建。


1 /// <summary> 2 /// 初始化WorkBook 3 /// </summary> 4 protected void InitializeWorkbook() 5 { 6 ///加载模版 7 string tempFilePath = HttpContext.Current.Server.MapPath("Template/配置器输出模板V1.0.XLS"); 8 using (FileStream fs = new FileStream(tempFilePath, FileMode.Open, FileAccess.Read)) 9 { 10 hssfworkbook = new NPOI.HSSF.UserModel.HSSFWorkbook(fs); 11 } 12 DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation(); 13 dsi.Company = "NPOI Team"; 14 hssfworkbook.DocumentSummaryInformation = dsi; 15 16 SummaryInformation si = PropertySetFactory.CreateSummaryInformation(); 17 si.Subject = "NPOI SDK Example"; 18 hssfworkbook.SummaryInformation = si; 19 }
2.创建Sheet


///加载模版中的某个sheet NPOI.HSSF.UserModel.HSSFSheet sheet1 = hssfworkbook.GetSheet("封面"); ///创建一个新的 sheet NPOI.HSSF.UserModel.HSSFSheet sheet1 = hssfworkbook.CreateSheet("封面");
3.创建行、单元格


1 ///获取某个Sheet 2 NPOI.HSSF.UserModel.HSSFSheet sheet1 = hssfworkbook.GetSheet("价格总表"); 3 ///创建行 4 HSSFRow row = sheet1.CreateRow(sheet1.LastRowNum + 1); 5 ///创建单元格 下标从0开始 6 HSSFCell cellTitle = row.CreateCell(0); 7 8 9 ///也可以通过获取sheet的某一行 10 //cellTitle = sheet1.GetRow(0).GetCell(0);
4.为单元格设置样式,设置公式


1 /// <summary> 2 /// 带边框的样式居中 3 /// </summary> 4 /// <returns>NPOI样式</returns> 5 public HSSFCellStyle CellStyleCenter8() 6 { 7 HSSFCellStyle styleCenter = hssfworkbook.CreateCellStyle(); 8 styleCenter.Alignment = HSSFCellStyle.ALIGN_RIGHT; 9 styleCenter.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.DARK_TEAL.index; 10 styleCenter.FillPattern = HSSFCellStyle.ALT_BARS; 11 styleCenter.FillBackgroundColor = NPOI.HSSF.Util.HSSFColor.DARK_TEAL.index; 12 13 ///千分位 14 //HSSFDataFormat format = hssfworkbook.CreateDataFormat(); 15 //styleCenter.DataFormat = format.GetFormat("¥#,##0"); 16 styleCenter.DataFormat = HSSFDataFormat.GetBuiltinFormat("#,##0.00"); 17 18 HSSFFont font = hssfworkbook.CreateFont(); 19 font.Boldweight = HSSFFont.BOLDWEIGHT_BOLD; 20 font.Color = HSSFColor.WHITE.index; 21 ///字号 22 font.FontHeightInPoints = 12; 23 ///字体是否倾斜 24 font.IsItalic = true; 25 ///字体 26 font.FontName = "微软雅黑"; 27 styleCenter.SetFont(font); 28 styleCenter.WrapText = true; 29 styleCenter.VerticalAlignment = HSSFCellStyle.VERTICAL_CENTER; 30 styleCenter.BorderBottom = HSSFCellStyle.BORDER_THIN; 31 styleCenter.BorderLeft = HSSFCellStyle.BORDER_THIN; 32 styleCenter.BorderRight = HSSFCellStyle.BORDER_THIN; 33 styleCenter.BorderTop = HSSFCellStyle.BORDER_THIN; 34 return styleCenter; 35 } 36 37 //为单元格赋值 38 cellTitle.SetCellValue(" 总计"); 39 //为单元格添加样式 40 cellTitle.CellStyle = CellStyleCenter8(); 41 //为单元格设置公式 42 cellTitle.SetCellFormula(String.Format("SUM($D{0},$D{1},$D{2},$D{3},$D{4})", 12, 17, 25, 31, 37)); 43 //公式可以跨sheet 44 cellTitle。SetCellFormula(string.Format("价格汇总表!D{0}", sheet1.LastRowNum + 1));
5.冻结表头
///冻结表头 ///第一个参数表示要冻结的列数; //第二个参数表示要冻结的行数,这里只冻结列所以为2; //第三个参数表示右边区域可见的首列序号,从1开始计算; //第四个参数表示下边区域可见的首行序号,也是从1开始计算; sheet1.CreateFreezePane(0, 2, 0, 2); //强制要求Excel在打开时重新计算 sheet1.ForceFormulaRecalculation = true;
6.生成Excel


1 /// <summary> 2 ///生成Excel 3 /// </summary> 4 /// <param name="strFileName">文件名</param> 5 /// <returns></returns> 6 protected string WriteToFile(string strFileName) 7 { 8 string strVirtualPath = "TempFile/" + DateTime.Now.Year.ToString() + DateTime.Now.Month + DateTime.Now.Day + "/" + strFileName + "/"; 9 string strpath = System.Web.HttpContext.Current.Server.MapPath(strVirtualPath); 10 //如果没有改路径就创建一个 11 if (!System.IO.Directory.Exists(strpath)) 12 { 13 Directory.CreateDirectory(strpath); 14 } 15 strpath = strpath + strFileName + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xls"; 16 strVirtualPath = strVirtualPath + strFileName + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xls"; 17 FileStream file = new FileStream(strpath, FileMode.Create); 18 19 hssfworkbook.Write(file); 20 file.Close(); 21 return strVirtualPath; 22 }