• NPOI 导入导出excel两种方式 和 错误 无法访问已关闭的流解决方式


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

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

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

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

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

  • 相关阅读:
    C# winform 若要在加载设计器前避免可能发生的数据丢失,必须纠正以下错误
    C# 邮件发送系统
    IIS配置网站(WebServices),局域网都能访问
    C# 遍历窗体控件顺序问题
    zynqmp(zcu102rev1.0)系列---1---安装 xsdk
    linux 系统中将数据写入文档不能立即保存问题的解决方法
    virtualbox ubuntu16.04 自动挂载共享文件夹
    linux c 读写 ini 配置文件
    指针与 const --- 指针常量与常量指针
    Linux SD卡建立两个分区
  • 原文地址:https://www.cnblogs.com/life512/p/5993867.html
Copyright © 2020-2023  润新知