C#WordprocessingDocument - 在单元格中插入图像

时间:2017-01-26 15:36:19

标签: c# image openxml wordprocessingml

我有一个替换文档特定文本中的标记的方法。如何更换标签图片? enter image description here

2 个答案:

答案 0 :(得分:4)

这是一段代码,用于在表格中查找文本为“PersonMainPhoto”的单元格。清除表格单元格并插入图像。希望这可以指导您朝着正确的方向发展。

插入图像分为两部分:

  • 将图像部分添加到文档
  • 在正文文本中插入对图像的引用 - 包含有关缩放,定位等的各种细节。

插入引用的代码来自精彩的OpenXML SDK文档:https://msdn.microsoft.com/en-us/library/office/bb497430.aspx

using System.IO;
using System.Linq;
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using A = DocumentFormat.OpenXml.Drawing;
using DW = DocumentFormat.OpenXml.Drawing.Wordprocessing;
using PIC = DocumentFormat.OpenXml.Drawing.Pictures;

namespace StackOverflow
{
  class Program
  {
    static void Main(string[] args)
    {
      string file = @"c:\temp\mydoc.docx";
      string imageFile = @"c:\temp\myimage.jpg";
      string labelText = "PersonMainPhoto";

      using (var document = WordprocessingDocument.Open(file, isEditable: true))
      {
        var mainPart = document.MainDocumentPart;
        var table = mainPart.Document.Body.Descendants<Table>().First();

        var pictureCell = table.Descendants<TableCell>().First(c => c.InnerText == labelText);

        ImagePart imagePart = mainPart.AddImagePart(ImagePartType.Jpeg);

        using (FileStream stream = new FileStream(imageFile, FileMode.Open))
        {
          imagePart.FeedData(stream);
        }

        pictureCell.RemoveAllChildren();
        AddImageToCell(pictureCell, mainPart.GetIdOfPart(imagePart));

        mainPart.Document.Save();
      }
    }

    private static void AddImageToCell(TableCell cell, 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
          });

      cell.Append(new Paragraph(new Run(element)));
    }
  }
}

答案 1 :(得分:0)

图片如何适合表格单元格??

不修复它。 Cx = 990000L,Cy = 792000L

像这样吗?

   TableCellProperties tableCellProperties1 = VARIABLE.GetFirstChild<TableCellProperties>();

   TableCellWidth tableCellWidth1 = tableCellProperties1.GetFirstChild<TableCellWidth>();

   int _width = Int32.Parse(tableCellWidth1.Width);

   TableRowProperties tableRowProperties1 = 

   VARIABLE.Parent.GetFirstChild<TableRowProperties>();

   TableRowHeight tableRowHeight1 = 

   tableRowProperties1.GetFirstChild<TableRowHeight>();
   int _height = Int32.Parse(tableRowHeight1.Val);     

   document.MainDocumentPart.Document.Save();