标签: openxml

在 OpenXML 中处理 Word 文档时从 OpenXmlElement 获取 DocumentPart

我正在使用 OpenXML API 修改 docx 模板并遇到问题。

我需要将图像插入到某个位置 - 该位置由内容控制元素定义,该元素可以位于文档的主要部分、页眉或页脚中。

我得到这样的内容控制:

static IEnumerable<TElement> GetDecendants<TElement>(OpenXmlPart part) where TElement : OpenXmlElement
{
    var result = part.RootElement
        .Descendants()
        .OfType<TElement>();

    return result;
}
Run Code Online (Sandbox Code Playgroud)

稍后,我需要通过此管道将图像插入到文档的正确部分

internal static OpenXmlElement InsertImage(OpenXmlPart documentPart, Stream stream, string fileName, int imageWidth, int imageHeight)
{
    // actual implementation that is tested and works
}
Run Code Online (Sandbox Code Playgroud)

现在我的问题是,当我发现需要用图像替换的 ContentControl 元素时,我没有引用documentPart- 我只有引用 soSdtRunSdtBlock

有没有办法导航到documentPartfrom SdtRun?我已经检查过.Parent,但找不到从 到 的方法OpenXmlElement-OpenXmlPart这些位于不同的层次结构中。

c# ms-word openxml openxml-sdk

3
推荐指数
1
解决办法
2285
查看次数

如何使用 open xml c# 居中对齐段落

我正在尝试将段落居中对齐,但对该段落没有任何影响。我正在使用 OpenXml。下面是代码:

//paragraph properties 
ParagraphProperties User_heading_pPr = new ParagraphProperties();

//trying to align center a paragraph
Justification justification1 = new Justification() { Val = JustificationValues.Center };

// build paragraph piece by piece
Text text = new Text(DateTime.Now.ToString() + " , ");
Text text1 = new Text(gjenerimi + " , ");
Text text2 = new Text(merreshifren());
var run = new Run();
run.Append(text,text1,text2);
Paragraph newParagraph = new Paragraph(run);
User_heading_pPr.Append(justification1);
newParagraph.Append(User_heading_pPr);
Run Code Online (Sandbox Code Playgroud)

这是我尝试将段落居中对齐的方法。

c# ms-word openxml openxml-sdk

3
推荐指数
1
解决办法
7270
查看次数

Document.Body.Descendants&lt;SdtBlock&gt;() 不返回所有 *sdt* 元素

我正在尝试查找 Word 文档中的所有 SdtElement。我使用了下面的代码:

using (var wordDoc = WordprocessingDocument.Open(FilePath, true))
{
    var docSdts = wordDoc.MainDocumentPart.Document.Descendants<SdtElement>();
    // MainDocumentPart.Document.Body.Descendants<SdtElement>(); also used but same result

    MainDocumentPart mainPart = wordDoc.MainDocumentPart;
    List<SdtBlock> sdtList = mainPart.Document.Body.Descendants<SdtBlock>().ToList();

    // process all sdt
}
Run Code Online (Sandbox Code Playgroud)

问题是上面的代码没有返回文件中的所有 SdtElements。在一份文档中有 19 个 SdtElement,但它只返回 7 个。

根据文档,后代方法应返回所有级别的元素:

Elements只查找那些直接后代元素,即直接子元素。vs Descendants查找任何级别的孩子,即孩子、孙子等...

观察到的一件事是仅返回bodypara表格单元格下的sdt ,但是当sdt位于表格单元格内的para下时,它不会返回。

我尝试了http://www.ericwhite.com/blog/iteating-through-all-content-controls-in-an-open-xml-wordprocessingml-document/和其他类似文章中的代码。

如何从整个文档中获取所有 sdt 元素,无论嵌套级别如何?

c# openxml wordml

3
推荐指数
1
解决办法
1394
查看次数

使用 MemoryStream 打开 XML WordprocessingDocument 为 0KB

我正在尝试学习如何使用 Microsoft 的 Open XML SDK。我按照他们关于如何使用 a 创建 Word 文档的步骤进行操作FileStream,效果非常好。现在我想创建一个Word文档,但仅在内存中,并等待用户指定是否要保存该文件。

Microsoft 的这份文档说明了如何使用 处理内存中的文档MemoryStream,但是,该文档首先从现有文件加载并“转储”到MemorySteam. 我想要的是完全在内存中创建文档(而不是基于驱动器中的文件)。我认为可以实现这一点的是这段代码:

// This is almost the same as Microsoft's code except I don't
// dump any files into the MemoryStream
using (var mem = new MemoryStream())
{
    using (var doc = WordprocessingDocument.Create(mem, WordprocessingDocumentType.Document, true))
    {
        doc.AddMainDocumentPart().Document = new Document();
        var body = doc.MainDocumentPart.Document.AppendChild(new Body());
        var paragraph = body.AppendChild(new Paragraph());
        var run = paragraph.AppendChild(new Run());
        run.AppendChild(new Text("Hello docx"));

        using (var file …
Run Code Online (Sandbox Code Playgroud)

c# memorystream ms-word openxml .net-core

3
推荐指数
1
解决办法
6712
查看次数

使用SQL Server中的OpenXML从XML中提取数据

我有一个xml,我希望它在SQL Server中使用OpenXML提取

这是示例XML

<row>
  <student_token>7</student_token>
  <student_ssn>552</student_ssn>
  <alternate_id>20</alternate_id>
  <old_ssn xsi:nil="true" />
  <alien_num xsi:nil="true" />
  <last_name>A</last_name>
  <first_name>B</first_name>
  <middle_init xsi:nil="true" />
  <drivers_license_num xsi:nil="true" />
  <gpa_highschool xsi:nil="true" />
  <created_dt>2006-07-13T11:15:08.320</created_dt>
  <created_how>4</created_how>
  <modified_dt>2008-02-14T00:00:00</modified_dt>
  <modified_by>4</modified_by>
  <primary_street2 xsi:nil="true" />
  <primary_street3 xsi:nil="true" />
  <primary_country xsi:nil="true" />
  <email_address xsi:nil="true" />
  <address_start_dt xsi:nil="true" />
  <address_end_dt xsi:nil="true" />
  <entrance_iv_dt xsi:nil="true" />
  <entrance_iv_by xsi:nil="true" />
  <exit_iv_dt>2006-11-02T00:00:00</exit_iv_dt>
  <exit_iv_by>156</exit_iv_by>
  <foreign_address_indicator>N</foreign_address_indicator>
  <foreign_postal_code xsi:nil="true" />
  <pin>J27841</pin>
  <web_id>J08614   </web_id>
  <prior_name xsi:nil="true" />
  <orig_eps xsi:nil="true" />
  <web_role>STU1</web_role>
  <heal_limit_flag>N</heal_limit_flag>
  <email_address_2>test@test.com</email_address_2>
  <cellular_telephone>415</cellular_telephone>
  <alt_loan_debt xsi:nil="true" />
  <web_last_login xsi:nil="true" />
  <foreign_country_code xsi:nil="true" /> …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server openxml xml-nil

2
推荐指数
1
解决办法
2万
查看次数

如何使用开放XML SDK在Word中创建水平规则?

如何使用开放XML SDK在Word中创建水平规则?

使用C#4.5打开XML SDK 2.0

我正在寻找某种paragraph.append(new HorizontalRule())命令,但似乎找不到任何东西.

c# ms-word openxml

2
推荐指数
1
解决办法
2352
查看次数

通过OpenXML SDK获取一张excel的表(工作部分)

我在一张excel文件中有3个表,我使用OpenXML SDK来读取Excel文件,如下所示:

SpreadSheetDocument document = SpreadSheetDDocument.open(/*read it*/);
foreach(Sheet sheet in document.WorkbookPart.Workbook.Sheets)
{
   //I need each table or work part of sheet here
}
Run Code Online (Sandbox Code Playgroud)

所以当你看到我可以获得每张Excel时,但是如何在每张表中获得工作部分,比如我可以在这些表上迭代的3个表,是否有人知道这一点?有什么建议吗?

c# excel openxml openxml-sdk c#-4.0

2
推荐指数
1
解决办法
4219
查看次数

创建新的空Word文档

我正在尝试使用OpenXML SDK 2.5创建一个空的Word文档(DOCX).以下代码对我不起作用,因为MainDocumentPart为null.

    public static void CreateEmptyDocxFile(string fileName, bool overrideExistingFile)
    {
        if (System.IO.File.Exists(fileName))
        {
            if (!overrideExistingFile)
                return;
            else
                System.IO.File.Delete(fileName);
        }

        using (WordprocessingDocument document = WordprocessingDocument.Create(fileName, WordprocessingDocumentType.Document))
        {
            const string docXml =
         @"<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes""?> 
            <w:document xmlns:w=""http://schemas.openxmlformats.org/wordprocessingml/2006/main"">
                <w:body>
                    <w:p>
                        <w:r>
                            <w:t></w:t>
                        </w:r>
                    </w:p>
                </w:body>
            </w:document>";

            using (Stream stream = document.MainDocumentPart.GetStream())
            {
                byte[] buf = (new UTF8Encoding()).GetBytes(docXml);
                stream.Write(buf, 0, buf.Length);
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

c# openxml openxml-sdk

2
推荐指数
1
解决办法
4351
查看次数

打开xml无法获取绘图元素

我正在浏览docx,使用open xml来查找一些图像.

所以,我这样做是为了得到所有的图纸,它有一个docProperties作为孩子,标题包含

List<Drawing> sdtElementDrawing = wordDoc.MainDocumentPart.Document.Descendants<Drawing>()
                                              .Where(element =>
                                                  element.GetFirstChild<Drawing>() != null
                                                  && element.GetFirstChild<DocProperties>().Title.Value.Contains("IMAGE")).ToList();
Run Code Online (Sandbox Code Playgroud)

而docx作为xml看起来在第一部分看起来很喜欢(它通常更大,但我只复制相关部分):

<w:drawing>
      <wp:anchor distT="0" distB="0" distL="114300" distR="114300" simplePos="0" relativeHeight="251658240" behindDoc="1" locked="0" layoutInCell="1" allowOverlap="1" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing">
        <wp:simplePos x="0" y="0" />
        <wp:positionH relativeFrom="column">
          <wp:posOffset>2171700</wp:posOffset>
        </wp:positionH>
        <wp:positionV relativeFrom="paragraph">
          <wp:posOffset>-1168400</wp:posOffset>
        </wp:positionV>
        <wp:extent cx="2286000" cy="746760" />
        <wp:effectExtent l="0" t="0" r="0" b="0" />
        <wp:wrapNone />
        <wp:docPr id="1" name="Image 1" descr="C:\Users\Pictures\IMAGERM.jpg" title="IMAGERM" />     
 </wp:anchor>
    </w:drawing>
Run Code Online (Sandbox Code Playgroud)

但我没有找到sdtElementDrawing.

所以我想我错误地写了这个sdtElementDrawing查询.我必须错过一个明显的方式来告诉"得到绘图的孩子,哪里有一个像IMAGE这样的标题的DocProperties",但我找不到它.

我也试过这个,但效果不好:

                        List<Drawing> sdtElementDrawing = wordDoc.MainDocumentPart.Document.Descendants<Drawing>()
                                      .Where(element =>
                                          element.GetFirstChild<Drawing>() != null && 
                                          element.GetFirstChild<Drawing>().Anchor.GetFirstChild<DocProperties>().Title.Value.Contains("IMAGE")).ToList();
Run Code Online (Sandbox Code Playgroud)

c# openxml

2
推荐指数
1
解决办法
1008
查看次数

通过MS SQL中的openxml存储过程在表中逐行插入数据

我试图插入数据VIA XML格式.同样的XML格式定义如下&我想在SQL表中逐行插入字段.但是,没有地址插入SQL表,只有客户信息插入虚拟表.

<XML>
    <Customer>
    <NAME>YOGESH</NAME>
    <CONTACT>YOGESH SHARMA</CONTACT>
    <Mobile>123456789</Mobile>
    <Status>A</Status>
    <MALE>1</MALE>
    <Add>
       <ADD1>
             <Address>AHMEDABAD</Address>
             <State>GUJARAT</State>
             <City>AHMEDABAD</City>
             <Pincode>380016</Pincode>
      </ADD1>
      <ADD2>
             <Address>RAJKOT</Address>
             <State>GUJARAT</State>
             <City>RAJKOT</City>
             <Pincode>360001</Pincode>
     </ADD2>
    </Add>
    </Customer>
</XML>
Run Code Online (Sandbox Code Playgroud)

我的SP如下:

ALTER PROCEDURE [dbo].[OPENXMLDUMMY]

 @xmlCustomer NTEXT

AS
 BEGIN
     DECLARE @DOC INT;
     EXEC sp_xml_preparedocument
          @DOC OUTPUT,
          @xmlCustomer;
     INSERT INTO Dummy
     (Name,
      Contact,
      Mobile,
      Status,
      Male,
      InsertDate
     )
            SELECT XML.NAME,
                   XML.Contact,
                   XML.Mobile,
                   XML.Status,
                   XML.Male,
                   GETDATE()
            FROM OPENXML(@DOC, '/XML/Customer', 2) WITH(Name VARCHAR(50), 
 Contact VARCHAR(75), Mobile BIGINT, Status VARCHAR(10), Male VARCHAR(10), 
 InsertDate DATETIME) XML;

    INSERT INTO DummyExtd
    ( …
Run Code Online (Sandbox Code Playgroud)

sql-server stored-procedures openxml

2
推荐指数
1
解决办法
498
查看次数