zoukankan      html  css  js  c++  java
  • NOPI Excel插件导入导出 图片批注

    dateTable导出到excel的MemoryStream

      1 /// <summary>
      2         /// DataTable导出到Excel的MemoryStream Export()
      3         /// </summary>
      4         /// <param name="dtSource">DataTable数据源</param>
      5         /// <param name="excelConfig">导出设置包含文件名、标题、列设置</param>
      6         /// <param name="isRemoveColumns"></param>
      7         public static MemoryStream ExportMemoryStream(DataTable dtSource, ExcelConfig excelConfig, bool isRemoveColumns = false)
      8         {
      9             if (isRemoveColumns)
     10             {
     11                 int colint = 0;
     12                 for (int i = 0; i < dtSource.Columns.Count; )
     13                 {
     14                     DataColumn column = dtSource.Columns[i];
     15                     if (colint>=excelConfig.ColumnEntity.Count || excelConfig.ColumnEntity[colint].Column != column.ColumnName)
     16                     {
     17                         dtSource.Columns.Remove(column.ColumnName);
     18                     }
     19                     else
     20                     {
     21                         ColumnEntity columnentity = excelConfig.ColumnEntity.Find(t => t.Column == dtSource.Columns[i].ColumnName);
     22                         dtSource.Columns[i].ColumnName = columnentity.ExcelColumn;//修改列头名
     23                         i++;
     24                         colint++;
     25                     }
     26 
     27                 }
     28             }
     29 
     30 
     31             HSSFWorkbook workbook = new HSSFWorkbook();
     32             ISheet sheet = workbook.CreateSheet();
     33 
     34             #region 右击文件 属性信息
     35             {
     36                 DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation();
     37                 dsi.Company = "NPOI";
     38                 workbook.DocumentSummaryInformation = dsi;
     39 
     40                 SummaryInformation si = PropertySetFactory.CreateSummaryInformation();
     41                 si.Author = "zdd"; //填加xls文件作者信息
     42                 si.ApplicationName = "XX系统"; //填加xls文件创建程序信息
     43                 si.LastAuthor = "zdd"; //填加xls文件最后保存者信息
     44                 si.Comments = "zdd"; //填加xls文件作者信息
     45                 si.Title = "标题信息"; //填加xls文件标题信息
     46                 si.Subject = "主题信息";//填加文件主题信息
     47                 si.CreateDateTime = System.DateTime.Now;
     48                 workbook.SummaryInformation = si;
     49             }
     50             #endregion
     51 
     52             #region 设置标题样式
     53             ICellStyle headStyle = workbook.CreateCellStyle();
     54             int[] arrColWidth = new int[dtSource.Columns.Count];
     55             string[] arrColName = new string[dtSource.Columns.Count];//列名
     56             ICellStyle[] arryColumStyle = new ICellStyle[dtSource.Columns.Count];//样式表
     57             headStyle.Alignment = HorizontalAlignment.Center; // ------------------
     58             if (excelConfig.Background != new Color())
     59             {
     60                 if (excelConfig.Background != new Color())
     61                 {
     62                     headStyle.FillPattern = FillPattern.SolidForeground;
     63                     headStyle.FillForegroundColor = GetXLColour(workbook, excelConfig.Background);
     64                 }
     65             }
     66             IFont font = workbook.CreateFont();
     67             font.FontHeightInPoints = excelConfig.TitlePoint;
     68             if (excelConfig.ForeColor != new Color())
     69             {
     70                 font.Color = GetXLColour(workbook, excelConfig.ForeColor);
     71             }
     72             font.Boldweight = 700;
     73             headStyle.SetFont(font);
     74             #endregion
     75 
     76             #region 列头及样式
     77             ICellStyle cHeadStyle = workbook.CreateCellStyle();
     78             cHeadStyle.Alignment = HorizontalAlignment.Center; // ------------------
     79             IFont cfont = workbook.CreateFont();
     80             cfont.FontHeightInPoints = excelConfig.HeadPoint;
     81             cHeadStyle.SetFont(cfont);
     82             #endregion
     83 
     84             #region 设置内容单元格样式
     85             foreach (DataColumn item in dtSource.Columns)
     86             {
     87                 ICellStyle columnStyle = workbook.CreateCellStyle();
     88                 columnStyle.Alignment = HorizontalAlignment.Center;
     89                 arrColWidth[item.Ordinal] = Encoding.GetEncoding(936).GetBytes(item.ColumnName.ToString()).Length;
     90                 arrColName[item.Ordinal] = item.ColumnName.ToString();
     91                 if (excelConfig.ColumnEntity != null)
     92                 {
     93                     ColumnEntity columnentity = excelConfig.ColumnEntity.Find(t => t.Column == item.ColumnName);
     94                     if (columnentity != null)
     95                     {
     96                         arrColName[item.Ordinal] = columnentity.ExcelColumn;
     97                         if (columnentity.Width != 0)
     98                         {
     99                             arrColWidth[item.Ordinal] = columnentity.Width;
    100                         }
    101                         if (columnentity.Background != new Color())
    102                         {
    103                             if (columnentity.Background != new Color())
    104                             {
    105                                 columnStyle.FillPattern = FillPattern.SolidForeground;
    106                                 columnStyle.FillForegroundColor = GetXLColour(workbook, columnentity.Background);
    107                             }
    108                         }
    109                         if (columnentity.Font != null || columnentity.Point != 0 || columnentity.ForeColor != new Color())
    110                         {
    111                             IFont columnFont = workbook.CreateFont();
    112                             columnFont.FontHeightInPoints = 10;
    113                             if (columnentity.Font != null)
    114                             {
    115                                 columnFont.FontName = columnentity.Font;
    116                             }
    117                             if (columnentity.Point != 0)
    118                             {
    119                                 columnFont.FontHeightInPoints = columnentity.Point;
    120                             }
    121                             if (columnentity.ForeColor != new Color())
    122                             {
    123                                 columnFont.Color = GetXLColour(workbook, columnentity.ForeColor);
    124                             }
    125                             columnStyle.SetFont(font);
    126                         }
    127                         columnStyle.Alignment = getAlignment(columnentity.Alignment);
    128                     }
    129                 }
    130                 arryColumStyle[item.Ordinal] = columnStyle;
    131             }
    132             if (excelConfig.IsAllSizeColumn)
    133             {
    134                 #region 根据列中最长列的长度取得列宽
    135                 for (int i = 0; i < dtSource.Rows.Count; i++)
    136                 {
    137                     for (int j = 0; j < dtSource.Columns.Count; j++)
    138                     {
    139                         if (arrColWidth[j] != 0)
    140                         {
    141                             int intTemp = Encoding.GetEncoding(936).GetBytes(dtSource.Rows[i][j].ToString()).Length;
    142                             if (intTemp > arrColWidth[j])
    143                             {
    144                                 arrColWidth[j] = intTemp;
    145                             }
    146                         }
    147 
    148                     }
    149                 }
    150                 #endregion
    151             }
    152             #endregion
    153 
    154             #region 填充数据
    155 
    156             #endregion
    157 
    158             ICellStyle dateStyle = workbook.CreateCellStyle();
    159             IDataFormat format = workbook.CreateDataFormat();
    160             dateStyle.DataFormat = format.GetFormat("yyyy-mm-dd");
    161             int rowIndex = 0;
    162             foreach (DataRow row in dtSource.Rows)
    163             {
    164                 #region 新建表,填充表头,填充列头,样式
    165                 if (rowIndex == 65535 || rowIndex == 0)
    166                 {
    167                     if (rowIndex != 0)
    168                     {
    169                         sheet = workbook.CreateSheet();
    170                     }
    171 
    172                     #region 表头及样式
    173                     {
    174                         if (excelConfig.Title != null)
    175                         {
    176                             IRow headerRow = sheet.CreateRow(0);
    177                             if (excelConfig.TitleHeight != 0)
    178                             {
    179                                 headerRow.Height = (short)(excelConfig.TitleHeight * 20);
    180                             }
    181                             headerRow.HeightInPoints = 25;
    182                             headerRow.CreateCell(0).SetCellValue(excelConfig.Title);
    183                             headerRow.GetCell(0).CellStyle = headStyle;
    184                             sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0, 0, 0, dtSource.Columns.Count - 1)); // ------------------
    185                         }
    186 
    187                     }
    188                     #endregion
    189 
    190                     #region 列头及样式
    191                     {
    192                         IRow headerRow = sheet.CreateRow(1);
    193                         #region 如果设置了列标题就按列标题定义列头,没定义直接按字段名输出
    194                         foreach (DataColumn column in dtSource.Columns)
    195                         {
    196                             headerRow.CreateCell(column.Ordinal).SetCellValue(arrColName[column.Ordinal]);
    197                             headerRow.GetCell(column.Ordinal).CellStyle = cHeadStyle;
    198                             //设置列宽
    199                             sheet.SetColumnWidth(column.Ordinal, (arrColWidth[column.Ordinal] + 1) * 256);
    200                         }
    201                         #endregion
    202                     }
    203                     #endregion
    204 
    205                     rowIndex = 2;
    206                 }
    207                 #endregion
    208 
    209                 #region 填充内容
    210                 IRow dataRow = sheet.CreateRow(rowIndex);
    211 
    212                
    213 
    214                 foreach (DataColumn column in dtSource.Columns)
    215                 {
    216                     ICell newCell = dataRow.CreateCell(column.Ordinal);
    217                     newCell.CellStyle = arryColumStyle[column.Ordinal];
    218                     string drValue = row[column].ToString();
    219 
    220                     //如果是图片列
    221                     if (column.ToString() == "图片")
    222                     {
    223                        
    224                         
    225                        
    226                         string tPath = DirFileHelper.MapPath("/ExportFile/ImageFiles/");//服务器图片存储目录
    227                         if (!DirFileHelper.IsExistDirectory(tPath))//判断是否存在此目录 无则创建
    228                         {
    229                             DirFileHelper.CreateDir("/ExportFile/ImageFiles/");//创建临时存储压缩后图片路径
    230                         }
    231                         string filePath = SharedImagePath + drValue;
    232                         string newImagePath = tPath + drValue;//压缩后图片绝对路径
    233                         if (DirFileHelper.IsExistFile(newImagePath))//若果本地已存在 则不从100共享盘中取图片
    234                         {
    235                             byte[] bytes = System.IO.File.ReadAllBytes(newImagePath);
    236                             int pictureIndex = workbook.AddPicture(bytes, PictureType.JPEG);
    237                             HSSFPatriarch par = sheet.CreateDrawingPatriarch() as HSSFPatriarch;
    238                            
    239                             HSSFClientAnchor anchor = new HSSFClientAnchor
    240                             {
    241                                 Dx1 = 0,//起始单元格的x偏移量,如例子中的255表示直线起始位置距A1单元格左侧的距离;
    242                                 Dy1 = 0,//起始单元格的y偏移量,如例子中的125表示直线起始位置距A1单元格上侧的距离;
    243                                 Dx2 = 0,//终止单元格的x偏移量,如例子中的1023表示直线起始位置距C3单元格左侧的距离;
    244                                 Dy2 = 0,//:终止单元格的y偏移量,如例子中的150表示直线起始位置距C3单元格上侧的距离;
    245                                 Col1 = column.Ordinal +1, //批注起始位置的纵坐标(当前单元格位置+2)
    246                                 Col2 = column.Ordinal + 6, //批注结束位置的纵坐标  
    247                                 Row1 = column.Ordinal + 0, //批注起始位置的横坐标  
    248                                 Row2 = column.Ordinal + 17  //批注结束位置的横坐标  
    249                             };
    250                             HSSFComment comment = par.CreateComment(anchor);
    251                             comment.SetBackgroundImage(pictureIndex);
    252                             newCell.CellComment = comment;
    253                         }
    254                         else//取100共享盘图片并压缩指定大小
    255                         {
    256                             if (DirFileHelper.IsExistFile(filePath))//需要增加判断是否存在此图片
    257                             {
    258                                 ImageHelper.CreateMinImageAndDel(filePath, 300, 400, tPath);//压缩指定大小图片
    259                                 byte[] bytes = System.IO.File.ReadAllBytes(newImagePath);
    260                                 int pictureIndex = workbook.AddPicture(bytes, PictureType.JPEG);
    261                                 HSSFPatriarch par = sheet.CreateDrawingPatriarch() as HSSFPatriarch;
    262                                 HSSFClientAnchor anchor = new HSSFClientAnchor
    263                                 {
    264                                     Dx1 = 0,//起始单元格的x偏移量,如例子中的255表示直线起始位置距A1单元格左侧的距离;
    265                                     Dy1 = 0,//起始单元格的y偏移量,如例子中的125表示直线起始位置距A1单元格上侧的距离;
    266                                     Dx2 = 0,//终止单元格的x偏移量,如例子中的1023表示直线起始位置距C3单元格左侧的距离;
    267                                     Dy2 = 0,//:终止单元格的y偏移量,如例子中的150表示直线起始位置距C3单元格上侧的距离;
    268                                     Col1 = column.Ordinal + 2, //批注起始位置的纵坐标(当前单元格位置+2)
    269                                     Col2 = column.Ordinal + 6, //批注结束位置的纵坐标  
    270                                     Row1 = column.Ordinal + 0, //批注起始位置的横坐标  
    271                                     Row2 = column.Ordinal + 17  //批注结束位置的横坐标  
    272                                 };
    273                                 HSSFComment comment = par.CreateComment(anchor);
    274                                 comment.SetBackgroundImage(pictureIndex);
    275                             }
    276                         }
    277                         //newCell.SetCellValue(drValue);
    278                         SetCell(newCell, dateStyle, column.DataType, drValue);
    279                     }
    280                     else
    281                     {
    282                         SetCell(newCell, dateStyle, column.DataType, drValue);
    283                     }
    284 
    285 
    286                 }
    287                 #endregion
    288                 rowIndex++;
    289             }
    290             using (MemoryStream ms = new MemoryStream())
    291             {
    292                 workbook.Write(ms);
    293                 ms.Flush();
    294                 ms.Position = 0;
    295                 return ms;
    296             }
    297         }
    298         #endregion
  • 相关阅读:
    Goroutine被动调度之一(18)
    实战分析一个运行起来会卡死的Go程序
    Go语言调度器之盗取goroutine(17)
    第三章 Goroutine调度策略(16)
    非main goroutine的退出及调度循环(15)
    Go语言调度器之调度main goroutine(14)
    PHP经典面试题之 Redis 内存满了怎么办?
    【PHP】让新人快速理解ThinkPHP6中的事务操作
    面试官:说说swoole+PHP实现自动取消订单,还原库存等操作
    最新整理的PHP高级面试题来啦!【附答案】
  • 原文地址:https://www.cnblogs.com/zengdingding/p/6207343.html
Copyright © 2011-2022 走看看