NPOI之使用EXCEL模板创建报表
因为项目中要用到服务器端创建EXCEL模板 无法直接调用EXCEL 查了下发现NPOI很方便很简单就实现了
其中走了点弯路 第一次弄的时候发现输出的值是文本不是数字型无法直接计算公式 然后又发现打开报表公式没有自动计算 后来都解决了 详见代码
#region 报表处理 using (FileStream file = new FileStream(@"C:\Inetpub\wwwroot\ClientBin\RptBasic\Rpt_mrp_DepInOut.xls", FileMode.Open, FileAccess.Read)) { NPOI.HSSF.UserModel.HSSFWorkbook book = new NPOI.HSSF.UserModel.HSSFWorkbook(file); NPOI.SS.UserModel.ISheet sheet = book.GetSheet("Sheet1"); ExcelSetValue(sheet, 0, 0, dt.Rows[0]["myconame"].ToString() + kind); ExcelSetValue(sheet, 3, 1, dt.Rows[0]["coname"].ToString()); ExcelSetValue(sheet, 3, 3, dt.Rows[0]["Tel"].ToString()); ExcelSetValue(sheet, 3, 6, dt.Rows[0]["sNum"].ToString()); ExcelSetValue(sheet, 4, 1, dt.Rows[0]["Address"].ToString()); ExcelSetValue(sheet, 4, 3, dt.Rows[0]["Lineman"].ToString()); ExcelSetValue(sheet, 4, 6, dt.Rows[0]["sdate"].ToString()); ExcelSetValue(sheet, 28, 4, dt.Rows[0]["AuditMan"].ToString()); ExcelSetValue(sheet, 28, 7, dt.Rows[0]["upby"].ToString()); int row = 7; for (int i = 0; i < dtd.Rows.Count; i++) { ExcelSetValue(sheet, i + row, 0, dtd.Rows[i]["sNum"].ToString()); ExcelSetValue(sheet, i + row, 1, dtd.Rows[i]["itemname"].ToString()); ExcelSetValue(sheet, i + row, 02, dtd.Rows[i]["model"].ToString()); ExcelSetValue(sheet, i + row, 03, dtd.Rows[i]["unit"].ToString()); ExcelSetValue(sheet, i + row, 04, dtd.Rows[i]["num"].ToString()); ExcelSetValue(sheet, i + row, 05, dtd.Rows[i]["price"].ToString()); ExcelSetValue(sheet, i + row, 06, dtd.Rows[i]["sum"].ToString()); ExcelSetValue(sheet, i + row, 07, dtd.Rows[i]["remark"].ToString()); } sheet.ForceFormulaRecalculation = true; // 另存为 using (FileStream f = new FileStream(@"C:\Inetpub\wwwroot\ClientBin\Rpt\" + filename + ".xls", FileMode.Create, FileAccess.ReadWrite)) { book.Write(f); } } #endregion
其中的设置单元格值的方法
protected void ExcelSetValue(NPOI.SS.UserModel.ISheet sheet, int Row, int Cell,string sValue) { if (sheet.GetRow(Row) == null) sheet.CreateRow(Row); if (sheet.GetRow(Row).GetCell(Cell) == null) sheet.GetRow(Row).CreateCell(Cell); double d; if (double.TryParse(sValue, out d)) { sheet.GetRow(Row).GetCell(Cell).SetCellValue(d); } else sheet.GetRow(Row).GetCell(Cell).SetCellValue(sValue); }
基于Silverlight 永久免费的仓库管理系统
日记帐系统承接定制开发管理软件 网页游戏辅助等