标签: openxml

替换打开的 xml 元素中的内部文本?

我正在使用 open xml SDK 2.0,对此我很陌生。

我实际上在我的 word 2007 文档中创建了一个名为“hello.docx”的快速部分(包含内容控件)。现在我需要将快速部分复制到名为“hello.docx”的同一文档的其他位置。我非常感谢这篇文章http://www.techques.com/question/1-3448297/Replacing-Content-Controls-in-OpenXML,同样的事情也发布在堆栈溢出论坛上,我非常感谢: )...这篇文章只是删除了内容控件,但保留了内容控件中的内容。

在上面的链接的帮助下,我能够修改代码以克隆内容控件并附加到同一文档(我的代码的这一部分正在工作)。但我的内部文本有问题。虽然我替换了打开的 Xml 元素中的innerText,但它没有反映在文档中。

public static void AddingSdtBlock(string filename, string sdtBlockTag)
{
    using (WordprocessingDocument doc = WordprocessingDocument.Open(filename,true))
    {
        MainDocumentPart mainDocumentPart = doc.MainDocumentPart;
        List<SdtBlock> sdtList = mainDocumentPart.Document.Descendants<SdtBlock>().ToList();
        SdtBlock sdtA = null;

        foreach (SdtBlock sdt in sdtList)
        {
            if (sdt.SdtProperties.GetFirstChild<Tag>().Val.Value == sdtBlockTag)
            {
                sdtA = sdt;
                break;
            }
        }
        SdtBlock cloneSdkt = (SdtBlock)sdtA.Clone();



        OpenXmlElement sdtc = cloneSdkt.GetFirstChild<SdtContentBlock>();
      //  OpenXmlElement parent = cloneSdkt.Parent;

        OpenXmlElementList elements = cloneSdkt.ChildElements;

       // var mySdtc = new …
Run Code Online (Sandbox Code Playgroud)

controls openxml innertext openxml-sdk

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

创建 ImagePart 并不将关系保存在 OpenXML 中

--更新以提供完整的工人阶级示例,以及 2 个示例文档--

www.sklinar.co.uk/wp-content/uploads/mydoc.docx - 原始文档,带有 INCLUDETEXT 指令以合并到 Footer.Docx 中

www.sklinar.co.uk/wp-content/uploads/footer.docx

我已将 a 添加ImagePart到我的文档中,并使用FeedData()它来提供流内容。

但我能在我的文档中看到的只是一个红色框。

我的初始代码创建 aRun并将 aDrawing作为它的子项:

--对于这个例子,我使用了硬编码的 FileStream 来清除可疑的图像--

为了使其正常工作,我每次都使用相同的页脚,并且当前使用正确的页脚进行硬编码:

runToAmend.InsertAfterSelf(CreateImageRun(sourceDocument,run,target.MainDocumentPart.FooterParts.ElementAt(2)));

runToAmend从当前文档中的运行中获取的 - 它包含一个字段,然后将其删除,并将图片(以及从另一个文档中获取的其他文本)放置在其位置。

    public Run CreateImageRun(WordprocessingDocument sourceDoc,  Run sourceRunFromOriginalDocument, FooterPart footerPart)
    {
        ImageData shape = sourceRun.Descendants<ImageData>().FirstOrDefault();

        ImagePart p = sourceDoc.MainDocumentPart.GetPartById(shape.RelationshipId) as ImagePart;

        ImagePart newPart = footerPart.AddImagePart(ImagePartType.Jpeg);

        using (Stream stream = new FileStream(@"C:\Users\SAS\Desktop\IMG_20130803_104521.jpg",FileMode.Open,FileAccess.Read))
        {
            stream.Position = 0;
            newPart.FeedData(stream);
        }

        string partId = footerPart.GetIdOfPart(newPart);

        Drawing newImage = CreateImage(partId);
        return …
Run Code Online (Sandbox Code Playgroud)

c# ms-office openxml wordml openxml-sdk

5
推荐指数
1
解决办法
5854
查看次数

OpenXML 在写入元素时挂起

我有一个程序,它基本上从数据库中提取数据,将其缓存到文件中,然后将该数据导出为多种格式(Excel、Excel 2003、CSV)。我正在使用 OpenXML SDK 2.0 来完成 Excel 工作。这些导出过程并行运行(使用Parallel.ForEach),并且数据量可能非常大 - 例如,某些 CSV 为 800MB。在这些较大的导出过程中,我注意到 XML 文档的写入将会挂起。例如,如果我有 8 个并行导出,那么在某些时候它们都会“暂停”。它们都围绕着同一个点:

//this.Writer is an OpenXmlWriter which was created from a WorksheetPart.
this.Writer.WriteElement(new Cell()
{
    CellValue = new CellValue(value),
    DataType = CellValues.String
});
Run Code Online (Sandbox Code Playgroud)

发生这种情况时,我暂停调试器(在本例中为 VS2013),并注意到所有线程都在同一部分代码周围阻塞 - 有些在 OpenXML SDK 中更深一些 - 但它们都源于对OpenXmlWriter.WriteElement.

我使用 JustDecompile 挖掘了源代码,但没有找到任何答案。似乎有一个正在使用的中间流正在写入隔离存储,并且由于某种原因,这是阻塞的。其中每个的底层流都是一个FileStream.

下面的屏幕截图显示了方法中或方法内部阻塞的所有(本例中为 8 个)并行任务OpenXmlWriter.WriteElement

洪!

这些挂起线程之一的完整堆栈- 带注释。

WindowsBase.dll!MS.Internal.IO.Packaging.PackagingUtilities.CreateUserScopedIsolatedStorageFileStreamWithRandomName Normal
WindowsBase.dll!MS.Internal.IO.Packaging.PackagingUtilities.CreateUserScopedIsolatedStorageFileStreamWithRandomName(int retryCount, out string fileName)     
WindowsBase.dll!MS.Internal.IO.Packaging.SparseMemoryStream.EnsureIsolatedStoreStream()  

//---> Why are we writing to isolated storage …
Run Code Online (Sandbox Code Playgroud)

c# stream .net-4.0 openxml

5
推荐指数
1
解决办法
1831
查看次数

如何定义数据类型?

我必须创建一个大的 XLSX 文件。我使用 OpenXmlWriter 尽可能快地完成任务。该文件已正确创建,但我无法更改该字段的数据类型。它始终是标准类型,我想对其中一些使用数字格式。

我尝试了很多方法,但没有一个成功(Cell DataType,带有属性,...)。

这是一个例子:

SpreadsheetDocument fichier_excel = SpreadsheetDocument.Create(chemin + NomFichier, SpreadsheetDocumentType.Workbook);

fichier_excel.AddWorkbookPart();
WorksheetPart wsp = fichier_excel.WorkbookPart.AddNewPart<WorksheetPart>();

OpenXmlWriter writer = OpenXmlWriter.Create(wsp);
writer.WriteStartElement(new Worksheet());
writer.WriteStartElement(new SheetData());

oxa = new List<OpenXmlAttribute>();
oxa.Add(new OpenXmlAttribute("r", null, "1"));
writer.WriteStartElement(new Row(), oxa);

oxa = new List<OpenXmlAttribute>();
oxa.Add(new OpenXmlAttribute("t", null, "str"));
writer.WriteStartElement(new Cell(), oxa);
writer.WriteElement(new CellValue("10001"));
writer.WriteEndElement();

writer.WriteEndElement();

writer.WriteEndElement();

writer.Close();

writer = OpenXmlWriter.Create(fichier_excel.WorkbookPart);
writer.WriteStartElement(new Workbook());
writer.WriteStartElement(new Sheets());

writer.WriteElement(new Sheet()
{
    Name = "Inventaire",
    SheetId = 1,
    Id = fichier_excel.WorkbookPart.GetIdOfPart(wsp)
});

writer.WriteEndElement();

writer.WriteEndElement();
writer.Close();
writer.Dispose(); …
Run Code Online (Sandbox Code Playgroud)

.net c# openxml openxml-sdk

5
推荐指数
1
解决办法
3146
查看次数

尽管 worksheet.xml 和 styles.xml 中没有存储关于小数精度的信息,但 Excel 如何正确显示小数值?

以下是我正在执行的检查行为的步骤:

1# 创建一个 Excel(xlsx) 文件,将 1234.56789 放在一个单元格中,保存它。
2#解压.xlsx文件,查看sheet1.xml和styles.xml文件。

在 xl/worksheets/Sheet1.xml 中,您将看到以下内容:

<sheetData><row r="1" spans="1:1" x14ac:dyDescent="0.25"><c r="A1" s="1"
<v>25778.567889999998</v>
</c></row></sheetData>
Run Code Online (Sandbox Code Playgroud)

Styles.xml 中没有关于原始数字精度的信息,即1234.56789.

当我们在 MS Excel 中打开 Excel 时,它如何显示原始值?
尽管提取的文件中没有信息,它如何重建原始数字?

请注意,我没有更改单元格格式类型或任何内容,因此单元格格式为 General。

我知道因为 Excel 将数字存储为浮点数,所以它无法将值保存到完美的精度,我无法理解的是当我在 MS Excel 中打开它时它如何保留原始值。我正面临一个关于使用 OpenXML SDK 读取 Excel 文件的问题,但在询问该问题之前,我正在寻找这个更基本问题的答案。

excel openxml openxml-sdk

5
推荐指数
1
解决办法
1892
查看次数

OpenXML - 获取图像替代文本标题

我正在尝试使用 OpenXML 遍历 PowerPoint 演示文稿中的图像。

我已经想出了如何做到这一点。

我现在正在尝试获取图像替代文本标题....

这是我的代码:

List<ImagePart> imageParts = new List<ImagePart>();

part.GetPartsOfType<ImagePart>(imageParts);

foreach (ImagePart imagePart in imageParts)
{
    if (imagePart != null)
    {

    // Get the Relationship Id
    string oldRelID = part.GetIdOfPart(imagePart);

    // Get the Alt-Text Tile relating to this image

    }
}
Run Code Online (Sandbox Code Playgroud)

有没有 OpenXML 专家可以给我一些指点?

谢谢

更新:

我尝试遍历 XML,但是当幻灯片上有多个图像时,我得到的相关图像的标题值不正确。

我想我需要能够使用 ImagePart Id 然后找到相应的标题

下面的代码使标题乱七八糟......

foreach (ImagePart imagePart in imageParts)
{
    string mapReference = "";

    XmlNode thisNode = pictureNodeList[imageCounter];

    foreach (XmlNode xmlnode in thisNode)
    {
        foreach (XmlNode xmlchildnode …
Run Code Online (Sandbox Code Playgroud)

c# openxml openxml-sdk

5
推荐指数
1
解决办法
1590
查看次数

打开 XML Excel。创建文件后无法打开打印对话框。文件已冻结行

我希望有人遇到过这个问题并有解决方案。

我能够利用该DocumentFormat.OpenXml.dll库成功创建一个 Excel 文件。

问题是,如果我的代码冻结了前 x 行,稍后当我在 Excel 中打开文档并尝试使用“打印”对话框时,我会看到其中一个“Microsoft Excel 已停止工作”对话框。

如果我解冻行,保存文件并重新打开它,打印对话框工作正常。我什至可以手动冻结行,保存文件并在 Excel 中打开它;打印对话框工作正常。

我什至在 OpenXML Productivity 工具中打开了这两个文件,两者的代码看起来都一样。

所以我正在做的事情一定有其他问题。

如果有帮助,这里是做所有事情的功能。样式表和数据表在其他地方填充:

public void CreateSpreadsheetWorkbook ( string filepath, List<string []> dataList, List<string> excelHeader )
{
    SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Create ( filepath, SpreadsheetDocumentType.Workbook );    // Create a spreadsheet document by supplying the filepath.By default, AutoSave = true, Editable = true, and Type = xlsx.

    WorkbookPart            workbookpart        = spreadsheetDocument.AddWorkbookPart ();                                        // Add a WorkbookPart to the document.
    workbookpart.Workbook = new Workbook (); …
Run Code Online (Sandbox Code Playgroud)

c# openxml

5
推荐指数
1
解决办法
610
查看次数

将 Excel XML 电子表格转换为 xlsx

我有一个 XML-Excel 文件(SpreadsheetML 格式):

<?xml version="1.0" encoding="utf-8"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
 xmlns:o="urn:schemas-microsoft-com:office:office"
 xmlns:x="urn:schemas-    microsoft-com:office:excel"
 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">
 <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
 <Company>My Company</Company>
 </DocumentProperties>
 <Styles>
 <Style ss:ID="Default" ss:Name="Normal">
 <Alignment ss:Vertical="Bottom"/>
 <Borders/>
 <Font/>
 <Interior/>
 <NumberFormat/>
 <Protection/>
 </Style>
 <Style ss:ID="stTxt">
<Font ss:FontName="Arial" ss:Size="8"/>
<Alignment ss:Horizontal="Left"/>
<NumberFormat ss:Format="@"/>
 </Style>
<Style ss:ID="stTopHeadline">
<Font ss:FontName="Arial" ss:Size="8" />
<Alignment ss:Horizontal="Left"/>
<NumberFormat ss:Format="@"/>
 </Style>
...
Run Code Online (Sandbox Code Playgroud)

现在我需要使用 C# 将这些文件转换为 XLSX 文件。有没有办法使用 Open Xml 或其他库将其转换为 Excel 2010 XLSX 格式?

c# xml excel openxml spreadsheetml

5
推荐指数
1
解决办法
3031
查看次数

我们如何在 XSLT 中将 Microsoft Word DOCX 文件转换为 HTML?

我有一个关于将 Word DOCX XML (OOXML) 文件转换为 HTML 格式的项目。

我使用 XML Spy 和 XSLT、XPath、XML 进行此转换。

想象一下我用 XSLT 编写程序并转换它的单个 Word 文件。但是我的主管说,如果我更改文件中的值,该方法将不起作用。

我同意这一点,因为我只为该文档指定了代码,因为我知道其中包含的内容。

但是,我们如何在 XSLT 中编写通用代码来将所有 Word 文件转换为格式良好的 HTML 文档(因为 Word 文档可能彼此有很大不同)?

问题是我想用 XSLT 来做吗?这里有什么不对吗?或者我只是对此太混乱了。

xml xslt xpath docx openxml

5
推荐指数
1
解决办法
3612
查看次数

使用 OpenXML 按工作表名称读取 excel

我是 OpenXML c# 的新手,我想从 excel 文件中读取行。但我需要按名称阅读excel表。这是我读取第一张纸的示例代码:

 using (var spreadSheet = SpreadsheetDocument.Open(path, true))
                {
                    WorkbookPart workbookPart = spreadSheet.WorkbookPart;
                    WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();
                    SheetData sheetData = worksheetPart.Worksheet.Elements<SheetData>().First();

                    foreach (Row r in sheetData.Elements<Row>())
                    {
                        foreach (Cell c in r.Elements<Cell>())
                        {
                            if (c.DataType != null && c.DataType == CellValues.SharedString)
                            {
                               // reading cells
                            }
                        }
                    }
Run Code Online (Sandbox Code Playgroud)

但是我如何通过工作表名称找到并读取单元格。

c# excel openxml openxml-sdk

5
推荐指数
1
解决办法
3671
查看次数

标签 统计

openxml ×10

c# ×7

openxml-sdk ×6

excel ×3

xml ×2

.net ×1

.net-4.0 ×1

controls ×1

docx ×1

innertext ×1

ms-office ×1

spreadsheetml ×1

stream ×1

wordml ×1

xpath ×1

xslt ×1