平时做项目过程中经常会遇到一些导入导出的功能,今天偶得一小空 整理一下
(如果有不对的地方还请大家指正,平时解决问题就顺手记录一下,以方便其他的小伙伴参考)
首先如下基础的项目过程图:
1.基础的自己构建的html
2.jQuery.Upload插件
好,入正题,今天主要记录一下下载机能,以NPOI下载方法为例
下载其实方法多多,每个人可能都有自己的常用方法,但我感觉下载无非两种方式,
1.直接手动生成一份文档,填充数据,下载
HSSFWorkbook book = new HSSFWorkbook(); ISheet sheet = book.CreateSheet("举例下载"); sheet.SetColumnWidth(0,16*256);//设置第一列的宽度 sheet.SetColumnWidth(1,12 * 256);//设置第二列的宽度 for (int rowId = 0; rowId <= 10; rowId++) { IRow row = sheet.CreateRow(rowId); for (int i = 0; i < 2; i++) { ICell cell = row.CreateCell(i); cell.SetCellType(CellType.String); cell.SetCellValue("测试"+i); } } var ms = new MemoryStream(); book.Write(ms); ms.Flush(); ms.Position = 0; string fileName = "测试举例.xls"; return File(ms, "application/vnd.ms-excel", fileName);
2.加载预定义的一份模板文件,填充数据,下载
//读模板的方式加载 string filePath = System.Web.HttpContext.Current.Server.MapPath("~/Template/BasicInfoTemplete.xlsx"); IWorkbook workbook; FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Read); workbook = WorkbookFactory.Create(fs); ISheet sheet = workbook.GetSheetAt(0);//获取Excel中的第一个Sheet ICellStyle cellStyle = workbook.CreateCellStyle(); //设置单元格上下左右边框线 cellStyle.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin; cellStyle.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin; cellStyle.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin; cellStyle.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin; //文字水平和垂直对齐方式 cellStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center; cellStyle.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center; ICell Cell = null; IRow row = null; for (int i = 2; i < 10; i++) { row = sheet.CreateRow(i); for (int j = 1; j <= 5; j++) { Cell = row.CreateCell(j); Cell.CellStyle = cellStyle; Cell.SetCellValue(i+"测试举例"+j); } } var ms = new NpoiMemoryStream(); ms.AllowClose = false; workbook.Write(fs); workbook.Write(ms); ms.Flush(); ms.Position = 0; ms.AllowClose = false; return File(ms, "application/vnd.ms-excel", "测试举例.xlsx");
html中调用
<a href="/UploadCarInfo/DownLoadBasicInfo" target="ajaxDownload"><i class="fa fa-download"></i> 车型参考</a> <iframe name="ajaxDownload" style="display:none"></iframe>
以上都是很基础的,比如其他的一些验证或try catch什么的暂未全部列出,比如有什么公共方法TableToExcel等什么一些公共方法网上一找一大堆,我就未一一列出具体下载细节;
第二种方式可能会遇到【无法访问已关闭】这样的问题,所以如代码所示NpoiMemoryStream这个类,我继承自MemoryStream这个系统类,重写系统类中 关闭流的那个方法(Close),改为我可以手动控制即可解决问题;
个人总结:遇到问题往往不是第一时间去解决问题,除非你非常熟悉了;取而代之而是去思考一下问题的解决思路,有的问题无非就那些套路,具体里面怎么解决我想面试的时候 也不会问的非常详细吧......