首页 > 技术文章 > NPOI 导入导出excel两种方式 和 错误 无法访问已关闭的流解决方式

life512 2016-10-24 17:38 原文

平时做项目过程中经常会遇到一些导入导出的功能,今天偶得一小空 整理一下

(如果有不对的地方还请大家指正,平时解决问题就顺手记录一下,以方便其他的小伙伴参考)

首先如下基础的项目过程图:

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),改为我可以手动控制即可解决问题;

 

个人总结:遇到问题往往不是第一时间去解决问题,除非你非常熟悉了;取而代之而是去思考一下问题的解决思路,有的问题无非就那些套路,具体里面怎么解决我想面试的时候 也不会问的非常详细吧......

 

推荐阅读