You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用C#在Word OpenXML中创建文本框?代码报错求助

解决OpenXML创建Word文本框导致文档损坏的问题

你的代码直接将TextBox元素添加到文档Body中,这不符合OpenXML的文档结构规范,Word无法正确解析这种结构,所以会提示文档损坏。要正确创建文本框,需要将TextBox嵌套在Drawing元素内,并补充必要的布局属性。

以下是修正后的完整代码:

using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using DocumentFormat.OpenXml.Drawing;
using DocumentFormat.OpenXml.Drawing.Wordprocessing;
using System.IO;

// ... 方法内部代码
using (MemoryStream memory = new MemoryStream())
{
    using (WordprocessingDocument wordDocument = WordprocessingDocument.Create(memory, WordprocessingDocumentType.Document, true))
    {
        MainDocumentPart mainPart = wordDocument.AddMainDocumentPart();
        mainPart.Document = new Document();
        Body docBody = new Body();

        // 创建文本框内的内容段落
        Paragraph textPara = new Paragraph(
            new Run(
                new Text("test")
            )
        );

        // 构建文本框所需的完整嵌套结构
        Drawing drawing = new Drawing(
            new DW.Inline(
                new DW.Extent() { Cx = 4572000, Cy = 1524000 }, // 文本框尺寸:宽150px、高50px(1px=30480 EMU单位)
                new DW.EffectExtent() { LeftEdge = 0L, TopEdge = 0L, RightEdge = 0L, BottomEdge = 0L },
                new DW.DocProperties() { Id = (UInt32Value)1U, Name = "TextBox 1" },
                new DW.NonVisualGraphicFrameDrawingProperties(
                    new A.GraphicFrameLocks() { NoChangeAspect = true }
                ),
                new A.Graphic(
                    new A.GraphicData(
                        new TextBox(
                            new TextBoxContent(textPara)
                        )
                    ) { Uri = "http://schemas.openxmlformats.org/drawingml/2006/textBox" }
                )
            ) { DistanceFromTop = 0U, DistanceFromBottom = 0U, DistanceFromLeft = 190500U, DistanceFromRight = 0U }
        );

        // 将绘图元素包裹进段落,再添加到文档主体
        docBody.Append(new Paragraph(new Run(drawing)));
        mainPart.Document.Append(docBody);
        wordDocument.Save();
    }

    return new MemoryStream(memory.ToArray());
}

关键修正点说明:

  • 结构嵌套要求:TextBox必须放在A.GraphicData内,再依次嵌套A.Graphic、DW.Inline、Drawing元素,最终通过Run和Paragraph添加到文档Body,这是Word能识别的合法结构。
  • 布局属性:DW.Extent定义文本框的大小(使用EMU单位,1像素=30480 EMU);DW.Inline中的DistanceFromLeft等属性控制文本框相对于段落的偏移位置。
  • 命名空间依赖:需要引用DocumentFormat.OpenXml.Drawing(简称A)和DocumentFormat.OpenXml.Drawing.Wordprocessing(简称DW)命名空间,对应OpenXML中绘图相关的元素集合。

内容的提问来源于stack exchange,提问作者Vasile Mihai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 13:30:41