NPOI复制模板导出Excel
本人菜鸟实习生一枚,公司给我安排了一个excel导出功能。要求如下:1、导出excel文件有样式要求;2、导出excel包含一个或多个工作表;3、功能做活(我的理解就是excel样式以后可能会变方便维护修改);如何图所示是公司提供的excel模板
导出excel的功能之前在学校做过,我的第一个想到的是使用Microsoft.Office.Interop.Excel.dll读取Excel文件,但是公司的电脑上没有安装office没有相应的组件,我只能换种方法查了资料最后决定使用NPOI。用什么的问题解决了后面该想想怎么做了,当时想自己用代码写样式不过盯着模板看了一会后想想自己写不现实而且不便于后期维护(其实就是会写)。于是换种思路通过复制模板生产中间excel进行导出即使以后样式要修改也可以通过修改模板来实现尽量不去动代码。下面是代码
/// <summary>
/// 复制sheet
/// </summary>
/// <param name="bjDt">sheet名集合</param>
/// <param name="modelfilename">模板附件名</param>
/// <param name="tpath">生成文件路径</param>
/// <returns></returns>
public HSSFWorkbook SheetCopy(DataTable bjDt,string modelfilename, out string tpath)
{
string templetfilepath = @"files\" + modelfilename + ".xls";//模版Excel tpath = @"files\download\" + modelfilename + DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".xls";//中介Excel,以它为中介来导出,避免直接使用模块Excel而改变模块的格式
FileInfo ff = new FileInfo(tpath);
if (ff.Exists)
{
ff.Delete();
}
FileStream fs = File.Create(tpath);//创建中间excel
HSSFWorkbook x1 = new HSSFWorkbook();
x1.Write(fs);
fs.Close();
FileStream fileRead = new FileStream(templetfilepath, FileMode.Open, FileAccess.Read);
HSSFWorkbook hssfworkbook = new HSSFWorkbook(fileRead);
FileStream fileSave2 = new FileStream(tpath, FileMode.Open, FileAccess.Read);
HSSFWorkbook book2 = new HSSFWorkbook(fileSave2);
HSSFWorkbook[] book=new HSSFWorkbook[]{book2,hssfworkbook};
HSSFSheet CPS = hssfworkbook.GetSheet("Sheet0") as HSSFSheet;//获得模板sheet
string rsbh=bjDt.Rows[]["name"].ToString();
CPS.CopyTo(book2,rsbh , true, true);//将模板sheet复制到目标sheet
HSSFSheet sheet = book2.GetSheet(bjDt.Rows[]["name"].ToString()) as HSSFSheet;//获得当前sheet
for (int i = ; i < bjDt.Rows.Count; i++)
{
sheet.CopySheet(bjDt.Rows[i]["name"].ToString(), true);//将sheet复制到同一excel的其他sheet上
}
return book2;
}
中介excel生成后进行数据填充
/// <summary>
/// 将datatable数据导出到excel
/// </summary>
/// <param name="bjDt">sheet名集合</param>
/// <param name="stuDt">填充数据</param>
/// <param name="modelfilename">模板名</param>
/// <returns></returns>
public string DataTableToExcel(DataTable bjDt, DataTable stuDt,string modelfilename)
{
string path = "";
HSSFWorkbook book2 = SheetCopy(bjDt,modelfilename,out path);
for (int j = ; j < bjDt.Rows.Count; j++)
{
HSSFSheet sheets = book2.GetSheet(bjDt.Rows[j]["name"].ToString()) as HSSFSheet;
sheets.GetRow().GetCell().SetCellValue(bjDt.Rows[j]["name"].ToString());
DataRow[] strDt = stuDt.Select(" name='" + bjDt.Rows[j]["name"].ToString() + "'");//筛选出对应的工作表下的数据
int rowIndex = ;
for (int i = ; i < strDt.Length;i++ )
{
HSSFRow row0 = sheets.GetRow(rowIndex) as HSSFRow; //第几行
HSSFCell cell0 = row0.GetCell() as HSSFCell; //第几列
cell0.SetCellValue(strDt[i]["ID"].ToString()); //数据填充
rowIndex++;
}
}
using (FileStream fileSave = new FileStream(path, FileMode.Open, FileAccess.Write))
{
book2.Write(fileSave);
}
return path;
}
下载excel
void FileDown(string url)
{
string fileName = "test.xls";//客户端保存的文件名
string filePath = url;//路径 FileInfo fileInfo = new FileInfo(filePath);
Response.Clear();
Response.ClearContent();
Response.ClearHeaders();
Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName);
Response.AddHeader("Content-Length", fileInfo.Length.ToString());
Response.AddHeader("Content-Transfer-Encoding", "binary");
Response.ContentType = "application/octet-stream";
Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");
Response.WriteFile(fileInfo.FullName);
Response.Flush();
Response.End();
}
导出后excel如图
本人菜鸟一枚如有不足之处请多包涵和提点。
NPOI复制模板导出Excel的更多相关文章
- WeihanLi.Npoi 根据模板导出Excel
WeihanLi.Npoi 根据模板导出Excel Intro 原来的导出方式比较适用于比较简单的导出,每一条数据在一行,数据列虽然自定义程度比较高,如果要一条数据对应多行就做不到了,于是就想支持根据 ...
- ASP.NET Core 2.2 : 十六.扒一扒新的Endpoint路由方案 try.dot.net 的正确使用姿势 .Net NPOI 根据excel模板导出excel、直接生成excel .Net NPOI 上传excel文件、提交后台获取excel里的数据
ASP.NET Core 2.2 : 十六.扒一扒新的Endpoint路由方案 ASP.NET Core 从2.2版本开始,采用了一个新的名为Endpoint的路由方案,与原来的方案在使用上差别不 ...
- .Net NPOI 根据excel模板导出excel、直接生成excel
一.根据Excel模板导出excel 1.导入NPOI.dll 2.DAL中添加类ExportExcel.cs using NPOI.SS.UserModel; using System; usin ...
- apache poi根据模板导出excel
需要预先新建编辑好一个excel文件,设置好样式. 编辑好输出的数据,根据excel坐标一一对应. 支持列表数据输出,列表中列合并. 代码如下: package com.icourt.util; im ...
- aspose.cells根据模板导出excel
又隔十多天没写博客了,最近都在忙项目的事情,公司人事变动也比较大,手头上就又多了一个项目.最近做用aspose.cells根据模板导出excel报价单的功能,顺便把相关的核心记下来,先上模板和导出的效 ...
- POI通过模板导出EXCEL文件
一般的EXCEL导出使用POI先创建一个HSSFWorkbook,然后通过不断创建HSSFRow,HSSFCell后设置单元格内容便可以完成导出. 这次在项目中需要用到模板,导出的内容包括(1.模板中 ...
- 按模板导出Excel
说明:开发环境 vs2012 asp.net mvc4 c# 注意:Excel模板有多个sheet页,导出Excel的时候,同时给多个sheet页填充数据 1.项目结构 3.Excel模板(注意she ...
- Java无模板导出Excel,Apache-POI插件实现
开发环境 jdk 1.8 Maven 3.6 Tomcat 8.5 SpringBoot 2.1.4.RELEASE Apache-POI 3.6 Idea 注意: 我是在现有的基于SpringBoo ...
- poi根据excel模板导出Excel
/****单元格值对象**/public class Cells { /*** * 行 */ private int row; /** * 列 */ private int column; /** * ...
随机推荐
- chrome浏览器中解决embed标签 loop="true" 背景音乐无法循环的问题。
今天试了下在html网页中加入背景音乐并设置为循环播放.一开始用<embed>标签,设置loop="true", 但是结果发现在IE浏览器可以,但是在chrome浏览器 ...
- String类的转换功能
/* * String类的转换功能 * char[] toCharArray():把字符串转换为字符数组 * String toLowerCase():把字符串转换为小写字符串 * String to ...
- Sublime text如何设置快捷键让编写的HTML文件在浏览器预览?
STEP 1 Tools->Build System->New Build System STEP 2<img src="https://pic3.zhimg.com/ ...
- [luoguP3047] [USACO12FEB]附近的牛Nearby Cows(DP)
传送门 dp[i][j][0] 表示点 i 在以 i 为根的子树中范围为 j 的解 dp[i][j][1] 表示点 i 在除去 以 i 为根的子树中范围为 j 的解 状态转移就很好写了 ——代码 #i ...
- dubbo 学习1
1.高性能优秀的服务框架,应用可通过高性能的RPC实现服务的输出和输入功能,可以和spring框架无缝集成. 2.主要核心部件 a.remoting 网络通信框架 实现了sync-over-asnc ...
- Java使用JNA调用DLL库
Java调用DLL方法有三种,JNI.JNA.JNative, 本文为JNA JNA为使用jna.jar包,下载地址:http://www.java2s.com/Code/Jar/j/Download ...
- CentOS6.5 64位站点压力測试工具webbench
在Apache中有自带的ab命令能够測试服务的压力,而nginx没有自带的命令,必需要採用第三方软件来測试.今天就简介一下webbench对nginx的压力測试,压力測试是对系统管理员和运维人员必须的 ...
- 在Ubuntu平台上创建Cordova Camera HTML5应用
在这篇文章中,我们将具体介绍怎样使用Cordova Camera HTML5 应用.很多其它关于Cordova的开发指南,开发人员能够參考文章"the Cordova Guide" ...
- 你有必要知道的 25 个 JavaScript 面试题
1.使用 typeof bar === "object" 推断 bar 是不是一个对象有神马潜在的弊端?怎样避免这样的弊端? 使用 typeof 的弊端是显而易见的(这样的弊端同使 ...
- UVA 10385 - Duathlon(三分法)
UVA 10385 - Duathlon 题目链接 题意:一些运动员,參加铁人两项,跑步r千米,骑车k千米,如今知道每一个人的跑步和骑车速度,问是否能设置一个r和k,保持r + k = t,使得第n个 ...