前言:在导出到xls时有一些通用的元素,比如标题,列标题,内容区域,求和行,但每个xls多少有点不同,为了处理这个问题,可以使用delegate实现,这样可以把差异部分单独处理。

//为了处理计算和之类的补公式
public delegate void WriteXlsEndDelegate(DataTable dataTable, HSSFSheet sheet); //代理函数方式
public WriteXlsEndDelegate writeXlsEndDelegate=null;
/*
* 根据模板导出xls
* 数据表,文件名,模板文件名,填充开始行,原始模板里的数据表行数(不包括表头、求和行,一般要留一条示例数据)
*/
public void ExportXlsByTemplate(DataTable dataTable, string filename, string templatefile, int startDataRegionRow,int orgRowCount=)
{
HttpContext context = HttpContext.Current;
//Excel模板
string templetFileName = context.Server.MapPath(templatefile);
HSSFWorkbook wk = null;
if (templetFileName != null)
{ using (FileStream fs = File.Open(templetFileName, FileMode.Open,
FileAccess.Read, FileShare.ReadWrite))
{
//把xls文件读入workbook变量里,之后就可以关闭了
wk = new HSSFWorkbook(fs);
fs.Close();
} }
else
{
return;
}
if (dataTable.Rows.Count>)
{
HSSFSheet sheet1 = (HSSFSheet)wk.GetSheetAt();
var rowSource = sheet1.GetRow(startDataRegionRow);
var rowStyle = rowSource.RowStyle;//获取当前行样式
sheet1.ShiftRows(startDataRegionRow + orgRowCount, startDataRegionRow + orgRowCount, dataTable.Rows.Count - orgRowCount, true, false);//从下一行开始移动 for (int i = startDataRegionRow + orgRowCount; i < startDataRegionRow + orgRowCount + (dataTable.Rows.Count - orgRowCount); i++)
{
var rowInsert = sheet1.CreateRow(i);
if (rowStyle != null)
rowInsert.RowStyle = rowStyle;
rowInsert.Height = rowSource.Height; for (int col = ; col < rowSource.LastCellNum; col++)
{
var cellsource = rowSource.GetCell(col);
var cellInsert = rowInsert.CreateCell(col,cellsource.CellType);
var cellStyle = cellsource.CellStyle;
//设置单元格样式    
if (cellStyle != null)
cellInsert.CellStyle = cellsource.CellStyle;
cellInsert.SetCellValue("");
} }
string nextFirstTxt = string.Empty;
for (int i = startDataRegionRow; i < startDataRegionRow + dataTable.Rows.Count; i++)
{ IRow row = sheet1.GetRow(i);
for (int j = ; j < dataTable.Columns.Count; j++)
{
var drValue = dataTable.Rows[i - startDataRegionRow][j].ToString();
switch (dataTable.Columns[j].DataType.ToString())
{
case "System.String"://字符串类型
row.GetCell(j).SetCellValue(drValue);
break;
case "System.DateTime"://日期类型
DateTime dateV;
DateTime.TryParse(drValue, out dateV);
row.GetCell(j).SetCellValue(dateV);
break;
case "System.Boolean"://布尔型
bool boolV = false;
bool.TryParse(drValue, out boolV);
row.GetCell(j).SetCellValue(boolV);
break;
case "System.Int16"://整型
case "System.Int32"://整型
case "System.Int64"://整型
case "System.Int"://整型
int invV = ;
int.TryParse(drValue, out invV);
row.GetCell(j).SetCellValue(invV);
break; case "System.Byte":
int intV = ;
int.TryParse(drValue, out intV);
row.GetCell(j).SetCellValue(intV);
break;
case "System.Decimal"://浮点型
case "System.Double":
double doubV = ;
double.TryParse(drValue, out doubV);
row.GetCell(j).SetCellValue(doubV);
break;default:
row.GetCell(j).SetCellValue("");
break;
} }
}
sheet1.ForceFormulaRecalculation = true;
if(writeXlsEndDelegate!=null)//结束时是否需要进行其它处理
writeXlsEndDelegate(dataTable,sheet1);
} context.Response.ContentType = "application/vnd.ms-excel";
// 添加头信息,指定文件名格式
context.Response.AddHeader("Content-Disposition", "attachment;filename=" + filename);
context.Response.AddHeader("Content-Transfer-Encoding", "binary");
context.Response.ContentType = "application/octet-stream";
context.Response.ContentEncoding = System.Text.Encoding.UTF8;
MemoryStream file = new MemoryStream();
wk.Write(file);
context.Response.BinaryWrite(file.GetBuffer());
}

通常导出xls后会进行一些后续操作,比如设置公式求和,下面例子是对第L到U列设置求和公式编写方法

ClassTest npoi=new ClassTest();
//设置公式
npoi.writeXlsEndDelegate = (dataTable1, sheet) =>
{
int rowIndex = dataTable1.Rows.Count + ;
///做后补操作
};
npoi.ExportXlsByTemplate(dataTable, filename, @"/Template/xls/test.xls", );

模板示例

通用化NPOI导出xls的更多相关文章

  1. c#(winform,webform通用)利用npoi将xls文件复制为xlsx文件(excel的修改,保存,包括excel2003-office2007+的处理)

    1.程序界面 每次需要处理excel文件的时候,都是去百度找方案,真是气一头火,今天好好总结一下,下次就不用度娘了. 我是用winform来试验的,因为winform比较方便测试,实际上只要是在.ne ...

  2. .NET Core使用NPOI导出复杂,美观的Excel详解

    前言: 这段时间一直专注于数据报表的开发,当然涉及到相关报表的开发数据导出肯定是一个不可避免的问题啦.客户要求要导出优雅,美观的Excel文档格式的来展示数据,当时的第一想法就是使用NPOI开源库来做 ...

  3. NPOI导出Excel2007-xlsx

    今天在用npoi导出xls时会报错,经过在网上查找资料,找到一篇博客文章介绍的,原文地址https://www.cnblogs.com/spring_wang/p/3160020.html 1.今天再 ...

  4. NPOI 导出 excel 性能测试

    NPOI 导出 excel 性能测试 Intro 网上看到很多人说 NPOI 的性能不行,自己写了一个 NPOI 的扩展库,于是想尝试看看 NPOI 的性能究竟怎么样,道听途说始终不如自己动手一试. ...

  5. NPOI导出Excel (C#) 踩坑 之--The maximum column width for an individual cell is 255 charaters

    /******************************************************************* * 版权所有: * 类 名 称:ExcelHelper * 作 ...

  6. 基于NPOI导出和导入Excel

    概述 NPOI,顾名思义,就是POI的.NET版本.NPOI就是用.NET语言编写的一套数据导出Excel的开源项目,支持XML.xls.xlsx.ppt等格式..NET不仅实现Excel导出还可以实 ...

  7. (C#)使用NPOI导出Excel

    在做业务型的软件时,经常需要将某些数据导出,本文介绍了在Winform或Asp.net中使用NPOI(POI 项目的 .NET 版本)来操作Excel文件,而无需安装Office. 首先,需要获取NP ...

  8. Asp.Net 使用Npoi导出Excel

    引言 使用Npoi导出Excel 服务器可以不装任何office组件,昨天在做一个导出时用到Npoi导出Excel,而且所导Excel也符合规范,打开时不会有任何文件损坏之类的提示.但是在做导入时还是 ...

  9. .NET NPOI导出Excel详解

    NPOI,顾名思义,就是POI的.NET版本.那POI又是什么呢?POI是一套用Java写成的库,能够帮助开发者在没有安装微软Office的情况下读写Office的文件. 支持的文件格式包括xls, ...

随机推荐

  1. 「洛谷1903」「BZOJ2120」「国家集训队」数颜色【带修莫队,树套树】

    题目链接 [BZOJ传送门] [洛谷传送门] 题目大意 单点修改,区间查询有多少种数字. 解法1--树套树 可以直接暴力树套树,我比较懒,不想写. 稍微口胡一下,可以直接来一个树状数组套主席树,也就是 ...

  2. hexo博客添加功能

    设置Hexo主题模式 Hexo主题中,有三种不同的模式,通过切换模式,让NexT主题显示不一样的样式.在NexT根目录下有一个同样名称为_config.yml,为了区分hexo根目录下的_config ...

  3. 单片机的基本构成、工作原理 LET′S TRY“嵌入式编程”: 1 of 6

    单片机的基本构成.工作原理 LET′S TRY“嵌入式编程”: 1 of 6 本连载讲解作为嵌入式系统开发技术人员所必需具备的基础知识.这些基础知识是硬件和软件技术人员都应该掌握的共通技术知识.有了电 ...

  4. zabbix添加ceph监控

    应用背景: 网上监控ceph集群的资料不算多,git上有个开源的监控项目,是跟zabbix结合的,主要包含一个shell写的脚本和zabbix监控模板,拿来测试小记一下. 开源地址: https:// ...

  5. 蓝桥杯试题 k倍区间(dp)

    问题描述 给定一个长度为N的数列,A1, A2, ... AN,如果其中一段连续的子序列Ai, Ai+1, ... Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间. ...

  6. css预编译语言sass——mixin的使用

    以根据不同屏幕吃寸动态应用背景图片为例 新建一个mixin如下: @mixin bg_img($path, $ext){ @media screen and (max-device-width: 76 ...

  7. nio 阻塞 非阻塞 同步 异步

    https://mp.weixin.qq.com/s/5SKgdkC0kaHN495psLd3Tg 说在前面 上篇NIO相关基础篇二,主要介绍了文件锁.以及比较关键的Selector,本篇继续NIO相 ...

  8. golang go语言通道类型的通道示例 通道的通道

    几点注意:go的无缓存通道 通道make 创建后,即使里面是空的,也可以取里面内容.但是程序会被阻塞. 通道的规则是没人取,是不能往里面放的.放的线程会阻塞. 最外层的requestChan相当于一个 ...

  9. Vue--路由

    main.js: 1.先在项目安装路由模块:npm install vue-router --save-dev2.使用路由:main.js首先要引用vue模块: import Vue from 'vu ...

  10. 解决python解析文件时输出乱码

    首先获取到json模块,encoding指定文件编码utf-8,errors报错时忽略错误,print()输出结果看看是否有问题. # -*- coding: utf-8 -*- import jso ...