• 使用OpenXML操作PPT公共方法总结


    推荐一个ppt模板操作工具: https://github.com/tkrotoff/PptxTemplater

    然后进入正题...

    一 拷贝一个幻灯片

      1 private static long SLIDE_ID = 1000;
      2 private static uint UNIQUE_ID = 0;
      3 
      4 /// <summary>
      5 /// 拷贝一个幻灯片
      6 /// </summary>
      7 /// <param name="destPresentationPart"></param>
      8 /// <param name="slidePartTemplate"></param>
      9 /// <param name="offsetToLast"></param>
     10 /// <returns></returns>
     11 public static SlidePart CloneSlidePart(PresentationPart destPresentationPart, SlidePart slidePartTemplate, int? offsetToLast = 2)
     12 {
     13     int? insertAt = null;
     14     if (offsetToLast != null)
     15     {
     16         insertAt = destPresentationPart.SlideParts.Count() - offsetToLast.Value;
     17     }
     18 
     19     // If the merged presentation does not have a SlideIdList 
     20     // element yet, add it.
     21     if (destPresentationPart.Presentation.SlideIdList == null)
     22     {
     23         destPresentationPart.Presentation.SlideIdList = new SlideIdList();
     24     }
     25 
     26     // Get unique ids for the slide master and slide lists
     27     // for use later.
     28     UNIQUE_ID = GetMaxSlideMasterId(destPresentationPart.Presentation.SlideMasterIdList);
     29 
     30     uint maxSlideId = GetMaxSlideId(destPresentationPart.Presentation.SlideIdList);
     31     SlidePart destSp;
     32     SlideMasterPart destMasterPart;
     33     string relId;
     34     SlideMasterId newSlideMasterId;
     35     SlideId newSlideId;
     36 
     37     // Add the slide part to the destination presentation.
     38     relId = "slide" + (SLIDE_ID++);
     39     destSp = destPresentationPart.AddPart<SlidePart>(slidePartTemplate, relId);
     40 
     41     // The slide master part was added. Make sure the
     42     // relationship between the main presentation part and
     43     // the slide master part is in place.
     44     destMasterPart = destSp.SlideLayoutPart.SlideMasterPart;
     45     destPresentationPart.AddPart(destMasterPart);
     46 
     47     // Add the slide master id to the slide master id list.
     48     UNIQUE_ID++;
     49     newSlideMasterId = new SlideMasterId();
     50     newSlideMasterId.RelationshipId = destPresentationPart.GetIdOfPart(destMasterPart);
     51     newSlideMasterId.Id = UNIQUE_ID;
     52     destPresentationPart.Presentation.SlideMasterIdList.Append(newSlideMasterId);
     53 
     54     // Add the slide id to the slide id list.
     55     maxSlideId++;
     56     newSlideId = new SlideId();
     57     newSlideId.RelationshipId = relId;
     58     newSlideId.Id = maxSlideId;
     59     if (insertAt != null)
     60     {
     61         destPresentationPart.Presentation.SlideIdList.InsertAt(newSlideId, insertAt.Value);
     62     }
     63     else
     64     {
     65         destPresentationPart.Presentation.SlideIdList.Append(newSlideId);
     66     }
     67 
     68     // Make sure that all slide layout ids are unique.
     69     FixSlideLayoutIds(destPresentationPart);
     70 
     71     // Save the changes to the destination deck.
     72     destPresentationPart.Presentation.Save();
     73 
     74     return destSp;
     75 }
     76 
     77 /// <summary>
     78 /// FixSlideLayoutIds
     79 /// </summary>
     80 /// <param name="presPart"></param>
     81 private static void FixSlideLayoutIds(PresentationPart presPart)
     82 {
     83     // Make sure that all slide layouts have unique ids.2020/6/20
     84     foreach (SlideMasterPart slideMasterPart in
     85       presPart.SlideMasterParts)
     86     {
     87         foreach (SlideLayoutId slideLayoutId in
     88           slideMasterPart.SlideMaster.SlideLayoutIdList)
     89         {
     90             UNIQUE_ID++;
     91             slideLayoutId.Id = (uint)UNIQUE_ID;
     92         }
     93 
     94         slideMasterPart.SlideMaster.Save();
     95     }
     96 }
     97 
     98 /// <summary>
     99 /// GetMaxSlideId
    100 /// </summary>
    101 /// <param name="slideIdList"></param>
    102 /// <returns></returns>
    103 private static uint GetMaxSlideId(SlideIdList slideIdList)
    104 {
    105     // Slide identifiers have a minimum value of greater than or
    106     // equal to 256 and a maximum value of less than 2147483648. 
    107     uint max = 256;
    108 
    109     if (slideIdList != null)
    110         // Get the maximum id value from the current set of children.
    111         foreach (SlideId child in slideIdList.Elements<SlideId>())
    112         {
    113             uint id = child.Id;
    114 
    115             if (id > max)
    116                 max = id;
    117         }
    118 
    119     return max;
    120 }
    121 
    122 /// <summary>
    123 /// GetMaxSlideMasterId
    124 /// </summary>
    125 /// <param name="slideMasterIdList"></param>
    126 /// <returns></returns>
    127 private static uint GetMaxSlideMasterId(SlideMasterIdList slideMasterIdList)
    128 {
    129     // Slide master identifiers have a minimum value of greater than
    130     // or equal to 2147483648. 
    131     uint max = 2147483648;
    132 
    133     if (slideMasterIdList != null)
    134         // Get the maximum id value from the current set of children.
    135         foreach (SlideMasterId child in
    136           slideMasterIdList.Elements<SlideMasterId>())
    137         {
    138             uint id = child.Id;
    139 
    140             if (id > max)
    141                 max = id;
    142         }
    143 
    144     return max;
    145 }
    View Code

    二 表格中创建文本单元格

      1 using D = DocumentFormat.OpenXml.Drawing;
      2 
      3 /// <summary>
      4 /// 创建文本单元格
      5 /// </summary>
      6 /// <param name="text"></param>
      7 /// <returns></returns>
      8 public static D.TableCell CreateTextCell(string text, int? tableRowIndex, int fontSize = 12, string borderLineHexColor = "1784C7")
      9 {
     10     var textCol = new string[2];
     11     if (!string.IsNullOrEmpty(text))
     12     {
     13         if (text.Length > 25)
     14         {
     15             textCol[0] = text.Substring(0, 25);
     16             textCol[1] = text.Substring(26);
     17         }
     18         else
     19         {
     20             textCol[0] = text;
     21         }
     22     }
     23     else
     24     {
     25         textCol[0] = string.Empty;
     26     }
     27 
     28     var tableCell = new D.TableCell();
     29     var textBody = new D.TextBody();
     30     var bodyProperties = new D.BodyProperties();
     31     var listStyle = new D.ListStyle();
     32 
     33     textBody.Append(bodyProperties);
     34     textBody.Append(listStyle);
     35 
     36     var nonNull = textCol.Where(t => t != null).ToList();
     37     foreach (var textVal in nonNull)
     38     {
     39         var paragraph = new D.Paragraph();
     40         var paragraphProperties = new D.ParagraphProperties()
     41         {
     42             Alignment = D.TextAlignmentTypeValues.Center,  //水平居中
     43         };
     44 
     45         var run = new D.Run();
     46         var runProperties = new D.RunProperties()
     47         {
     48             Language = "en-US",
     49             Dirty = false,
     50             //SmtClean = false,
     51             FontSize = fontSize * 100,  //字体大小
     52         };
     53         //设置字体颜色
     54         //D.SolidFill solidFill = new D.SolidFill();
     55         //D.RgbColorModelHex rgbColorModelHex = new D.RgbColorModelHex() { Val = "0070C0" };
     56         //solidFill.Append(rgbColorModelHex);
     57         //runProperties.Append(solidFill);
     58         // 设置文本
     59         var drawingText = new D.Text()
     60         {
     61             Text = textVal,
     62         };
     63 
     64         run.Append(runProperties);
     65         run.Append(drawingText);
     66         paragraph.Append(paragraphProperties);
     67         paragraph.Append(run);
     68         textBody.Append(paragraph);
     69     }
     70 
     71     var tableCellProperties = new D.TableCellProperties()
     72     {
     73         Anchor = D.TextAnchoringTypeValues.Center,   //垂直居中
     74     };
     75     //设置单元格边框属性(线型,线宽,颜色等)
     76     SetTableCellBorderLineProperties(tableCellProperties, D.PresetLineDashValues.Dot, D.CompoundLineValues.Single, 2000, borderLineHexColor);
     77     //设置单元格填充属性
     78     if (tableRowIndex != null)
     79     {
     80         string tableCellFillColor = (tableRowIndex.Value % 2 == 0) ? "FFFFFF" : "F2F2F2";
     81         var tableCellSolidFill = new D.SolidFill()
     82         {
     83             RgbColorModelHex = new D.RgbColorModelHex() { Val = tableCellFillColor }
     84         };
     85         tableCellProperties.Append(tableCellSolidFill);
     86     }
     87 
     88     tableCell.Append(textBody);
     89     tableCell.Append(tableCellProperties);
     90     return tableCell;
     91 }
     92 
     93 /// <summary>
     94 /// SetTableCellBorderLineProperties
     95 /// </summary>
     96 /// <param name="tableCellProperties"></param>
     97 /// <param name="presetLineDashValues"></param>
     98 /// <param name="lineType"></param>
     99 /// <param name="lineHexColor"></param>
    100 private static void SetTableCellBorderLineProperties(D.TableCellProperties tableCellProperties, D.PresetLineDashValues presetLineDashValues, D.CompoundLineValues lineType, int lineWidth, string lineHexColor)
    101 {
    102     //left border
    103     var leftBorderLineProperties = new D.LeftBorderLineProperties() { CompoundLineType = lineType, Width = lineWidth };
    104     var solidFillL = new D.SolidFill() { RgbColorModelHex = new D.RgbColorModelHex() { Val = lineHexColor } };
    105     var presetDashL = new D.PresetDash() { Val = presetLineDashValues };
    106     leftBorderLineProperties.Append(solidFillL);
    107     leftBorderLineProperties.Append(presetDashL);
    108     tableCellProperties.Append(leftBorderLineProperties);
    109     //right border
    110     var rightBorderLineProperties = new D.RightBorderLineProperties() { CompoundLineType = lineType, Width = lineWidth };
    111     var solidFillR = new D.SolidFill() { RgbColorModelHex = new D.RgbColorModelHex() { Val = lineHexColor } };
    112     var presetDashR = new D.PresetDash() { Val = presetLineDashValues };
    113     rightBorderLineProperties.Append(solidFillR);
    114     rightBorderLineProperties.Append(presetDashR);
    115     tableCellProperties.Append(rightBorderLineProperties);
    116     //top border
    117     var topBorderLineProperties = new D.TopBorderLineProperties() { CompoundLineType = lineType, Width = lineWidth };
    118     var solidFillT = new D.SolidFill() { RgbColorModelHex = new D.RgbColorModelHex() { Val = lineHexColor } };
    119     var presetDashT = new D.PresetDash() { Val = presetLineDashValues };
    120     topBorderLineProperties.Append(solidFillT);
    121     topBorderLineProperties.Append(presetDashT);
    122     tableCellProperties.Append(topBorderLineProperties);
    123     //bottom border
    124     var bottomBorderLineProperties = new D.BottomBorderLineProperties() { CompoundLineType = lineType, Width = lineWidth };
    125     var solidFillB = new D.SolidFill() { RgbColorModelHex = new D.RgbColorModelHex() { Val = lineHexColor } };
    126     var presetDashB = new D.PresetDash() { Val = presetLineDashValues };
    127     bottomBorderLineProperties.Append(solidFillB);
    128     bottomBorderLineProperties.Append(presetDashB);
    129     tableCellProperties.Append(bottomBorderLineProperties);
    130 }
    View Code

    三 ppt幻灯片添加图片

     1 /// <summary>
     2 /// 添加图片
     3 /// </summary>
     4 /// <param name="slidePart">slidePart</param>
     5 /// <param name="imageBytes">imageBytes</param>
     6 /// <param name="offsetX">X轴偏移</param>
     7 /// <param name="offsetY">Y轴偏移</param>
     8 /// <param name="sizeX">X轴尺寸</param>
     9 /// <param name="sizeY">Y轴尺寸</param>
    10 public static void AddImage(SlidePart slidePart, byte[] imageBytes, long offsetX, long offsetY, long sizeX, long sizeY)
    11 {
    12     var imagePart = slidePart.AddImagePart(ImagePartType.Png);
    13     using (var memoryStream = new MemoryStream(imageBytes))
    14     {
    15         imagePart.FeedData(memoryStream);
    16     }
    17     var tree = slidePart
    18         .Slide
    19         .Descendants<DocumentFormat.OpenXml.Presentation.ShapeTree>()
    20         .First();
    21 
    22     var picture = new DocumentFormat.OpenXml.Presentation.Picture();
    23     picture.NonVisualPictureProperties = new DocumentFormat.OpenXml.Presentation.NonVisualPictureProperties();
    24     picture.NonVisualPictureProperties.Append(new DocumentFormat.OpenXml.Presentation.NonVisualDrawingProperties
    25     {
    26         Name = "My Shape",
    27         Id = (UInt32)tree.ChildElements.Count - 1
    28     });
    29 
    30     var nonVisualPictureDrawingProperties = new DocumentFormat.OpenXml.Presentation.NonVisualPictureDrawingProperties();
    31     nonVisualPictureDrawingProperties.Append(new DocumentFormat.OpenXml.Drawing.PictureLocks()
    32     {
    33         NoChangeAspect = true
    34     });
    35     picture.NonVisualPictureProperties.Append(nonVisualPictureDrawingProperties);
    36     picture.NonVisualPictureProperties.Append(new DocumentFormat.OpenXml.Presentation.ApplicationNonVisualDrawingProperties());
    37 
    38     var blipFill = new DocumentFormat.OpenXml.Presentation.BlipFill();
    39     var blip1 = new DocumentFormat.OpenXml.Drawing.Blip()
    40     {
    41         Embed = slidePart.GetIdOfPart(imagePart)
    42     };
    43     var blipExtensionList1 = new DocumentFormat.OpenXml.Drawing.BlipExtensionList();
    44     var blipExtension1 = new DocumentFormat.OpenXml.Drawing.BlipExtension()
    45     {
    46         Uri = "{28A0092B-C50C-407E-A947-70E740481C1C}"
    47     };
    48     var useLocalDpi1 = new DocumentFormat.OpenXml.Office2010.Drawing.UseLocalDpi()
    49     {
    50         Val = false
    51     };
    52     useLocalDpi1.AddNamespaceDeclaration("a14", "http://schemas.microsoft.com/office/drawing/2010/main");
    53     blipExtension1.Append(useLocalDpi1);
    54     blipExtensionList1.Append(blipExtension1);
    55     blip1.Append(blipExtensionList1);
    56     var stretch = new DocumentFormat.OpenXml.Drawing.Stretch();
    57     stretch.Append(new DocumentFormat.OpenXml.Drawing.FillRectangle());
    58     blipFill.Append(blip1);
    59     blipFill.Append(stretch);
    60     picture.Append(blipFill);
    61 
    62     picture.ShapeProperties = new DocumentFormat.OpenXml.Presentation.ShapeProperties();
    63     picture.ShapeProperties.Transform2D = new DocumentFormat.OpenXml.Drawing.Transform2D();
    64     picture.ShapeProperties.Transform2D.Append(new DocumentFormat.OpenXml.Drawing.Offset
    65     {
    66         X = offsetX,
    67         Y = offsetY,
    68     });
    69     picture.ShapeProperties.Transform2D.Append(new DocumentFormat.OpenXml.Drawing.Extents
    70     {
    71         Cx = sizeX,
    72         Cy = sizeY,
    73     });
    74     picture.ShapeProperties.Append(new DocumentFormat.OpenXml.Drawing.PresetGeometry
    75     {
    76         Preset = DocumentFormat.OpenXml.Drawing.ShapeTypeValues.Rectangle
    77     });
    78 
    79     tree.Append(picture);
    80 }
    View Code
  • 相关阅读:
    Asp.net 表单打印时的样式设置【原】
    Asp.net页面编辑时怎样获取隐藏列的值【原】
    C# Winform 捕获窗体的最小化和最大化事件、关闭按钮事件【整理】
    SQL 快速删除表数据并不生成日志的语句【搜藏】
    Asp.net 前段页面控件 filedset 对应的服务端控件【原】
    Asp.net 关于 HTTP403 – 访问错误 的原因及解决【原】
    Js对一个对象应用滤镜的几种方法【整理】
    Asp.net 查找不到动态创建的控件之解决办法【整理】
    C# windows service承載遠程對象
    自己写的一个日志记录类
  • 原文地址:https://www.cnblogs.com/miaosha5s/p/13169235.html
Copyright © 2020-2023  润新知