• OpenXml 学习记录 标签目录 插入文本 表格 图片


    关于目录标签的一些解析可以看下这篇文章:https://www.cnblogs.com/xuanhun/archive/2011/06/16/2083061.html

    以下是我自己的学习记录。

    首先打开文档,获取body

    using (WordprocessingDocument doc = WordprocessingDocument.Open(file, true))
    {
        MainDocumentPart docPart = doc.MainDocumentPart;
        Body body = docPart.Document.Body;
    }

    通过body获取1-5级目录标签

    var parHasStyle = body.Descendants<Paragraph>().Where(t => t.Descendants<ParagraphStyleId>().Count() > 0 &&
    t.Descendants<ParagraphStyleId>().All(c => c.Val == "1" || c.Val == "2" || c.Val == "3" || c.Val == "4" || c.Val == "5"));

     下面是完整的获取标签,包含目录层级关系,目录的页码

        /// <summary>
            /// 获取目录信息及页码
            /// </summary>
            /// <returns></returns>
            public List<XmlMark> GetMenus()
            {
                List<XmlMark> menus = new List<XmlMark>();
                Body body = _doc.MainDocumentPart.Document.Body;
                var pars = body.Descendants<SdtBlock>().First().Descendants<SdtContentBlock>().First().Descendants<Paragraph>();
                foreach (var par in pars)
                {
                    var txt = ToText(par);
                    if (txt == "目录" || string.IsNullOrEmpty(txt)) continue;
                    XmlMark xml = null;
                    var hyperlink = par.Descendants<Hyperlink>().First();
                    if (hyperlink != null)
                    {
                        xml = new XmlMark(txt, hyperlink.Anchor);
                    }
                    else
                    {
                        var p = par.Descendants<FieldCode>().First(fc => fc.Text.Contains("HYPERLINK"));
                        if (p == null) continue;
                        var match = System.Text.RegularExpressions.Regex.Match(p.Text, "_Toc\d+");
                        if (!match.Success) continue;
                        xml = new XmlMark(txt, match.Value);
                    }
                    var num = System.Text.RegularExpressions.Regex.Match(txt, "(?<=-\s)\d+(?=\s-)");//获取目录上的页码,格式:- 22 -
                    if (!num.Success) continue;
                    xml.PageIndex = Convert.ToInt32(num.Value);
                    menus.Add(xml);
                }
                return menus;
            }
            /// <summary>
            /// 转成文本
            /// </summary>
            /// <param name="p"></param>
            /// <returns></returns>
            private string ToText(Paragraph p)
            {
                return string.Join("", p.Descendants<Text>().Select(t => t.Text));
            }
            /// <summary>
            /// 获取书签信息包含页码,标签的层级关系
            /// </summary>
            /// <returns></returns>
            public List<XmlMark> GetMarks()
            {
                //用来匹配页码
                var menus = GetMenus();
                Dictionary<string, int> mark2pageindex = new Dictionary<string, int>();
                foreach (var xml in menus)
                {
                    mark2pageindex.Add(xml.BookmarkName, xml.PageIndex);
                }
                List<XmlMark> marks = new List<XmlMark>();
                Body body = _doc.MainDocumentPart.Document.Body;
                var pars = body.Descendants<Paragraph>().Where(t => t.Descendants<ParagraphStyleId>().Count() > 0 &&
    t.Descendants<ParagraphStyleId>().All(c => c.Val == "1" || c.Val == "2" || c.Val == "3" || c.Val == "4" || c.Val == "5"));
                XmlMark premark = null;
                foreach (var par in pars)
                {
                    var mark = new XmlMark(par);
                    if (string.IsNullOrEmpty(mark.BookmarkId)) continue;
                    if (mark2pageindex.ContainsKey(mark.BookmarkName))
                        mark.PageIndex = mark2pageindex[mark.BookmarkName];
                    var parent = GetParentmark(premark, mark);
                    if (parent == null)
                        marks.Add(mark);
                    else
                        parent.AddItem(mark);
                    premark = mark;
                }
                return marks;
            }
            /// <summary>
            /// 获取父标签
            /// </summary>
            /// <param name="parent"></param>
            /// <param name="mark"></param>
            /// <returns></returns>
            private XmlMark GetParentmark(XmlMark parent, XmlMark mark)
            {
                if (parent == null) return null;
                if (mark.PStyleId == parent.PStyleId)
                    return parent.Parent;
                if (mark.PStyleId.CompareTo(parent.PStyleId) > 0)
                    return parent;
                else
                    return GetParentmark(parent.Parent, mark);
            }
    //标签数据类
    public
    class XmlMark { public XmlMark(string name, string markName) { Name = name; BookmarkName = markName; } public XmlMark(Paragraph par) { Par = par; Name = par.InnerText; PStyleId = par.Descendants<ParagraphStyleId>().First().Val; var starts = par.Descendants<BookmarkStart>(); if (starts.Count() > 0) { BookmarkName = starts.First().Name; BookmarkId = starts.First().Id; } } public Paragraph Par { get; set; } public string Name { get; set; } public int PageIndex { get; set; } public string PStyleId { get; set; } public string BookmarkName { get; set; } public string BookmarkId { get; set; } public XmlMark Parent { get; set; } public List<XmlMark> MenuItems { get; private set; } = new List<XmlMark>(); public void AddItem(XmlMark menu) { menu.Parent = this; this.MenuItems.Add(menu); } public void RemoveItem(XmlMark menu) { this.MenuItems.Remove(menu); menu.Parent = null; } public void Clear() { MenuItems.ForEach(m => m.Parent = null); MenuItems.Clear(); } }

    接下去就是添加数据:

    首先是插入文本(使用只需要body.Append()就可以了)

    /// <summary>
            /// 添加文本
            /// </summary>
            /// <param name="txt">字符串</param>
            /// <param name="fontname">字体</param>
            /// <param name="fontSize">大小</param>
            /// <param name="isbold">是否加粗</param>
            /// <param name="horizontalcenter">水平居中</param>
            /// <param name="fontcolor">字体颜色</param>
            /// <returns></returns>
            public Paragraph AddText(string txt, string fontname = "宋体", int fontSize = 11, bool isbold = false, bool horizontalcenter = false, System.Drawing.Color fontcolor = default(System.Drawing.Color))
            {
                Paragraph paragraph1 = new Paragraph();
    
                ParagraphProperties paragraphProperties1 = new ParagraphProperties();
                Justification justification1 = new Justification() { Val = JustificationValues.Center };
    
                ParagraphMarkRunProperties paragraphMarkRunProperties1 = new ParagraphMarkRunProperties();
                RunFonts runFonts1 = new RunFonts() { Hint = FontTypeHintValues.EastAsia, Ascii = fontname, HighAnsi = fontname, EastAsia = fontname, ComplexScript = fontname };
                FontSize fontSize1 = new FontSize() { Val = (fontSize * 2).ToString() };
                FontSizeComplexScript fontSizeComplexScript1 = new FontSizeComplexScript() { Val = (fontSize * 2).ToString() };
                Languages languages1 = new Languages() { Val = "en-US", EastAsia = "zh-CN" };
    
                paragraphMarkRunProperties1.Append(runFonts1);
                if (isbold)
                    paragraphMarkRunProperties1.Append(new Bold());
                paragraphMarkRunProperties1.Append(fontSize1);
                paragraphMarkRunProperties1.Append(fontSizeComplexScript1);
                paragraphMarkRunProperties1.Append(languages1);
                if (horizontalcenter)
                    paragraphProperties1.Append(justification1);
                paragraphProperties1.Append(paragraphMarkRunProperties1);
    
                Run run1 = new Run();
                RunProperties runProperties1 = new RunProperties();
                RunFonts runFonts2 = new RunFonts() { Hint = FontTypeHintValues.EastAsia, Ascii = fontname, HighAnsi = fontname, EastAsia = fontname, ComplexScript = fontname };
                FontSize fontSize2 = new FontSize() { Val = (fontSize * 2).ToString() };
                FontSizeComplexScript fontSizeComplexScript2 = new FontSizeComplexScript() { Val = (fontSize * 2).ToString() };
                Languages languages2 = new Languages() { Val = "en-US", EastAsia = "zh-CN" };
    
                runProperties1.Append(runFonts2);
                if (isbold)
                    runProperties1.Append(new Bold());
                if (fontcolor != default(System.Drawing.Color))
                {
                    var r = fontcolor.R.ToString("X");
                    var g = fontcolor.G.ToString("X");
                    var b = fontcolor.B.ToString("X");
                    string str = "";
                    if (r.Length == 1) str += "0";
                    str += r;
                    if (g.Length == 1) str += "0";
                    str += g;
                    if (b.Length == 1) str += "0";
                    str += b;
                    runProperties1.Append(new Color() { Val = str });
                }
                runProperties1.Append(fontSize2);
                runProperties1.Append(fontSizeComplexScript2);
                runProperties1.Append(languages2);
                Text text1 = new Text();
                text1.Text = txt;
    
                run1.Append(runProperties1);
                run1.Append(text1);
                BookmarkStart bookmarkStart1 = new BookmarkStart() { Name = "_GoBack", Id = "0" };
                BookmarkEnd bookmarkEnd1 = new BookmarkEnd() { Id = "0" };
    
                paragraph1.Append(paragraphProperties1);
                paragraph1.Append(run1);
                paragraph1.Append(bookmarkStart1);
                paragraph1.Append(bookmarkEnd1);
                return paragraph1;
            }

    然后插入表格的代码:(使用只需要body.Append()就可以了)

            public Table AddTable(System.Data.DataTable data)
            {
                var table = new Table();
                var totalwidth = data.Columns.Count * 120 * 15;
                var tableProperties1 = new TableProperties();
                var tableStyle1 = new TableStyle() { Val = "a7" };
                var tableWidth1 = new TableWidth() { Width = totalwidth.ToString(), Type = TableWidthUnitValues.Dxa };
                var tableJustification1 = new TableJustification() { Val = TableRowAlignmentValues.Center };
                var tableLayout1 = new TableLayout() { Type = TableLayoutValues.Fixed };
                var tableLook1 = new TableLook() { Val = "04A0", FirstRow = true, LastRow = false, FirstColumn = true, LastColumn = false, NoHorizontalBand = false, NoVerticalBand = true };
                tableProperties1.Append(tableStyle1);
                tableProperties1.Append(tableWidth1);
                tableProperties1.Append(tableJustification1);
                tableProperties1.Append(tableLayout1);
                tableProperties1.Append(tableLook1);
                var tableGrid1 = new TableGrid();
                int count = data.Columns.Count;
                for (int i = 0; i < count; ++i)
                {
                    var gridColumn1 = new GridColumn() { Width = (120 * 15).ToString() };
                }
                table.Append(tableProperties1);
                table.Append(tableGrid1);
                foreach (System.Data.DataRow row in data.Rows)
                {
                    var tableRow1 = new TableRow();
                    var tableRowProperties1 = new TableRowProperties();
                    var tableRowHeight1 = new TableRowHeight() { Val = 400U, HeightType = HeightRuleValues.AtLeast };
                    var tableJustification2 = new TableJustification() { Val = TableRowAlignmentValues.Center };
                    tableRowProperties1.Append(tableRowHeight1);
                    tableRowProperties1.Append(tableJustification2);
    
                    var tablePropertyExceptions1 = new TablePropertyExceptions();
                    var tableBorders2 = new TableBorders();
                    var topBorder2 = new TopBorder() { Val = BorderValues.Single, Color = "auto", Size = 4U, Space = 0U };
                    var leftBorder2 = new LeftBorder() { Val = BorderValues.Single, Color = "auto", Size = 4U, Space = 0U };
                    var bottomBorder2 = new BottomBorder() { Val = BorderValues.Single, Color = "auto", Size = 4U, Space = 0U };
                    var rightBorder2 = new RightBorder() { Val = BorderValues.Single, Color = "auto", Size = 4U, Space = 0U };
                    var insideHorizontalBorder2 = new InsideHorizontalBorder() { Val = BorderValues.Single, Color = "auto", Size = 4U, Space = 0U };
                    var insideVerticalBorder2 = new InsideVerticalBorder() { Val = BorderValues.Single, Color = "auto", Size = 4U, Space = 0U };
                    tableBorders2.Append(topBorder2);
                    tableBorders2.Append(leftBorder2);
                    tableBorders2.Append(bottomBorder2);
                    tableBorders2.Append(rightBorder2);
                    tableBorders2.Append(insideHorizontalBorder2);
                    tableBorders2.Append(insideVerticalBorder2);
                    tablePropertyExceptions1.Append(tableBorders2);
    
                    tableRow1.Append(tablePropertyExceptions1);
                    tableRow1.Append(tableRowProperties1);
                    for (int cellindex = 0; cellindex < data.Columns.Count; ++cellindex)
                    {
                        var cell = row[cellindex];
                        if (cell == null) { continue; }
                        var tableCell1 = new TableCell();
                        var tableCellProperties1 = new TableCellProperties();
                        var tableCellWidth1 = new TableCellWidth() { Width = (120 * 15).ToString(), Type = TableWidthUnitValues.Dxa };
                        var tableCellVerticalAlignment1 = new TableCellVerticalAlignment() { Val = TableVerticalAlignmentValues.Center };
                        tableCellProperties1.Append(tableCellWidth1);
                        tableCellProperties1.Append(tableCellVerticalAlignment1);
                        var paragraph1 = new Paragraph();
                        var paragraphProperties1 = new ParagraphProperties();
                        var paragraphMarkRunProperties1 = new ParagraphMarkRunProperties();
                        var runFonts1 = new RunFonts() { Hint = FontTypeHintValues.Default, EastAsiaTheme = ThemeFontValues.MinorEastAsia };
                        var verticalTextAlignment1 = new VerticalTextAlignment() { Val = VerticalPositionValues.Baseline };
                        var languages1 = new Languages() { Val = "en-US", EastAsia = "zh-CN" };
                        var justification1 = new Justification() { Val = JustificationValues.Center };
    
                        paragraphMarkRunProperties1.Append(runFonts1);
                        paragraphMarkRunProperties1.Append(verticalTextAlignment1);
                        paragraphMarkRunProperties1.Append(languages1);
    
                        paragraphProperties1.Append(paragraphMarkRunProperties1);
                        paragraphProperties1.Append(justification1);
                        paragraph1.Append(paragraphProperties1);
    
                        var run1 = new Run();
                        var runProperties1 = new RunProperties();
                        var runFonts2 = new RunFonts() { Hint = FontTypeHintValues.EastAsia };
                        var verticalTextAlignment2 = new VerticalTextAlignment() { Val = VerticalPositionValues.Baseline };
    
                        var languages2 = new Languages() { Val = "en-US", EastAsia = "zh-CN" };
                        runProperties1.Append(runFonts2);
                        runProperties1.Append(verticalTextAlignment2);
                        runProperties1.Append(languages2);
                        var text1 = new Text();
                        text1.Text = cell.ToString();
    
                        run1.Append(runProperties1);
                        run1.Append(text1);
                        paragraph1.Append(run1);
    
                        tableCell1.Append(tableCellProperties1);
                        tableCell1.Append(paragraph1);
    
                        tableRow1.Append(tableCell1);
                    }
                    table.Append(tableRow1);
                }
                return table;
            }

    接下去添加图片 可以看看这两篇文章https://www.jb51.net/article/55567.htm 和 https://blog.csdn.net/renfufei/article/details/77481753/ 

    首先图片宽高对应关系:300*300对应的图片大小为:7.935cm*7.035cm,至于如何计算可以参考下面的计算换算规则:

    然而Open xml中的度量单位为EMU(全称为 English Metric Unit),1cm =360000EMUS,所以7.935cm=7.935*360000=2857500

    下面添加图片的代码:(使用只需要body.Append()就可以了)

            /// <summary>
            /// 添加图片
            /// </summary>
            /// <param name="picturePath">图片路径</param>    
            /// <param name="width">宽度像素</param>
            /// <param name="height">高度像素</param>
            /// <param name="wrapType">图片环绕类型0=嵌入,1=四周环绕,2=紧密型环绕,3=穿越型环绕,4=上下型环绕,5=衬于文字下方,6=浮于文字上方</param>
            /// <param name="horizontalcenter">水平居中,仅对wrapType=0生效</param>
            /// <returns></returns>
            public Paragraph AddPicture(string picturePath, int width, int height, int wrapType = 0, bool horizontalcenter = false)
            {
                string picType = picturePath.Split('.').Last();
                ImagePartType imagePartType;
                ImagePart imagePart = null;
                if (picType.ToLower() == "jpg")
                    imagePartType = ImagePartType.Jpeg;
                else
                    Enum.TryParse<ImagePartType>(picType, true, out imagePartType);
                imagePart = _doc.MainDocumentPart.AddImagePart(imagePartType);
                imagePart.FeedData(File.Open(picturePath, FileMode.Open)); // 读取图片二进制流
                var piccount = _doc.MainDocumentPart.Document.Body.Descendants<Drawing>().Count();
                return CreateImageParagraph(_doc.MainDocumentPart.GetIdOfPart(imagePart), Path.GetFileNameWithoutExtension(picturePath), ++piccount, width, height, wrapType, horizontalcenter);
            }
            /// <summary>
            /// 创建图片段落
            /// </summary>
            /// <param name="relationshipId">图片引用id</param>
            /// <param name="picname">图片名</param>
            /// <param name="picindex">图片在doc中的索引,即第几张图</param>
            /// <param name="width">宽度像素</param>
            /// <param name="height">高度像素</param>
            /// <param name="wrapType">图片环绕类型0=嵌入,1=四周环绕,2=紧密型环绕,3=穿越型环绕,4=上下型环绕,5=衬于文字下方,6=浮于文字上方</param>
            /// <param name="horizontalcenter">水平居中,仅对wrapType=0生效</param>
            /// <returns></returns>
            private Paragraph CreateImageParagraph(string relationshipId, string picname, int picindex, int width, int height, int wrapType = 0, bool horizontalcenter = false)
            {
                Paragraph paragraph1 = new Paragraph();
    
                ParagraphProperties paragraphProperties1 = new ParagraphProperties();
                Justification justification1 = new Justification() { Val = JustificationValues.Center };
                if (horizontalcenter && wrapType == 0)
                    paragraphProperties1.Append(justification1);
                ParagraphMarkRunProperties paragraphMarkRunProperties1 = new ParagraphMarkRunProperties();
                RunFonts runFonts1 = new RunFonts() { Hint = FontTypeHintValues.EastAsia, EastAsiaTheme = ThemeFontValues.MinorEastAsia };
                Languages languages1 = new Languages() { EastAsia = "zh-CN" };
                paragraphMarkRunProperties1.Append(runFonts1);
                paragraphMarkRunProperties1.Append(languages1);
    
                paragraphProperties1.Append(paragraphMarkRunProperties1);
                BookmarkStart bookmarkStart1 = new BookmarkStart() { Name = "_GoBack", Id = "0" };
                BookmarkEnd bookmarkEnd1 = new BookmarkEnd() { Id = "0" };
    
                Run run1 = new Run();
    
                RunProperties runProperties1 = new RunProperties();
                RunFonts runFonts2 = new RunFonts() { Hint = FontTypeHintValues.EastAsia, EastAsiaTheme = ThemeFontValues.MinorEastAsia };
                Languages languages2 = new Languages() { EastAsia = "zh-CN" };
    
                runProperties1.Append(runFonts2);
                runProperties1.Append(languages2);
    
                Drawing drawing1 = new Drawing();
    
                Wp.Anchor anchor1 = new Wp.Anchor() { DistanceFromTop = 0U, DistanceFromBottom = 0U, DistanceFromLeft = 0U, DistanceFromRight = 0U, SimplePos = false, RelativeHeight = 0U, BehindDoc = false, Locked = false, LayoutInCell = true, AllowOverlap = true };
                Wp.Inline inline1 = new Wp.Inline() { DistanceFromTop = 0U, DistanceFromBottom = 0U, DistanceFromLeft = 0U, DistanceFromRight = 0U };
                DocumentFormat.OpenXml.OpenXmlCompositeElement anchorline = anchor1;
                if (wrapType == 0) anchorline = inline1;
    
                Wp.SimplePosition simplePosition1 = new Wp.SimplePosition() { X = 0L, Y = 0L };
    
                Wp.HorizontalPosition horizontalPosition1 = new Wp.HorizontalPosition() { RelativeFrom = Wp.HorizontalRelativePositionValues.Column };
                Wp.PositionOffset positionOffset1 = new Wp.PositionOffset();
                positionOffset1.Text = "0";
    
                horizontalPosition1.Append(positionOffset1);
    
                Wp.VerticalPosition verticalPosition1 = new Wp.VerticalPosition() { RelativeFrom = Wp.VerticalRelativePositionValues.Paragraph };
                Wp.PositionOffset positionOffset2 = new Wp.PositionOffset();
                positionOffset2.Text = "0";
    
                verticalPosition1.Append(positionOffset2);
                Wp.Extent extent1 = new Wp.Extent() { Cx = (long)(width * 0.0264583 * 360000), Cy = (long)(height * 0.0264583 * 360000) };
                Wp.EffectExtent effectExtent1 = new Wp.EffectExtent() { LeftEdge = 0L, TopEdge = 0L, RightEdge = 0L, BottomEdge = 0L };
                DocumentFormat.OpenXml.OpenXmlElement wrap1 = null;
                var wrapPolygon1 = new Wp.WrapPolygon();
                var startPoint1 = new Wp.StartPoint() { X = 0L, Y = 0L };
                var lineTo1 = new Wp.LineTo() { X = 0L, Y = 21405L };
                var lineTo2 = new Wp.LineTo() { X = 21501L, Y = 21405L };
                var lineTo3 = new Wp.LineTo() { X = 21501L, Y = 0L };
                var lineTo4 = new Wp.LineTo() { X = 0L, Y = 0L };
                wrapPolygon1.Append(startPoint1);
                wrapPolygon1.Append(lineTo1);
                wrapPolygon1.Append(lineTo2);
                wrapPolygon1.Append(lineTo3);
                wrapPolygon1.Append(lineTo4);
                switch (wrapType)
                {
                    case 1: wrap1 = new Wp.WrapSquare() { WrapText = Wp.WrapTextValues.BothSides }; break;
                    case 2:
                        wrap1 = new Wp.WrapTight() { WrapText = Wp.WrapTextValues.BothSides };
                        wrap1.Append(wrapPolygon1);
                        break;
                    case 3:
                        wrap1 = new Wp.WrapThrough() { WrapText = Wp.WrapTextValues.BothSides };
                        wrap1.Append(wrapPolygon1);
                        break;
                    case 4:
                        wrap1 = new Wp.WrapTopBottom();
                        break;
                    case 5: wrap1 = new Wp.WrapNone(); anchor1.BehindDoc = true; break;
                    case 6: wrap1 = new Wp.WrapNone(); anchor1.BehindDoc = false; break;
                }
    
                Wp.DocProperties docProperties1 = new Wp.DocProperties() { Id = (uint)picindex, Name = "Picture " + picindex, Description = picname };
    
                Wp.NonVisualGraphicFrameDrawingProperties nonVisualGraphicFrameDrawingProperties1 = new Wp.NonVisualGraphicFrameDrawingProperties();
    
                A.GraphicFrameLocks graphicFrameLocks1 = new A.GraphicFrameLocks() { NoChangeAspect = true };
                graphicFrameLocks1.AddNamespaceDeclaration("a", "http://schemas.openxmlformats.org/drawingml/2006/main");
    
                nonVisualGraphicFrameDrawingProperties1.Append(graphicFrameLocks1);
    
                A.Graphic graphic1 = new A.Graphic();
                graphic1.AddNamespaceDeclaration("a", "http://schemas.openxmlformats.org/drawingml/2006/main");
    
                A.GraphicData graphicData1 = new A.GraphicData() { Uri = "http://schemas.openxmlformats.org/drawingml/2006/picture" };
    
                Pic.Picture picture1 = new Pic.Picture();
                picture1.AddNamespaceDeclaration("pic", "http://schemas.openxmlformats.org/drawingml/2006/picture");
    
                Pic.NonVisualPictureProperties nonVisualPictureProperties1 = new Pic.NonVisualPictureProperties();
                Pic.NonVisualDrawingProperties nonVisualDrawingProperties1 = new Pic.NonVisualDrawingProperties() { Id = (uint)picindex, Name = "Picture " + picindex, Description = picname };
    
                Pic.NonVisualPictureDrawingProperties nonVisualPictureDrawingProperties1 = new Pic.NonVisualPictureDrawingProperties();
                A.PictureLocks pictureLocks1 = new A.PictureLocks() { NoChangeAspect = true };
    
                nonVisualPictureDrawingProperties1.Append(pictureLocks1);
    
                nonVisualPictureProperties1.Append(nonVisualDrawingProperties1);
                nonVisualPictureProperties1.Append(nonVisualPictureDrawingProperties1);
    
                Pic.BlipFill blipFill1 = new Pic.BlipFill();
                A.Blip blip1 = new A.Blip() { Embed = relationshipId };
    
                A.Stretch stretch1 = new A.Stretch();
                A.FillRectangle fillRectangle1 = new A.FillRectangle();
    
                stretch1.Append(fillRectangle1);
    
                blipFill1.Append(blip1);
                blipFill1.Append(stretch1);
    
                Pic.ShapeProperties shapeProperties1 = new Pic.ShapeProperties();
    
                A.Transform2D transform2D1 = new A.Transform2D();
                A.Offset offset1 = new A.Offset() { X = 0L, Y = 0L };
                A.Extents extents1 = new A.Extents() { Cx = (long)(width * 0.0264583 * 360000), Cy = (long)(height * 0.0264583 * 360000) };
    
                transform2D1.Append(offset1);
                transform2D1.Append(extents1);
    
                A.PresetGeometry presetGeometry1 = new A.PresetGeometry() { Preset = A.ShapeTypeValues.Rectangle };
                A.AdjustValueList adjustValueList1 = new A.AdjustValueList();
    
                presetGeometry1.Append(adjustValueList1);
    
                shapeProperties1.Append(transform2D1);
                shapeProperties1.Append(presetGeometry1);
    
                picture1.Append(nonVisualPictureProperties1);
                picture1.Append(blipFill1);
                picture1.Append(shapeProperties1);
    
                graphicData1.Append(picture1);
                graphic1.Append(graphicData1);
    
                anchorline.Append(simplePosition1);
                anchor1.Append(horizontalPosition1);
                anchor1.Append(verticalPosition1);
                anchorline.Append(extent1);
                anchorline.Append(effectExtent1);
                if (wrap1 != null)
                    anchorline.Append(wrap1);
                anchorline.Append(docProperties1);
                anchorline.Append(nonVisualGraphicFrameDrawingProperties1);
                anchorline.Append(graphic1);
                drawing1.Append(anchorline);
    
                run1.Append(runProperties1);
                run1.Append(drawing1);
    
                paragraph1.Append(paragraphProperties1);
                paragraph1.Append(bookmarkStart1);
                paragraph1.Append(bookmarkEnd1);
                paragraph1.Append(run1);
                return paragraph1;
    
            }

     其他补充内容:

    使用Open XML SDK 2.5将图像添加到/ word / media文件夹
    你必须自己创建图像的包部分.
    MainDocumentPart类的AddImagePart()成员函数
    始终将图像存储在/ media文件夹中.

    下面的代码显示了如何将图像插入/ word / media文件夹
    使用以下步骤:

    >创建一个包含路径Uri设置为/ word / media的PackagePart.
    >将图像数据输入包装部件.
    >为图像创建PackageReleationship.
    >使用PackageReleationship的ID来引用图像word文档.

    我已经复制了AddImageToBody()函数的代码

    public static void InsertAPicture(string document, string fileName)
    {
      using (WordprocessingDocument wordprocessingDocument =
          WordprocessingDocument.Open(document, true))
      {
        MainDocumentPart mainPart = wordprocessingDocument.MainDocumentPart;
    
        Uri imageUri = new Uri("/word/media/" +
          System.IO.Path.GetFileName(fileName), UriKind.Relative);
    
        // Create "image" part in /word/media
        // Change content type for other image types.
        PackagePart packageImagePart = 
          wordprocessingDocument.Package.CreatePart(imageUri, "Image/jpeg");
    
        // Feed data.
        byte[] imageBytes = File.ReadAllBytes(fileName);
        packageImagePart.GetStream().Write(imageBytes, 0, imageBytes.Length);
    
        PackagePart documentPackagePart = 
          mainPart.OpenXmlPackage.Package.GetPart(new Uri("/word/document.xml", UriKind.Relative));
    
        Console.Out.WriteLine(documentPackagePart.Uri);
    
        // URI to the image is relative to releationship document.
        PackageRelationship imageReleationshipPart = documentPackagePart.CreateRelationship(
              new Uri("media/" + System.IO.Path.GetFileName(fileName), UriKind.Relative),
              TargetMode.Internal, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image");
    
        AddImageToBody(wordprocessingDocument, imageReleationshipPart.Id);
      }
    }
    
    private static void AddImageToBody(WordprocessingDocument wordDoc, string relationshipId)
    {
      var element =
           new Drawing(
               new DW.Inline(
                   new DW.Extent() { Cx = 990000L, Cy = 792000L },
                   new DW.EffectExtent()
                   {
                     LeftEdge = 0L,
                     TopEdge = 0L,
                     RightEdge = 0L,
                     BottomEdge = 0L
                   },
                   new DW.DocProperties()
                   {
                     Id = (UInt32Value)1U,
                     Name = "Picture 1"
                   },
                   new DW.NonVisualGraphicFrameDrawingProperties(
                       new A.GraphicFrameLocks() { NoChangeAspect = true }),
                   new A.Graphic(
                       new A.GraphicData(
                           new PIC.Picture(
                               new PIC.NonVisualPictureProperties(
                                   new PIC.NonVisualDrawingProperties()
                                   {
                                     Id = (UInt32Value)0U,
                                     Name = "New Bitmap Image.jpg"
                                   },
                                   new PIC.NonVisualPictureDrawingProperties()),
                               new PIC.BlipFill(
                                   new A.Blip(
                                       new A.BlipExtensionList(
                                           new A.BlipExtension()
                                           {
                                             Uri =
                                               "{28A0092B-C50C-407E-A947-70E740481C1C}"
                                           })
                                   )
                                   {
                                     Embed = relationshipId,
                                     CompressionState =
                                     A.BlipCompressionValues.Print
                                   },
                                   new A.Stretch(
                                       new A.FillRectangle())),
                               new PIC.ShapeProperties(
                                   new A.Transform2D(
                                       new A.Offset() { X = 0L, Y = 0L },
                                       new A.Extents() { Cx = 990000L, Cy = 792000L }),
                                   new A.PresetGeometry(
                                       new A.AdjustValueList()
                                   ) { Preset = A.ShapeTypeValues.Rectangle }))
                       ) { Uri = "http://schemas.openxmlformats.org/drawingml/2006/picture" })
               )
               {
                 DistanceFromTop = (UInt32Value)0U,
                 DistanceFromBottom = (UInt32Value)0U,
                 DistanceFromLeft = (UInt32Value)0U,
                 DistanceFromRight = (UInt32Value)0U,
                 EditId = "50D07946"
               });
    
      wordDoc.MainDocumentPart.Document.Body.AppendChild(
        new DocumentFormat.OpenXml.Wordprocessing.Paragraph(
          new DocumentFormat.OpenXml.Wordprocessing.Run(element)));
    }
  • 相关阅读:
    Socket经验记录
    有了WCF,Socket是否已人老珠黄?
    更新Svn客户端后,右键菜单中没有TortoiseSVN了
    线程已被中止 “Thread was being aborted”
    c# 温故而知新: 线程篇(一)
    SOCKET是多线程安全的吗? [问题点数:40分,结帖人CSDN]
    <base href=""/> 的应用
    Python Twisted 框架中 socket通信
    本人作品-〉VPS应用>Discuz网页斗地主插件
    浅析 c# Queue
  • 原文地址:https://www.cnblogs.com/mqxs/p/14355334.html
Copyright © 2020-2023  润新知