zoukankan      html  css  js  c++  java
  • 使用NPOI导出图片到EXCEL

    1、首先引用NPOI

    2、本例用到的引用

    3、在Controller里面添加导出方法

            public ActionResult ExportMsgData(string term)
            {
        
                //为list赋值
                MsgListToExcelForXLSXModel1(list, "");
                return Content("");
            }    

    4、导出基础方法

    public void MsgListToExcelForXLSXModel1(List<BackMsgProblemList> dt, string file)
    {
        XSSFWorkbook xssfworkbook = new XSSFWorkbook();
        ISheet sheet = xssfworkbook.CreateSheet("Test");
        DataTable tblDatas = new DataTable("Datas");
        DataColumn dc = null;
    
    
        //赋值给dc,是便于对每一个datacolumn的操作
        dc = tblDatas.Columns.Add("编号", Type.GetType("System.Int32"));
        dc.AutoIncrement = true;//自动增加
        dc.AutoIncrementSeed = 1;//起始为1
        dc.AutoIncrementStep = 1;//步长为1
        dc.AllowDBNull = false;//
        dc = tblDatas.Columns.Add("问题标题", Type.GetType("System.String"));
        dc = tblDatas.Columns.Add("问题状态名称", Type.GetType("System.String"));
        dc = tblDatas.Columns.Add("问题图片一", Type.GetType("System.String"));
        dc = tblDatas.Columns.Add("问题图片二", Type.GetType("System.String"));
        dc = tblDatas.Columns.Add("问题图片三", Type.GetType("System.String"));
        dc = tblDatas.Columns.Add("问题图片四", Type.GetType("System.String"));
        dc = tblDatas.Columns.Add("问题图片五", Type.GetType("System.String"));
        dc = tblDatas.Columns.Add("问题图片六", Type.GetType("System.String"));
    
        dc = tblDatas.Columns.Add("报验图片一", Type.GetType("System.String"));
        dc = tblDatas.Columns.Add("报验图片二", Type.GetType("System.String"));
        dc = tblDatas.Columns.Add("报验图片三", Type.GetType("System.String"));
        dc = tblDatas.Columns.Add("报验图片四", Type.GetType("System.String"));
        dc = tblDatas.Columns.Add("报验图片五", Type.GetType("System.String"));
        dc = tblDatas.Columns.Add("报验图片六", Type.GetType("System.String"));
    
        dc = tblDatas.Columns.Add("复检图片一", Type.GetType("System.String"));
        dc = tblDatas.Columns.Add("复检图片二", Type.GetType("System.String"));
        dc = tblDatas.Columns.Add("复检图片三", Type.GetType("System.String"));
        dc = tblDatas.Columns.Add("复检图片四", Type.GetType("System.String"));
        dc = tblDatas.Columns.Add("复检图片五", Type.GetType("System.String"));
        dc = tblDatas.Columns.Add("复检图片六", Type.GetType("System.String"));
        //表头
        IRow row = sheet.CreateRow(0);
        for (int i = 0; i < tblDatas.Columns.Count; i++)
        {
    
            ICell cell = row.CreateCell(i);
            cell.SetCellValue(tblDatas.Columns[i].ColumnName);
            //自动适应宽度
            sheet.AutoSizeColumn(i);
            sheet.SetColumnWidth(i, sheet.GetColumnWidth(i));
        }
    
        //数据
        for (int i = 0; i < dt.Count(); i++)
        {
            IRow row1 = sheet.CreateRow(i + 1);
            ICell cell = row1.CreateCell(0);
            cell.SetCellValue(i + 1);
            cell = row1.CreateCell(1);
            cell.SetCellValue(dt[i].RIP_Name);
            cell = row1.CreateCell(2);
            cell.SetCellValue(dt[i].PB_AllName);
            var arry = dt[i].PB_AllName.Split('>');
            cell = row1.CreateCell(3);
            cell.SetCellValue(arry.Length > 0 ? arry[0] : "");
            cell = row1.CreateCell(4);
            cell.SetCellValue(arry.Length > 1 ? arry[1] : "");
            cell = row1.CreateCell(5);
            cell.SetCellValue(arry.Length > 2 ? arry[2] : "");
            cell = row1.CreateCell(6);
            cell.SetCellValue(arry.Length > 3 ? arry[3] : "");
            cell = row1.CreateCell(7);
            cell.SetCellValue(dt[i].AName);
            cell = row1.CreateCell(8);
            cell.SetCellValue(dt[i].BD_Name);
            cell = row1.CreateCell(9);
            cell.SetCellValue(dt[i].U_Name);
            cell = row1.CreateCell(10);
            cell.SetCellValue(dt[i].H_Code);
            cell = row1.CreateCell(11);
            cell.SetCellValue(dt[i].RIP_DistributName);
            cell = row1.CreateCell(12);
            cell.SetCellValue(dt[i].RIP_SeverityName);
            cell = row1.CreateCell(13);
            cell.SetCellValue(dt[i].HCIC_AddDateStr);
            cell = row1.CreateCell(14);
            cell.SetCellValue(dt[i].RectificationNum.ToString());
            cell = row1.CreateCell(15);
            cell.SetCellValue(dt[i].QuestionStateName);
            if (dt[i].ContentAccListForCreate != null && dt[i].ContentAccListForCreate.Count > 0)
            {
                MsgInsetImg(sheet, row1, dt, i, xssfworkbook, dt[i].ContentAccListForCreate, 16);
            }
            if (dt[i].ContentAccListForInspection != null && dt[i].ContentAccListForInspection.Count > 0)
            {
                MsgInsetImg(sheet, row1, dt, i, xssfworkbook, dt[i].ContentAccListForInspection, 22);
            }
            if (dt[i].ContentAccListForCheck != null && dt[i].ContentAccListForCheck.Count > 0)
            {
    
                MsgInsetImg(sheet, row1, dt, i, xssfworkbook, dt[i].ContentAccListForCheck, 28);
            }
        }
        /*不能使用如下方法生成Excel,因为在xssfworkbook.Write(stream);操作后会关闭流,导致报错【不能操作已关闭的流】*/
        ////转为字节数组
        //MemoryStream stream = new MemoryStream();
        //xssfworkbook.Write(stream);
        //var buf = stream.ToArray();
    
        ////保存为Excel文件
        //using (FileStream fs = new FileStream(file, FileMode.Create, FileAccess.Write))
        //{
        //    fs.Write(buf, 0, buf.Length);
        //    fs.Flush();
        //}
        /*可以使用下面方式导出-这里数据量多会报错【发现XX.xlsx中部分内容有问题,是否让我们尽量尝试恢复】*/
        //MemoryStream stream = new MemoryStream();
        //xssfworkbook.Write(stream);
    
        //Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}.xlsx", DateTime.Now.ToString("yyyyMMddHHmmssfff")));
        //Response.BinaryWrite(stream.ToArray());
        //xssfworkbook = null;
        //stream.Close();
        //stream.Dispose();
        /*最终推荐下面方式*/
        HttpContext curContext = HttpContext.Current;
    
        MemoryStream ms = new MemoryStream();
        xssfworkbook.Write(ms);
        curContext.Response.AppendHeader("Content-Disposition",
            "attachment;filename=" + HttpUtility.UrlEncode("aaa.xlsx", Encoding.UTF8) + ".xlsx");
        curContext.Response.AddHeader("Content-Length", ms.ToArray().Length.ToString());
        curContext.Response.ContentEncoding = Encoding.UTF8;
    
        curContext.Response.BinaryWrite(ms.ToArray());
        ms.Close();
        ms.Dispose();
        curContext.Response.End();
    }

    5、插入图片方法

          private void MsgInsetImg(ISheet sheet, IRow row1, List<BackMsgProblemList> dt, int i, XSSFWorkbook xssfworkbook, List<string> ContentAccList, int colnum)
            {
                for (int j = 0; j < 6; j++)
                {
                    //设置图片那的宽高
                    sheet.SetColumnWidth(colnum + j, 5845);
                    row1.Height = 1731;
                    if (ContentAccList.Count <= j)
                    {
                        break;
                    }
                    var dPath = ImageShow + ContentAccList[j];
                    try
                    {
    
    
                        System.Drawing.Image imgOutput = System.Drawing.Bitmap.FromFile(dPath);
                        System.Drawing.Image img = imgOutput.GetThumbnailImage(160, 115, null, IntPtr.Zero);
                        //图片转换为文件流
                        MemoryStream ms = new MemoryStream();
                        img.Save(ms, ImageFormat.Bmp);
                        BinaryReader br = new BinaryReader(ms);
                        var picBytes = ms.ToArray();
                        ms.Close();
    
                        //插入图片
                        if (picBytes != null && picBytes.Length > 0)
                        {
                            var rows = i + 1;
                            var cols = colnum + j;
                            /* Add Picture to Workbook, Specify picture type as PNG and Get an Index */
                            int pictureIdx = xssfworkbook.AddPicture(picBytes, NPOI.SS.UserModel.PictureType.PNG);  //添加图片
                                                                                                                    /* Create the drawing container */
                            XSSFDrawing drawing = (XSSFDrawing)sheet.CreateDrawingPatriarch();
                            /* Create an anchor point */
                            XSSFClientAnchor anchor = new XSSFClientAnchor(0, 0, 0, 0, cols, rows, 1, 3);
    
                            /* Invoke createPicture and pass the anchor point and ID */
                            XSSFPicture picture = (XSSFPicture)drawing.CreatePicture(anchor, pictureIdx);
                            /* Call resize method, which resizes the image */
                            picture.Resize();
    
                            picBytes = null;
                        }
                    }
                    catch (Exception ex)
                    {
    
                        log.Fatal("--图片导出失败:当前文件路径:" + dPath);
                    }
    
                }
            }

    6、导出成果

    说明:这里采用的是Excel2007以上版本即:XSSFWorkbook,目前XSSFWorkbook版本的资料较少,希望能帮助大家。

    备注:excel宽高采用的不是像素,经过计算大约为宽:36.53125=1像素  高:15.05217391304348=1像素

  • 相关阅读:
    springboot2.04+mybatis-plus+swagger2+CodeGenerator
    1.Jenkins 在windows下的安装与配置
    .Net Core Linux centos7行—vscode开发,linux部署运行
    .Net Core Linux centos7行—安装nginx,运行静态网站
    .Net Core Linux centos7行—hyper-v安装linux系统和.net core sdk
    扩展htmlhelper.DropDownListFor 支持list数据源和option增加属性
    SignalR主动通知订阅者示例
    asp.net mvc HandleErrorAttribute 异常错误处理 无效!
    Microsoft.AspNet.Identity 自定义使用现有的表—登录实现
    asp.net mvc输出自定义404等错误页面,非302跳转。
  • 原文地址:https://www.cnblogs.com/no27/p/7815257.html
Copyright © 2011-2022 走看看