NPOI 1.2教程 – 3.1 基于.xls模板生成Excel文件

来源:互联网 发布:银行程序员招聘 编辑:程序博客网 时间:2024/05/09 21:02

作者:Tony Qu

========================================

[更新] NPOI 1.2.4 新教程地址:http://tonyqus.sinaapp.com/

========================================

NPOI官方网站:http://npoi.codeplex.com/

 

尽管NPOI能够从头开始生成Excel文件,但在实际生产环境中有很多现成的表格,我们不可能没事就去从头开始生成一个Excel,更多时候我们更愿意选择比较偷懒的方法——那就是用模板文件。NPOI一大特色之一就是能够轻松读取Office Excel 97-2003的格式,即使里面有NPOI不支持的VBA宏、图表以及Pivot表之类的高级记录,NPOI也能够保证不丢失数据(说实话,要完全能够识别所有的Excel内部记录几乎是不可能的,更何况如今又多出了Office Excel 2007 binary file,即.xlsb)。

现在我们转入正题,出于演示目的,我做了一个简单的销售量表,里面应用了文字颜色、背景色、文本居中、公式、千分位分隔符、边框等效果,当然实际的生产环境里可能还有更加复杂的Excel模板。如下图

image

我们的程序就是要填充12个月的销售量,Total能够自动根据填充的值计算出总量。

(这里要提一下,以往如果我们用HTML方式输出xls,我们必须在服务器端做Total计算,并且这个值在下载后永远都是静态的,没有公式,即使用户要修改里面的数据,总值也不会改变。这也是为什么NPOI一直提倡生成真正的Excel文件。)

代码其实很简单:

//read the template via FileStream, it is suggested to use FileAccess.Read to prevent file lock.//book1.xls is an Excel-2007-generated file, so some new unknown BIFF records are added. FileStream file = new FileStream(@"template/book1.xls", FileMode.Open,FileAccess.Read);HSSFWorkbook hssfworkbook = new HSSFWorkbook(file);HSSFSheet sheet1 = hssfworkbook.GetSheet("Sheet1");sheet1.GetRow(1).GetCell(1).SetCellValue(200200);sheet1.GetRow(2).GetCell(1).SetCellValue(300);sheet1.GetRow(3).GetCell(1).SetCellValue(500050);sheet1.GetRow(4).GetCell(1).SetCellValue(8000);sheet1.GetRow(5).GetCell(1).SetCellValue(110);sheet1.GetRow(6).GetCell(1).SetCellValue(100);sheet1.GetRow(7).GetCell(1).SetCellValue(200);sheet1.GetRow(8).GetCell(1).SetCellValue(210);sheet1.GetRow(9).GetCell(1).SetCellValue(2300);sheet1.GetRow(10).GetCell(1).SetCellValue(240);sheet1.GetRow(11).GetCell(1).SetCellValue(180123);sheet1.GetRow(12).GetCell(1).SetCellValue(150);//Force excel to recalculate all the formula while opensheet1.ForceFormulaRecalculation = true;

FileStream file = new FileStream(@"test.xls", FileMode.Create);hssfworkbook.Write(file);file.Close();

首先打开模板文件时要使用FileAccess.Read,这样可以保证文件不被占用。

这里的ForceFormulaRecalculation是强制要求Excel在打开时重新计算的属性,在拥有公式的xls文件中十分有用,大家使用时可别忘了设。

 

是不是比你想象的简单?你甚至不用去了解它是在何时读取文件内容的,对于NPOI的使用者来说基本上和读取普通文件没有什么两样。

 

最终生成的效果如下所示:

 

 

image

发觉没,就连千分位分隔符也都保留着,一切就像人工填写的一样。

 

本范例完整代码请见NPOI.Examples中的GenerateXlsFromXlsTemplate项目。


版权声明:本文由作者Tony Qu原创, 未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。