好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

C#如何使用DocumentFormat.OpenXml生成WORD时插入图片

C#如何使用DocumentFormat.OpenXml生成WORD时插入图片

在 C# 中使用 ?DocumentFormat.OpenXml? 在 Word 文档中插入图片,需通过 ImagePart 和 Drawing 对象实现。以下是完整代码与步骤说明:

步骤 1:安装必要的 NuGet 包:

Install-Package DocumentFormat.OpenXml

?步骤 2:核心代码实现

using DocumentFormat.OpenXml;

using DocumentFormat.OpenXml.Packaging;

using DocumentFormat.OpenXml.Wordprocessing;

using System.IO;

public static void InsertImageToWord(string docPath, string imagePath)

{

    using (WordprocessingDocument doc = WordprocessingDocument.Create(docPath, WordprocessingDocumentType.Document))

    {

        // 创建主文档部分

        MainDocumentPart mainPart = doc.AddMainDocumentPart();

        mainPart.Document = new Document();

        Body body = mainPart.Document.AppendChild(new Body());

        // 添加段落用于存放图片

        Paragraph paragraph = new Paragraph();

        Run run = new Run();

        // 加载图片并生成 Drawing 对象

        Drawing drawing = CreateImageDrawing(doc, mainPart, imagePath);

        run.AppendChild(drawing);

        paragraph.AppendChild(run);

        body.AppendChild(paragraph);

        mainPart.Document.Save();

    }

}

private static Drawing CreateImageDrawing(WordprocessingDocument doc, MainDocumentPart mainPart, string imagePath)

{

    // 1. 加载图片到内存流

    using (FileStream imageStream = new FileStream(imagePath, FileMode.Open))

    {

        // 2. 创建 ImagePart(根据图片格式选择对应类型,如 ImagePartType.Png)

        string imagePartId = "ImagePart_" + Path.GetFileName(imagePath);

        ImagePart imagePart = mainPart.AddImagePart(ImagePartType.Jpeg); // 或 ImagePartType.Png

        imagePart.FeedData(imageStream);

        // 3. 定义图片尺寸(单位:英制单位 EMU)

        const int emuPerInch = 914400; // 1英寸 = 914400 EMU

        int widthPx = 600;            // 图片显示宽度(像素)

        int heightPx = 400;           // 图片显示高度(像素)

        // 转换为 EMU 单位(假设 DPI 为 96)

        long widthEmu = (long)(widthPx * emuPerInch / 96.0);

        long heightEmu = (long)(heightPx * emuPerInch / 96.0);

        // 4. 生成 Drawing 对象

        Drawing drawing = new Drawing(

            new DW.Inline(

                new DW.Extent { Cx = widthEmu, Cy = heightEmu },

                new DW.EffectExtent { LeftEdge = 0, TopEdge = 0, RightEdge = 0, BottomEdge = 0 },

                new DW.DocProperties { Id = 1, 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 = 0, Name = "Image1" },

                                new PIC.NonVisualPictureDrawingProperties()),

                            new PIC.BlipFill(

                                new A.Blip(

                                    new A.BlipExtensionList(

                                        new A.BlipExtension { Uri = "{28A0092B-C50C-407E-A947-70E740481C1C}" }))

                                {

                                    Embed = doc.MainDocumentPart.GetIdOfPart(imagePart), // 绑定图片ID

                                    CompressionState = A.BlipCompressionValues.Print

                                },

                                new A.Stretch(new A.FillRectangle())),

                            new PIC.ShapeProperties(

                                new A.Transform2D(

                                    new A.Offset { X = 0, Y = 0 },

                                    new A.Extents { Cx = widthEmu, Cy = heightEmu }),

                                new A.PresetGeometry(

                                    new A.AdjustValueList()

                                ) { Preset = A.ShapeTypeValues.Rectangle }))

                    ) { Uri = "http://schemas.openxmlformats.org/drawingml/2006/picture" })

            ) { DistanceFromTop = 0, DistanceFromBottom = 0, DistanceFromLeft = 0, DistanceFromRight = 0 }

        );

        return drawing;

    }

}


查看更多关于C#如何使用DocumentFormat.OpenXml生成WORD时插入图片的详细内容...

  阅读:30次