学习C#调用OpenXml操作word文档的基本用法(34:学习图形类-4)

  上一篇文章介绍了openxml中word文档相关的浮动式布局类Anchor的主要属性,但只配置这些属性并不能以浮动式布局向word文档中插入图片。Anchor类支持下图所示子类型,尤其是Graphic类、DocProperties类等,只有在Ahchor类中插入这些子类型实例,才能正确的向word文档中插入并显示图片。同时根据网上的说法,Anchor类的子类型的实例插入顺序也会影响图片插入效果。

  下图是手工设置word文档中的图片的浮动式布局后,document.xml文件中Anchor中的属性设置及子元素设置如下图所示:

  下面的代码用于向word文档的页面中间以浮动方式插入图片:

csharp 复制代码
    DW.Anchor element = new DW.Anchor(
        //简单定位,设为false表示使用复杂定位
        // 这句代码必须要有,注释掉之后word文档打不开
        new DW.SimplePosition() { X = 100000, Y = 100000 },

        //水平位置,使用绝对偏移量,相对于页面边缘
        new DW.HorizontalPosition(new DW.HorizontalAlignment("center")){ RelativeFrom = DW.HorizontalRelativePositionValues.Page },

        // 垂直位置:页面居中
        new DW.VerticalPosition(new DW.VerticalAlignment("center")){ RelativeFrom = DW.VerticalRelativePositionValues.Page },

        //图片的显示尺寸(宽度和高度,单位为EMU)
        new DW.Extent() { Cx = 500000L, Cy = 500000L },

        //效果范围(可选,通常设为0)
        new DW.EffectExtent() { LeftEdge = 0L, TopEdge = 0L, RightEdge = 0L, BottomEdge = 0L },

        // 四周型环绕
        new DW.WrapSquare() { WrapText = DW.WrapTextValues.BothSides },

        // 绘图对象的非可视属性,包括ID和名称
        new DW.DocProperties() { Id = 1U, Name = "Floating Image" },

        // 图形框架的非可视属性
        new DW.NonVisualGraphicFrameDrawingProperties(new A.GraphicFrameLocks() { NoChangeAspect = true }),

        // 包含实际图片数据的图形对象
        new A.Graphic(
            new A.GraphicData(
                new PIC.Picture(
                    new PIC.NonVisualPictureProperties(
                        new PIC.NonVisualDrawingProperties() { Id = 0U, Name = "Picture 1" },
                        new PIC.NonVisualPictureDrawingProperties()
                    ),
                    new PIC.BlipFill(
                        new A.Blip() { 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 = 500000L, Cy = 500000L }
                        ),
                        new A.PresetGeometry(new A.AdjustValueList()) { Preset = A.ShapeTypeValues.Rectangle }
                    )
                )
            )
            { Uri = "http://schemas.openxmlformats.org/drawingml/2006/picture" }
        )
)
    {
        SimplePos = false,
        RelativeHeight = 251658240U,
        BehindDoc = false,
        Locked = false,
        LayoutInCell = true,
        AllowOverlap = true,
        DistanceFromTop = 0U,
        DistanceFromBottom = 0U,
        DistanceFromLeft = 0U,
        DistanceFromRight = 0U
    };
    
    return new Drawing(element);

  程序运行效果截图及word文档截图如下所示:

参考文献

1https://github.com/dotnet/Open-XML-SDK

2https://learn.microsoft.com/zh-cn/office/open-xml/open-xml-sdk

3https://learn.microsoft.com/zh-cn/dotnet/api/documentformat.openxml.wordprocessing.style?view=openxml-3.0.1

4https://blog.csdn.net/i042416/article/details/126228816

相关推荐
工具派6 小时前
Word文档太大怎么拆分?段落结构与两种拆法的边界实测
开发语言·c#·word
Metaphor6926 小时前
Python 实现 Word/TXT 互转:附完整代码
python·word·格式转换·txt
小羊没烦恼!7 小时前
【译】利用Asp.net MVC处理文件的上传下载
开发语言·缓存·c#·word·powerpoint·.net
小羊没烦恼!7 天前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
Am-Chestnuts7 天前
DeepSeek表格复制到Word变竖线错列?用DS随心转对比几种整理方法
人工智能·word·ds随心转
2501_9307077810 天前
使用C#代码为新创建的 Word 文档创建目录
c#·word
SunnyDays101110 天前
Java 拆分 Word 文档教程:按页、分页符和分节符拆分
java·word·分页·拆分
copilot中国版11 天前
Word Copilot|一键提取文档关键信息,告别逐字阅读
word·copilot
天人合一peng13 天前
西北工业大学校外访问系统
word
古少侠13 天前
deepseek转word工具怎么选?DS随心转与4种方案对比实测
人工智能·word·powerpoint