NPOI根据Excel模板生成原生的Excel文件实例
上周完成了一个报表小项目,使用开源组件NPOI作为主要组件。之所以采用第三方的开源组件而不使用COM或微软提供的API,原因就不多说了,大家懂的。
在此分享NPOI的一个应用,利用Excel模板生成excel文件。这正是NPOI强于Myxls之处。
具体步骤如下:
一、准备数据
USE [MonthReportDemo] GO /****** Object: Table [dbo].[TradeReport] Script Date: 04/15/2011 19:10:37 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO IF NOT OBJECT_ID('[TradeReport]') IS NULL DROP TABLE [TradeReport] GO CREATE TABLE [dbo].[TradeReport]( [CurName] [nvarchar](255) NULL, [PlanValue] [decimal](20, 2) NULL, [MonthMoney] [decimal](38, 0) NULL, [YearMoney] [decimal](38, 0) NULL, [Year_Percent] [int] NOT NULL, [D_ID] [int] identity(1,1), constraint PK_TradeReport primary key clustered ([D_ID]) ) GO insert into TradeReport select '绍兴润和购物中心有限公司',30000.00,3400,10000,0 union all select '新农都实业有限公司',0,3000,6000,0 union all select '浙江农发市政园林工程有限公司',6000.00,300,2340,0 select * from TradeReport
二、新建一个项目,结构如下:
模板文件如下:
三、预览结果:
四、修正模板
重新生成:
循环每个Cell,如果为0,则置为空
#region Clear "0" System.Collections.IEnumerator rows = sheet.GetRowEnumerator(); int cellCount = headerRow.LastCellNum; for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++) { HSSFRow row = sheet.GetRow(i); if (row != null) { for (int j = row.FirstCellNum; j < cellCount; j++) { HSSFCell c = row.GetCell(j); if (c != null) { switch (c.CellType) { case HSSFCellType.NUMERIC: if (c.NumericCellValue == 0) { c.SetCellType(HSSFCellType.STRING); c.SetCellValue(string.Empty); } break; case HSSFCellType.BLANK: case HSSFCellType.STRING: if (c.StringCellValue == "0") { c.SetCellValue(string.Empty); } break; } } } } } #endregion
其实NPOI在实际项目中可以生成更加复杂的图表,如下图:
简单示例代码下载:
下载二