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时插入图片的详细内容...