C# 实现Excel导出图片

来源:互联网 发布:怎么对比两列数据图表 编辑:程序博客网 时间:2024/06/05 22:39

1.导出Excle表格,表格内嵌套图片功能:

2.封装导出文件方法

  public bool ExportExcel(DataTable dt, string notile,string title)
        {
            CreatePic cp = new CreatePic();
            //创建工作簿
            NPOI.HSSF.UserModel.HSSFWorkbook book = new NPOI.HSSF.UserModel.HSSFWorkbook();
            //创建表
            NPOI.SS.UserModel.ISheet sheet = book.CreateSheet(notile);
            //自适应列宽
            //  sheet.AutoSizeColumn(1, true);
            //标题行合并单元格
            sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0, 0, 0, dt.Columns.Count - 1));


            NPOI.SS.UserModel.IRow firstrow = sheet.CreateRow(0);
            NPOI.SS.UserModel.ICell firstcell = firstrow.CreateCell(0);


            //表名样式
            NPOI.SS.UserModel.ICellStyle styleHeader = book.CreateCellStyle();
            NPOI.SS.UserModel.IFont fontHeader = book.CreateFont();
            styleHeader.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Left;
            styleHeader.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;
            fontHeader.FontHeightInPoints = 15;


            styleHeader.SetFont(fontHeader);
            firstcell.CellStyle = styleHeader;
            firstcell.SetCellValue(title);


            try
            {
                //列名样式
                NPOI.SS.UserModel.ICellStyle styleColName = book.CreateCellStyle();
                NPOI.SS.UserModel.IFont fontColName = book.CreateFont();
                styleColName.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;
                styleColName.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;
                fontColName.FontHeightInPoints = 14;
                styleColName.SetFont(fontColName);




                //数据的样式、字体大小
                NPOI.SS.UserModel.ICellStyle styleBody = book.CreateCellStyle();
                NPOI.SS.UserModel.IFont fontBody = book.CreateFont();


                styleBody.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;
                styleBody.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;
                fontBody.FontHeightInPoints = 12;
                styleBody.SetFont(fontBody);


                //创建具体单元格数据
                int rowCount = dt.Rows.Count;
                int colCount = dt.Columns.Count;


                NPOI.SS.UserModel.IRow colNameRow = sheet.CreateRow(1);
                for (int x = 0; x < colCount; x++)
                { //将列名写入单元格
                    NPOI.SS.UserModel.ICell colNameCell = colNameRow.CreateCell(x);
                    colNameCell.SetCellValue(dt.Columns[x].ColumnName);
                    colNameCell.CellStyle = styleColName;
                }


                for (int i = 0; i < rowCount; i++)
                {
                    NPOI.SS.UserModel.IRow row = sheet.CreateRow(i + 2);//数据从第三行开始 第一行表名 第二行列名


                    for (int j = 0; j < colCount; j++)
                    {
                        //填充数据
                        NPOI.SS.UserModel.ICell cell = row.CreateCell(j);


                        if (dt.Rows[i][j] != null)
                        {
                            cell.SetCellValue(dt.Rows[i][j].ToString() + "               ");


                            if (dt.Rows[i][j].ToString().Contains("www"))
                            {
                                cell.Row.Height = 4000;
                                
                                cp.AddPic(sheet, book, dt.Rows[i][j].ToString(), i+2, j);
                            }
                            
                        }
                        else
                        {
                            cell.SetCellValue("");
                        }


                        cell.CellStyle = styleBody;
                    }
                }
                //自适应列宽
                for (int x = 0; x < colCount; x++)
                {
                    sheet.AutoSizeColumn(x, true);
                }


                //最后插入图片
                
                //设置宽高
              //  sheet.SetColumnWidth(4,2000);
                
                //此处代码是将 xls文件发到页面通过浏览器直接下载到本地  可以放到 界面调用的地方
                System.IO.MemoryStream ms = new System.IO.MemoryStream();
                book.Write(ms);
                //Response.AddHeader("Content-Disposition", string.Format("attachment; filename=ccc.xls"));
                Response.AddHeader("Content-Disposition", "attachment;filename=" + Server.UrlEncode(notile + ".xls"));//注意
                Response.BinaryWrite(ms.ToArray());
                book = null;
                ms.Close();
                ms.Dispose();




                return true;
            }
            catch
            {
                throw new Exception();
            }
            finally
            {
                book = null;
            }


        }

3.具体的引用

using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

3.封装成方法,使用NOPI插件导出Excel时候调用改方法即可

  /// <summary>
        /// 封装方法,用于表格内渲染图片
        /// </summary>
        /// <param name="sheet"></param>
        /// <param name="workbook">工作簿</param>
        /// <param name="fileurl">图片地址</param>
        /// <param name="row">行</param>
        /// <param name="col">列</param>
        public void AddPic(ISheet sheet, HSSFWorkbook workbook, string fileurl, int row, int col)
        {
            byte[] bytes = System.IO.File.ReadAllBytes(fileurl);
            int picindex = workbook.AddPicture(bytes, NPOI.SS.UserModel.PictureType.JPEG);
            HSSFPatriarch patriarch = (HSSFPatriarch)sheet.CreateDrawingPatriarch();
            HSSFClientAnchor anchor = new HSSFClientAnchor(0,0,48,48,col,row,col+1,row+1);
            HSSFPicture pict = (HSSFPicture)patriarch.CreatePicture(anchor,picindex);
            
        }

文章为原创作品