C# 导出excel的压缩包到浏览器页面
需求背景:TCX_1710项目产品质量导出功能,客户希望每个总成导出到一个Excel表中
实现分析:客户选择时间段,点击导出按钮,默认导出开始时间当天的数据,每个总成一个Excel,将各个Excel打包压缩,返回压缩包到浏览器页面供客户下载
控制器类:
/// <summary>
/// 导出产品质量信息(每个总成一个Excel)
/// </summary>
/// <param name="keyword"></param>
/// <returns></returns>
public void exportExcel(string keyword)
{
string SNum = Request.QueryString["SNum"];
string PSCode = Request.QueryString["PSCode"];
string StartTime = Request.QueryString["StartTime"];
string EndTime = Request.QueryString["EndTime"];
//dictionary根据以上查询条件查询的数据字典
Dictionary<string, Dictionary<string, List<PR_Product>>> dictionary = new Dictionary<string, Dictionary<string, List<PR_Product>>>();
if (keyword == "TimeAndSnum")
{
dictionary = this.CreateService<IProductInfoAppServices>().GetDictionary("TimeAndSnum", SNum, PSCode, StartTime, EndTime);
}
else
{
dictionary = this.CreateService<IProductInfoAppServices>().GetDictionary("NoTimeNoSnum", SNum, PSCode, StartTime, EndTime);
}
//初始化需要导出字段
List<ExportFieldInfo> fieldInfo10 = new List<ExportFieldInfo>();
var tableInfo10 = this.CreateService<IProductInfoAppServices>().getFiledByTable();
for (var i = ; i < tableInfo10.Count; i++)
{
fieldInfo10.Add(new ExportFieldInfo()
{
FieldName = tableInfo10[i].filedName,
DisplayName = tableInfo10[i].filedExplain,
DataType = DataTypeEnum.String
});
}
string filePath = ConfigurationManager.AppSettings["filePath"];//配置写在E:\MyProject\1710\02_代码\DoMes.Web\Configs\system.config
//string filePath = "F:\\exporfolder";
FileStream stream = ExcelHelper<PR_Product>.ToExcel(filePath, dictionary, fieldInfo10, Response);
Response.Flush();
Response.End();//关闭响应
stream.Close();//关闭zip流,否则无法删除zip文件
//获取指定路径下所有文件夹
//string[] folderPaths = Directory.GetDirectories(filePath);
//获取指定路径下所有文件
var filePaths = Directory.GetFiles(filePath);
foreach (string filePath_2 in filePaths)
{
//删除所有文件
System.IO.File.Delete(filePath_2);
}
//foreach (string folderPath in folderPaths)
//{
// Directory.Delete(folderPath, true);
//}
//删除最外面的文件夹
Directory.Delete(filePath, true);
}
获取数据的方法:
/// <summary>
/// 根据查询条件获取数据,并将数据转换为数据字典
/// </summary>
/// <param name="type">查询类型(暂时不用)</param>
/// <param name="sNum">产品总成</param>
/// <param name="pSCode">工位</param>
/// <param name="startTime">开始时间</param>
/// <param name="endTime">结束时间</param>
/// <returns></returns>
public Dictionary<string, Dictionary<string, List<PR_Product>>> GetDictionary(string type, string sNum, string pSCode, string startTime, string endTime)
{
//第一层key为日期(年/月/日),value为该日所有总成的数据字典集合
//第二层key为总成,value为该总成所有的质量数据
Dictionary<string, Dictionary<string, List<PR_Product>>> dictionary = new Dictionary<string, Dictionary<string, List<PR_Product>>>();
Expression<Func<PR_Product, bool>> exp = (a => == );
if (!string.IsNullOrEmpty(pSCode))
{
exp = exp.And(a => a.PSCode == pSCode);
}
if (!string.IsNullOrEmpty(startTime))
{
DateTime ctStart = Convert.ToDateTime(startTime);
exp = exp.And(a => a.CreationTime >= ctStart);
}
if (!string.IsNullOrEmpty(endTime))
{
DateTime ctEnd = Convert.ToDateTime(endTime);
exp = exp.And(a => a.CreationTime < ctEnd.AddDays());
}
if (!string.IsNullOrEmpty(sNum))
{
exp = exp.And(a => a.SNum.Contains(sNum));
}
//根据查询条件获得的产品质量数据
List<PR_Product> product = this.DbContext.Query<PR_Product>().Where(exp).OrderBy(a => a.SNum).ThenBy(it => it.PSCode).ToList();
//产品总成不为空则只有一个总成
if (!string.IsNullOrEmpty(sNum))
{
Dictionary<string, List<PR_Product>> dictionary2 = new Dictionary<string, List<PR_Product>>();
dictionary2.Add(sNum, product);
dictionary.Add(startTime, dictionary2);
}
else//产品总成为空
{
Dictionary<string, List<PR_Product>> dictionary2 = new Dictionary<string, List<PR_Product>>();
//从查询的数据集合中查询出所有的总成
List<PR_Product> snumDistinct = product.Where((x, firstId) => product.FindIndex(z => z.SNum == x.SNum) == firstId).ToList();
foreach(PR_Product item in snumDistinct)
{
//从大数据集合中查找该总成的数据集合
List<PR_Product> snumList = product.Where(x => x.SNum == item.SNum).ToList();
dictionary2.Add(item.SNum, snumList);
}
dictionary.Add(startTime, dictionary2);
}
return dictionary;
}
Excel文件帮助类方法:
/// <summary>
/// 导出产品质量数据,每个总成一个Excel
/// </summary>
/// <param name="filePath">导出文件路径</param>
/// <param name="dictionary">导出数据字典</param>
/// <param name="fieldInfies">导出数据表头</param>
/// <param name="Response">页面响应</param>
/// <returns></returns>
public static FileStream ToExcel(String filePath, Dictionary<string, Dictionary<string, List<T>>> dictionary, List<ExportFieldInfo> fieldInfies, HttpResponseBase Response)
{
//导出文件路径(这里也可以写成固定路径"F:\\exporfolder")
//String filePath = "F:\\exporfolder";
//创建此路径(配置文件中的地址一定要保证磁盘存在)
Directory.CreateDirectory(filePath);
//导出压缩文件的全路径(zipFilePath)
DateTime dateTimeZip = DateTime.Now;
string zipFilePath = filePath + Path.DirectorySeparatorChar + "QM_" + dateTimeZip.ToString("yyyyMMdd") + "_" + dateTimeZip.ToString("HHmmss") + "_" + dateTimeZip.ToString("fff") + ".zip";
//导出Excel文件路径
string fullFilePath = "";
//保存Excel文件名
string fileName = "";
//用于存放生成的Excel文件名称集合
List<string> fileNames = new List<string>();
//excel文件流
FileStream excel = null;
foreach (Dictionary<string, List<T>> items in dictionary.Values)
{
foreach (var item in items)
{
DateTime dateTimeExcel = DateTime.Now;
//Excel文件名
fileName = item.Key + "_" + dateTimeExcel.ToString("yyyyMMdd") + "_" + dateTimeExcel.ToString("HHmmss") + "_" + dateTimeExcel.ToString("fff") + ".xlsx";
//Excel文件路径
fullFilePath = filePath + Path.DirectorySeparatorChar + fileName;
//存放到Excel文件名称集合
fileNames.Add(fullFilePath);
excel = File.Create(fullFilePath);
HSSFWorkbook book = createColumnHSSF(item.Key, item.Value, fieldInfies);
// 写文件
book.Write(excel);
excel.Close();
}
}
FileStream stream = ZipFiles(fileNames, zipFilePath, Response);
return stream;
}
/// <summary>
/// 压缩多个文件
/// </summary>
/// <param name="filesToZip">要进行压缩的文件名集合</param>
/// <param name="zipedFile">压缩后生成的压缩文件名</param>
public static FileStream ZipFiles(List<string> filesToZip, string zipedFile, HttpResponseBase Response)
{
Response.AddHeader("content-disposition", "attachment;filename=" + zipedFile.Substring(zipedFile.LastIndexOf("\\", StringComparison.Ordinal) + ) );
//Zip文件流
FileStream zipFile = File.Create(zipedFile);
//将zipStream写到响应输出流中
ZipOutputStream zipStream = new ZipOutputStream(Response.OutputStream);
//遍历所有的Excel文件
foreach (string fileToZip in filesToZip)
{
if (string.IsNullOrEmpty(fileToZip))
{
throw new ArgumentException(fileToZip);
}
if (string.IsNullOrEmpty(zipedFile))
{
throw new ArgumentException(zipedFile);
}
if (!File.Exists(fileToZip))
{
throw new FileNotFoundException("指定要压缩的文件: " + fileToZip + " 不存在!");
}
try
{
//读取Excel文件到文件流中
using (var fs = File.OpenRead(fileToZip))
{
var buffer = new byte[fs.Length];
fs.Read(buffer, , buffer.Length);
fs.Close();
//从Excel文件路径中读取Excel文件名
var fileName = fileToZip.Substring(fileToZip.LastIndexOf("\\", StringComparison.Ordinal) + );
//根据文件名创建ZipEntry
var zipEntry = new ZipEntry(fileName);
//将ZipEntry放入zipStream流中
zipStream.PutNextEntry(zipEntry);
zipStream.SetLevel();
zipStream.Write(buffer, , buffer.Length);
}
}
catch (IOException ioex)
{
throw new IOException(ioex.Message);
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
//zipStream完成后返回
zipStream.Finish();
return zipFile;
}
C# 导出excel的压缩包到浏览器页面的更多相关文章
- 关于使用ajax导出excel问题
最近有个需求是在页面导入文件,后端进行处理后返回处理结果的excel,前端使用的是ajax.我最开始的做法是:在原有代码后加一段导出excel的代码,结果代码能正常运行,但页面始终没有返回我需要的ex ...
- 导出excel 的方法及示例
一.基本知识 1.Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能. 2. HSSF 是Horribl ...
- Java POI导出Excel不弹框选择下载路径(下载文件不选择下载路径,默认) Chrome
在Chrome浏览器中,Java导出Excel文件时,浏览器弹出提示框,需要选择下载路径 在Chrome中的高级设置中,把“下载前询问每个文件的保存位置”去掉就解决了 DEEPLOVE(LC)
- HTML导出Excel文件(兼容IE及所有浏览器)
注意:IE浏览器需要以下设置: 打开IE,在常用工具栏中选择“工具”--->Internet选项---->选择"安全"标签页--->选择"自定义级别&q ...
- JavaScript 上万条数据 导出Excel文件 页面卡死
最近项目要js实现将数据导出excel文件,网上很多插件实现~~那个开心呀,谁知道后面数据量达到上万条时出问题:浏览器不仅卡死,导出的excel文件一直提示网络失败.... debug调试发现var ...
- jsp 页面导出excel时字符串数字变成科学计数法的解决方法
web导出excel数据格式化 原文地址:http://www.cnblogs.com/myaspnet/archive/2011/05/06/2038490.html 当我们把web页面上的数据 ...
- 浏览器端JS导出EXCEL
浏览器端JS导出EXCEL FileSaver.js 实现了在本身不支持 HTML5 W3C saveAs() FileSaver 接口的浏览器支持文件保存.FileSaver.js 在客户端保存文件 ...
- 360浏览器导出Excel闪退BUG
最近这半个月在疯狂的修改各种BUG,所以比较少更新博客. 现在谈谈这个360浏览器导出Excel的BUG的解决方法. 该BUG常出现在win7系统与xp系统导出Excel的瞬间关闭导出弹窗. 目前互联 ...
- 分享一个导出Excel时页面不跳转的小技巧
今天在点击客户档案导出的时候,发现先是打开了一个新标签,然后新标签自动关掉,弹出一个文件下载确认的窗口,点击确认后开始下载导出的Excel文件.这样的过程感觉窗口闪来闪去,而且可能会给用户带来困惑,是 ...
随机推荐
- HTML iframe 和 frameset 的区别
转自:http://www.cnblogs.com/polk6/archive/2013/05/24/3097430.html HTML iframe 和 frameset 的区别 iframe 和 ...
- HIT Software Construction Lab 2
2019年春季学期 计算机学院<软件构造>课程 Lab 2实验报告 姓名 刘帅 学号 班号 1703008 电子邮件 1609192321@qq.com 手机号码 目录 1 实验目标概 ...
- adplus 抓取dump
工具所在路径 C:\Program Files\Windows Kits\10\Debuggers\x64 cmd窗口切换目录倒adplus所在路径下,输入抓取命令.adplus -hang -p ...
- The German Collegiate Programming Contest 2017
B - Building 给一个m各面的多边形柱体,每一侧面有n*n个格子,现在对这些格子染色,看有多少种方式使得多面柱体无论如何旋转都不会与另一个一样. #include <bits/stdc ...
- CDR X6打了3折,再送魔镜插件,是真的么?
明人不说暗话,我.要.来.个.小.资.讯. CDR X6打了3折,再送魔镜插件,是真的么? 先来说说CorelDRAW,CorelDRAW众所周知,软件的确不便宜啊,对于个人来说,相当于一个高配苹 ...
- ZBrush软件如何编辑物体
新手在刚接触ZBrush®的时候,想要选中模型进行编辑,有时怎么都选不中,当再次画的时候只能在边上新建一个,还是不能进行编辑,遇到类似问题,你是如何解决的,本文将为您讲解ZBrush中怎么选中物体并进 ...
- 利用cookie判断文件下载完成
在网页下载文件时,该文件又是通过后台代码生成的,比如报表之类的.当需要生成文件过大时会耗费很多时间,而文件生成好传到页面的时候也没有事件可以监听它,像微软官网,谷歌,百度等下载方式都是通过提示五秒过后 ...
- oracle中nvl函数用法
1.返回两个字段中非空字段的值,第一个字段非空,返回第一个字段的值,第二个字段值为null,则返回第二个字段的值,如果都为null 则返回null. select nvl(a,b) from tabl ...
- 使用sourceMap文件定位小程序错误信息
sourceMap是什么 在前端开发过程中代码难免会有错误,即便是再小心,也有可能出现 Cannot read property 'xxx' of null 这样的低级失误,debug自然是家常便饭. ...
- laravel save() 返回 null
原因:引用其他方法时,没有 return save()的操作结果. 在使用save()方法时,发现返回值是:null: