zoukankan      html  css  js  c++  java
  • .net webform + npoi 实现文件上传下载

    由于公司老系统(一部分vb,一部分webform)需要新增文件上传比对下载功能,下载的文件总是提示‘有无法读取的内容,然后xml错误’,啥啥啥的,但其实打开文件,里面的内容又没有错误。
    做完发现主要是自己太菜,不了解MemoryStream类的用法,或者说不了解文件流的概念,最后发现是返回的数据类型不对,下面直接上代码。
    service:

    public MemoryStream ExcelToMs(List<ResultClass> list, string ModelFile, string action, string SavePath)
    {
        XSSFWorkbook workbook;
        using (FileStream fs = new FileStream(ModelFile, FileMode.Open, FileAccess.Read))
        {
            workbook  = new XSSFWorkbook(fs);//这里使用了模板 主要是将样式写入workbook
        }
        #region 樣式
        IFont StyleBody = workbook.CreateFont();
        StyleBody.FontHeightInPoints = 10;
        ICellStyle style = workbook.CreateCellStyle();//创建样式
        style.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center; //垂直居中
        style.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;
        style.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin;
        style.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin;
        style.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin;
        style.SetFont(StyleBody);
        #endregion
    
        if (action == "download")//忽略这里,这里是另一个下载的实现(是给的写死的模板,因此不用添加新数据)
        {
            using (MemoryStream ms = new MemoryStream())
            {
                workbook.Write(ms);
                ms.Flush();
                workbook = null;
                return ms;//返回MemoryStream 
            }
        } 
        else
        {
            ISheet sheet = workbook.GetSheetAt(0);
            for (int i = 0; i < list.Count; i++)
            {
                IRow row1 = sheet.CreateRow(i + 1);
                row1.CreateCell(0).SetCellValue(list[i].CPN);
                row1.CreateCell(1).SetCellValue(list[i].PN);
                row1.CreateCell(2).SetCellValue(list[i].SIM_UPSIZE_WEEK);
                row1.CreateCell(3).SetCellValue(list[i].QTY);
                row1.CreateCell(4).SetCellValue(list[i].SUDATE.ToString("yyyy/MM/dd"));
                row1.CreateCell(5).SetCellValue(list[i].REQDATE.ToString("yyyy/MM/dd"));
                row1.CreateCell(6).SetCellValue(list[i].MARK);
                row1.CreateCell(7).SetCellValue(list[i].PN1);
                row1.CreateCell(8).SetCellValue(Convert.ToDouble(list[i].LT));
                row1.CreateCell(9).SetCellValue(Convert.ToDouble(list[i].QTYPER));
                row1.CreateCell(10).SetCellValue(Convert.ToDouble(list[i].USQTY));
                for (int j = 0; j <= 10; j++)
                {
                    row1.GetCell(j).CellStyle = style;
                }
            }
            using (FileStream fsout = new FileStream(SavePath, FileMode.Create, FileAccess.ReadWrite))//先临时保存到指定地址
            {
                workbook.Write(fsout);
            }
            using (MemoryStream ms = new MemoryStream())//返回文件流
            {
                workbook.Write(ms);
                ms.Flush();
                workbook = null;
                return ms;
            }
        }            
    }
    

    一般处理程序:

    else if (context.Request["action"] == "downloadResult")
    {
        try
        {
            //將數據轉化為Excel
            string str = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
            string filePath = str + $@"模板地址ResultDownLoadModel.xlsx";
            string saveTime = DateTime.Now.ToString("yyyy_MM_dd HHmmss");
            string SavePath = str + $@"临时保存的地址OUTPUTxxxxxx {saveTime}.xlsx";
            string fileName = $"保存的文件名 {saveTime}.xlsx";
            UpsizeFcstService service = new UpsizeFcstService();
            using (MemoryStream ms = service.ExcelToMs(数据, filePath, "downloadResult", SavePath))
            {
                byte[] data = ms.ToArray();
                #region 客户端保存
                HttpResponse response = System.Web.HttpContext.Current.Response;
                response.Clear();
                response.Charset = "UTF-8";
                response.ContentType = "application/vnd.ms-excel";//"application/vnd.ms-excel";
                System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition", string.Format("attachment; filename=" + fileName));
                System.Web.HttpContext.Current.Response.BinaryWrite(data);
                #endregion
            }     
        }
        catch (Exception ex)
        {
            context.Response.Write("<script type='text/javascript'>alert('导出发生异常!'" + ex.Message + "''');window.history.back();</script>");
            return;
        }
    }
    

    之前傻乎乎的返回了Iworkbook,这样写就不会出现弹窗有无法读取的内容。

  • 相关阅读:
    架构设计中的方法学——迭代设计
    架构重构改善既有代码的设计
    架构如何为业务和技术“服务”(2)
    架构如何为业务和技术“服务”(1)
    选用面向领域的多层分布式架构(DDD风格架构)的理由
    传话游戏(2013编程之美全国挑战赛资格赛)
    2012年蓝桥杯软件设计大赛河南省初赛试题和答案
    最大值最下化
    NYOJ120 校园网络(强连通缩点targan算法)
    NYOJ176整数划分(二)
  • 原文地址:https://www.cnblogs.com/bemad/p/13071561.html
Copyright © 2011-2022 走看看