最近项目中,根据用户要求,需要批量导出Excel(系统里每天产生很多单子,以前都是一个一个的导出的,最近用户要求输入日期,导出该天所有单子)。

原来是使用NPOI操作Excel。自以为是的以为批量导出不就是把该天所有单子都查询出来,写个循环一个一个导出就OK了。

可是写好之后运行时才发现,导出第一个Excel后,页面就没有反应了,貌似是输出流已关闭,可是不关闭时测试后还是不行。

就开始换个思路了,我不导出多个Excel,我就只导出一个,而每个单子分别导入一个Sheet里,就是说导出到同一个Excel里的多个工作簿Sheet里。

由于我用的Excel模块,所有首先需要根据单子的数量来创建相应数量的Sheet,而且每个Sheet的格式须和第一模版Sheet的格式一样。

经过多次撞墙,代码也终于出来了:

复制Sheet

当然首先要引入命名空间:

using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;

string templetfilepath = @"E:\000\template.xls";//模版Excelstring tpath = @"E:\000\out.xls";//中介Excel,以它为中介来导出,避免直接使用模块Excel而改变模块的格式FileInfo ff = new FileInfo(tpath);if (ff.Exists){ff.Delete();}FileStream fs = File.Create(tpath);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);HSSFSheet CPS = hssfworkbook.GetSheet("Sheet0") as HSSFSheet;for (int i = 0; i <= dty1.Rows.Count - 1; i++)//dty1是我用SQL查询出来当天单子集合{CPS.CopyTo(book2, "Sheet" + i.ToString(), true, true);using (FileStream fileSave = new FileStream(tpath, FileMode.Open, FileAccess.Write)){book2.Write(fileSave);}}

模版:

新生成的:

表示按模块Excel中Sheet0的样式复制创建的多个Sheet的新Excel。

当然如果你需要在通过复制在原Excel里创建Sheet的话也是可以的,就把上面的中介Excel操作那部门不要,把CopyTo函数那里修改一下就可以了。

删除Excel中的Sheet:

string templetfilepath = @"E:\000\template.xls";//string tpath = @"E:\000\out.xls";string tpath = @"E:\000\out.xls";FileInfo ff = new FileInfo(tpath);if (ff.Exists){ff.Delete();}FileStream fs = File.Create(tpath);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);int sheetnumber = book2.Workbook.NumSheets - 1;for (int x = 0; x < sheetnumber; x++)//{book2.RemoveSheetAt(1);//如果你要保留第一个Sheet,这里参数就设置为1,如果你要全部都删除这里设为0(表示每次都删除第一个Sheet)}using (FileStream fileSave = new FileStream(tpath, FileMode.Open, FileAccess.Write)){book2.Write(fileSave);}

至于循环把集合导入到Excel的多个Sheet里,我也懒得描述了,思路知道了,代码都不难,我就直接帖代码了:

<span style="font-size:14px;">int j = 0;foreach (DataRow dr in dty1.Rows){SqlHelp sqlx1 = new SqlHelp();string strfax1 = "select * from tOrderProductInformation where SerialNumber='" + dr["SerialNumber"].ToString() + "' and Record='" + dr["Record"].ToString() + "' and bEffective='True'";DataTable dtx1 = sqlx1.GetDataTable(strfax1);sqlx1.SqlClose();// ToExcel(hssfworkbook,j, dr["OrderID"].ToString(), dr["SerialNumber"].ToString(), templetfilepath, dtx1, dr["CustomCode"].ToString());string OrderID = dr["OrderID"].ToString();string sns = dr["SerialNumber"].ToString();DataTable dt = dtx1;string CustomCode = dr["CustomCode"].ToString();string loginid = Session["LoginID"].ToString();Authority ac = new Authority();int tp = Convert.ToInt32(Session["Power"].ToString());bool ap = ac.JudgeAuthority(loginid, "a1213");//价格/客户名称查看权限bool an = ac.JudgeAuthority(loginid, "a1215");//交换机型号查看权限bool ar = ac.JudgeHeadAuthority(loginid, CustomCode);bool at = ac.JudgeViewAuthority(loginid, CustomCode);bool az = ac.JudgeAuthority(loginid, "a1216");//无价格订单查询HSSFSheet ws = (HSSFSheet)book2.GetSheet("Sheet" + j.ToString());//添加或修改WorkSheet里的数据 #region//给Excel单元格赋值SqlHelp sqlf = new SqlHelp();string strfacf = "select * from tOrderReview where OrderID='" + OrderID + "' and aEffective='True'";//string strfacf = "select * from tOrderReview a where not exists(select 1 from tOrderReview where SerialNumber=a.SerialNumber and Record>a.Record) and SerialNumber='" + lb_serialnum.Text.ToString() + "'";SqlDataReader drf = sqlf.ExecuteReader(strfacf);drf.Read();if (drf.HasRows){ws.GetRow(5).GetCell(15).SetCellValue(sns);ws.GetRow(6).GetCell(2).SetCellValue(drf["CustomCode"].ToString());ws.GetRow(6).GetCell(4).SetCellValue(drf["CustomName"].ToString());ws.GetRow(6).GetCell(10).SetCellValue(drf["OrderSource"].ToString());ws.GetRow(6).GetCell(15).SetCellValue(drf["OrderGrade"].ToString());ws.GetRow(7).GetCell(2).SetCellValue(drf["SubmitDate"].ToString());ws.GetRow(7).GetCell(4).SetCellValue(drf["DeliveryDate"].ToString());ws.GetRow(7).GetCell(7).SetCellValue(drf["OrderSort"].ToString());ws.GetRow(7).GetCell(16).SetCellValue(drf["CustomPO"].ToString());ws.GetRow(15).GetCell(1).SetCellValue(drf["PruchasingOpinion"].ToString());ws.GetRow(16).GetCell(3).SetCellValue(drf["PurchasingName"].ToString());ws.GetRow(15).GetCell(4).SetCellValue(drf["PDOpinion"].ToString());ws.GetRow(16).GetCell(6).SetCellValue(drf["PDName"].ToString());ws.GetRow(15).GetCell(9).SetCellValue(drf["QualityOpinion"].ToString());ws.GetRow(16).GetCell(11).SetCellValue(drf["QualityName"].ToString());ws.GetRow(15).GetCell(13).SetCellValue(drf["FinanceOpinion"].ToString());ws.GetRow(16).GetCell(15).SetCellValue(drf["FinanceName"].ToString());ws.GetRow(17).GetCell(3).SetCellValue(drf["ApplicantName"].ToString());ws.GetRow(17).GetCell(6).SetCellValue(drf["MarketName"].ToString());ws.GetRow(17).GetCell(10).SetCellValue(drf["AddApprovalName"].ToString());ws.GetRow(17).GetCell(15).SetCellValue(drf["LeaderName"].ToString());ws.GetRow(18).GetCell(2).SetCellValue(drf["CommerceOpinion"].ToString());ws.GetRow(18).GetCell(4).SetCellValue(drf["MarketOpinion"].ToString());ws.GetRow(18).GetCell(8).SetCellValue(drf["AddOpinion"].ToString());ws.GetRow(18).GetCell(13).SetCellValue(drf["LeaderOpinion"].ToString());}drf.Dispose();sqlf.SqlClose();IRow mySourceStyleRow = ws.GetRow(10);//获取源格式行if (dt.Rows.Count > 3){MyInsertRow(ws, 12, dt.Rows.Count - 3, mySourceStyleRow);//模版中已有3行,现在须调用函数插入DataTable行数-3行}if (dt.Rows.Count > 0){for (int n = 0; n < dt.Rows.Count; n++){ws.GetRow(n + 10).GetCell(0).SetCellValue(n + 1);ws.GetRow(n + 10).GetCell(1).SetCellValue(dt.Rows[n]["ProductCode"].ToString());ws.GetRow(n + 10).GetCell(2).SetCellValue(dt.Rows[n]["ProductModel"].ToString());ws.GetRow(n + 10).GetCell(3).SetCellValue(dt.Rows[n]["CustomVersion"].ToString());ws.GetRow(n + 10).GetCell(4).SetCellValue(dt.Rows[n]["Amount"].ToString());if (!ap)//不满足【价格、客户名称查看权限】{if (ar || at)//但是满足该客户的下单、查看权限{ws.GetRow(n + 10).GetCell(5).SetCellValue(dt.Rows[n]["ProductPrice"].ToString());}else{ws.GetRow(n + 10).GetCell(5).SetCellValue("*");}}else{ws.GetRow(n + 10).GetCell(5).SetCellValue(dt.Rows[n]["ProductPrice"].ToString());}if (az){ws.GetRow(n + 10).GetCell(5).SetCellValue("*");}ws.GetRow(n + 10).GetCell(6).SetCellValue(dt.Rows[n]["TechnicalIndicator"].ToString());ws.GetRow(n + 10).GetCell(7).SetCellValue(dt.Rows[n]["Label"].ToString());ws.GetRow(n + 10).GetCell(8).SetCellValue(dt.Rows[n]["ProductShell"].ToString());ws.GetRow(n + 10).GetCell(9).SetCellValue(dt.Rows[n]["ProductPackage"].ToString());ws.GetRow(n + 10).GetCell(10).SetCellValue(dt.Rows[n]["Soft"].ToString());ws.GetRow(n + 10).GetCell(11).SetCellValue(dt.Rows[n]["CodeType"].ToString());ws.GetRow(n + 10).GetCell(12).SetCellValue(dt.Rows[n]["VendorName"].ToString());ws.GetRow(n + 10).GetCell(13).SetCellValue(dt.Rows[n]["PN"].ToString());ws.GetRow(n + 10).GetCell(14).SetCellValue(dt.Rows[n]["SN"].ToString());ws.GetRow(n + 10).GetCell(15).SetCellValue(dt.Rows[n]["TestReport"].ToString());ws.GetRow(n + 10).GetCell(16).SetCellValue(dt.Rows[n]["ReviewTabel"].ToString());ws.GetRow(n + 10).GetCell(17).SetCellValue(dt.Rows[n]["Remarks"].ToString());if (an || ar){ws.GetRow(n + 10).GetCell(18).SetCellValue(dt.Rows[n]["SwitchType"].ToString());}else{ws.GetRow(n + 10).GetCell(18).SetCellValue("");}}}#endregionws.ForceFormulaRecalculation = true;j++;}using (FileStream filess = File.OpenWrite(tpath)){book2.Write(filess);}//filess.Close();  System.IO.FileInfo filet = new System.IO.FileInfo(tpath);Response.Clear();Response.Charset = "GB2312";Response.ContentEncoding = System.Text.Encoding.UTF8;// 添加头信息,为"文件下载/另存为"对话框指定默认文件名   Response.AddHeader("Content-Disposition", "attachment; filename=" + Server.UrlEncode(SearchText + ".xls"));// 添加头信息,指定文件大小,让浏览器能够显示下载进度   Response.AddHeader("Content-Length", filet.Length.ToString());// 指定返回的是一个不能被客户端读取的流,必须被下载   Response.ContentType = "application/ms-excel";// 把文件流发送到客户端   Response.WriteFile(filet.FullName);// 停止页面的执行   Response.End();</span>

NPOI复制Excel工作簿Sheet以及删除Excel工作簿相关推荐

  1. 笔记:删除excel中的sheet,删除sheet中的具体某一列

    # 删除excel中指定工作簿 import openpyxl # 载入工作簿 workbook = openpyxl.load_workbook('study.xlsx') # 执行删除操作,删除s ...

  2. java excel 空行_java使用poi删除excel中的空行

    根据自己实际操作,poi中lastRowNum方法获取行数的是excel最后有数据的一行,从0开始 而physicalNumberOfRows方法获取的行数是excel最后有数据的一行减去最后一行之前 ...

  3. 从DataTable导出Excel,并下载,删除Excel进程。

    页面上加入一个button即可. 源代码如下: using System; using System.Collections; using System.ComponentModel; using S ...

  4. python去除excel空行_python中如何删除excel的行?

    Excel删除有两种情况, 一种是,您想删除后,留空 另外一种是,您想删除后,后面数据动态填充前面的数据 针对第二种,有一个不是太高效的办法,就是: 利用column读取后是list这个特点,删除li ...

  5. 【Matlab 根据Excel名和sheet名字删除sheet】

    免责声明 Copyright © 2019, Pruthvi Raj Gampalwar All rights reserved. Redistribution and use in source a ...

  6. Excel收纳箱:VBA一键删除当前工作表的条件格式

    如下图所示想删除表中多个区域的条件格式,如何完成操作呢? (方方格子插件) 1.选择diy工具箱操作 ​ 2.选择最左侧的收纳箱工具 3.弹出对话框我们选择一个本地新建的操作 4.弹出对话框我们输入如 ...

  7. java excel 超链接_Java 编辑、删除Excel中的超链接

    本文介绍如何编辑Excel文档中的超链接,包括编辑超链接显示文本.链接地址及删除指定超链接.使用免费版Excel类库工具,Free Spire.XLS for Java.Jar包获取可在官方网站下载, ...

  8. python实现跨excel的工作表sheet之间的复制

    百度搜索问题:python复制Excel中的sheet到另外一个工作簿 其中一篇文章: 地址:https://blog.csdn.net/lingan_hong/article/details/727 ...

  9. excel清空sheet内容 poi_POI操作Excel:隐藏、删除Excel中指定的Sheet

    使用POI操作Excel时如何隐藏.删除Excel中指定的Sheet呢?在POI的API中的HSSFWorkbook类提供了相关的方法, (1)隐藏Sheet: setSheetHidden(int ...

最新文章

  1. Smart field 1 how is smartField controller loaded - how is main view defined in manifest.json
  2. java全文检索工具_全文检索工具elasticsearch:第三章: Java程序中的应用
  3. java反编译工具_Java开发必会的反编译知识(附支持对Lambda进行反编译的工具)...
  4. C语言实现tolower
  5. java中能对属性封装吗_JAVA中的封装
  6. SVN使用教程总结[转]
  7. 计算机显示的网络,如何设置在电脑右下角显示网络连接图标
  8. 2022年浙江省电子设计大赛C题小车跟随系统
  9. foobox 4.2(foobar2000 CUI配置)
  10. Bootstrap导航--三级菜单
  11. java jersey使用总结_jersey Java Jersey配置
  12. 原子范数最小化(Atomic Norm Minimization)
  13. 无法创建目录d oracle,Qt无法创建目录(Qt could not create directory)
  14. vue element-ui table表格自定义纵向合计横向合计
  15. Spring理论--Spring MVC学习
  16. Win 10出现bitlocke恢复,蓝屏错误代码0x1600007e
  17. 我的世界Java版最大村庄_我的世界:java版完美种子,开局两村庄齐铁套
  18. 11 个最佳免费安全网站
  19. python27读书笔记0.1
  20. CSDN - 盛洪宇(技术胖) - Vue2.x从入门到实战

热门文章

  1. [情人节特辑]如何用简单好看html代码制作H5轮播图
  2. android 音乐播放器设计,基于Android音乐播放器设计的实现毕业论文.pdf
  3. 程序员为维持游戏开发被迫炒股
  4. catid=454,罗氏454测序用于野生双峰驼基因组图谱绘制
  5. STM32F4无人机动力旋翼拉力测试
  6. linux去掉鼠标精确度,关于鼠标的速度与精度
  7. 智慧农业物联网常见项目应用
  8. 单例模式之饿汉和懒汉(java)
  9. 老黄历数据难找?自写代码爬取
  10. Word中表格分页前一页没有下横线(边框)问题的解决