最近遇到一个问题,就是导出数据的时候需要自定义的表头,如图

如果自己用代码写表头的话,可能会有点复杂,而且代码量很多,所以我就想了一个办法,直接在Excel里面把表头定义好,然后把数据写入Excel模板里面,按模板格式导出。

需要引入的文件

NPOI组件:

还有就是这个,应该是用来压缩的,而且需要注意的一点就是,版本一定要和配置里面的一致,不然会报错

下面开始代码实现:

首先创建一个Excelhelper类,里面实现了将Datatable数据写入模板的逻辑代码

   public class ExcelHelper : IDisposable
{ private string fileName = null; //文件名
private IWorkbook workbook = null;
private FileStream fs = null;
private bool disposed;
public ExcelHelper(string fileName)
{
this.fileName = fileName;
disposed = false;
} /// <summary>
/// 将DataTable数据导入到excel中
/// </summary>
/// <param name="data">要导入的数据</param>
/// <param name="count">excel表中对应第一行数据的索引</param>
/// <param name="sheetName">要导入的excel的sheet的名称</param>
/// <returns>导入数据行数(包含列名那一行)</returns>
public Stream DataTableToExcel(DataTable data, string sheetName, int count)
{ ISheet sheet = null;
//导出的Excel存放路径
string filePath = "C:\\" + DateTime.Now.Ticks + ".xlsx";
fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
if (fileName.IndexOf(".xlsx") > ) // 2007版本
workbook = new XSSFWorkbook(fs);
else if (fileName.IndexOf(".xls") > ) // 2003版本
workbook = new HSSFWorkbook(fs); sheet = workbook.GetSheet(sheetName);
if (sheet == null)
sheet = workbook.GetSheetAt();
for (int k = ; k < data.Rows.Count; k++)
{
IRow row = sheet.CreateRow(count + k);
for (int i = ; i < data.Columns.Count; i++)
{ row.CreateCell(i).SetCellValue(data.Rows[k][i].ToString());
} } using (Stream fswrite = new FileStream(filePath, FileMode.Create))
{ workbook.Write(fswrite); return fswrite;
} } public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
} protected virtual void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
if (fs != null)
fs.Close();
} fs = null;
disposed = true;
}
}
}

然后就可以直接用了

 ExcelHelper excelHepler = new ExcelHelper(System.AppDomain.CurrentDomain.BaseDirectory.Replace(@"bin\Debug\", @"Template\excel模板.xlsx"));
excelHepler.DataTableToExcel(dt, "Sheet1", );

用的时候需要注意以下几点,

1,实例化Excelheper类的时候需要传入模板所在路径

System.AppDomain.CurrentDomain.BaseDirectory.Replace(@"bin\Debug\", @"Template\excel模板.xlsx") 这句代码就是为了获得Excel模板所在路径

2,然后再调用里面的DataTableToExcel方法时需要传入需要导出的Datatable和第一行数据所在行的索引

比如你的Excel模板中,前三行都是Title,那么你需要在第四行开始写入数据,所以就应该传入下标“3”

到此,就实现了导出数据到Excel模板功能,是不是非常简单呢~O(∩_∩)O

本文内容为原创,转载请注明出处!

最新文章

  1. mysql 自动备份和nginx自动安装脚本
  2. CSS选择器和jQuery选择器的区别与联系之一
  3. [2015hdu多校联赛补题]hdu5324 Boring Class
  4. TestNG中用Parameters或DataProvider为测试方法传入参数
  5. scandir 使用示例
  6. 冒泡算法C#
  7. Form_Form Builder编译fmb/library/menu方式总结(汇总)
  8. 怎么使用PHPMailer实现邮件的发送??
  9. 百度编辑器umeditor使用总结
  10. Swift - 10 - assert(断言)
  11. js的一个稍微高级点的用法
  12. 【转】AS3画板工具类,可直接套用
  13. ajax面试题
  14. smartgit
  15. 论文笔记——PRUNING FILTERS FOR EFFICIENT CONVNETS
  16. vs2010_相关目录
  17. 第3章—高级装配—配置profile bean
  18. nmon监控及简要分析
  19. spring笔记(二)
  20. [sql Server]除非另外还指定了TOP 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效

热门文章

  1. Dedecms 中,获取某一栏目所有子栏目
  2. CSocket实现端口扫描
  3. Linux精要
  4. [Err] 1146 - Table &#39;performance_schema.session_status&#39; doesn&#39;t exist已解决
  5. 3012C语言_数据
  6. nginx搭建静态网站
  7. 写在Logg SAP项目上线之际
  8. PATB 1028. 人口普查(20)
  9. 每天学点node系列-stream
  10. PHP弱类型总结