2012-08-24 61 views
0

我正在为一个客户端的DocumentML处理工作,我对OpenXML是全新的。我已经阅读并听取了Erik White的博客,OpenXML看起来非常强大。我遇到的问题是由OpenXML Productivity工具生成的代码中有21121行。我添加了一个类,并在其中粘贴了这段代码,现在任何时候我的解决方案都会尝试进入该类,但如果我尝试在IDE中打开该类,则VS会冻结。我之前从未遇到过这个问题,因为我的机器有8 GB的Ram和4核心处理器。OpenXML生成的代码冻结Visual Studio

有没有人有过这个问题?是否有需要为OpenXML完成的设置或某些事情?我正在运行VS 2010旗舰版SP1,并进行了完整安装。任何帮助将不胜感激。

感谢

编辑1

我试图访问一个复选框,我有我的方式。当我看到派生的XML,我看到

<w:sdtPr xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"> 
<w:rPr> 
    <w:rFonts w:asciiTheme="minorHAnsi" w:hAnsiTheme="minorHAnsi" w:cstheme="minorHAnsi" /> 
    <w:sz w:val="20" /> 
    <w:szCs w:val="20" /> 
</w:rPr> 
<w:id w:val="-210274200" /> 
<w14:checkbox xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml"> 
    <w14:checked w14:val="0" /> 
    <w14:checkedState w14:val="2612" w14:font="MS Gothic" /> 
    <w14:uncheckedState w14:val="2610" w14:font="MS Gothic" /> 
</w14:checkbox> 
</w:sdtPr> 

我想检查节点是否包含复选框,所以我这样做。

private static XNamespace w14 = 
     "http://schemas.microsoft.com/office/word/2010/wordml>"; 

if (element.Elements(w + "sdtPr") 
         .Elements(w14 + "checkbox").Count() > 0) 
       { }  

但是代码永远不会落入该条件。有什么我在这里失踪? 感谢您的帮助 编辑完1

+0

它看起来像一个大文件:)。为什么你需要使用生产力工具生成的整个代码?如果你想创建一个具有部分动态数据的文档,我建议创建一个带有一些内容控件的模板文档,并且只需填写你想要动态插入数据的地方。我在这里写了它:http://stackoverflow.com/questions/7891781/how-to-build-custom-sentences-with-openxml/7905155#7905155。如果它适用于您的情况,并且您需要帮助,请告诉我。 –

+0

@LukaszM感谢提供的帮助,我将它们作为所有内容控件,但在用自定义对象中的数据替换数据时遇到问题。如果您有时间,我将非常感谢您的帮助。 –

+0

因此,请编辑您的问题并提供一些详细信息,以替换内容控件以及要插入的数据类型。 –

回答

0

我们最初通过拷贝的生产力工具生成的代码,并使用它作为一个文件也做了同样的做法。这导致VS一直崩溃,测试和更新非常繁琐,因为每次更改都需要完整重新生成代码。这促使我们使用模板,这为我们节省了大量时间,并且非常容易加载到内存中,然后使用Open XML SDK进行操作:

byte[] byteArray = File.ReadAllBytes("C:\\temp\\test.docx"); 
using (MemoryStream stream = new MemoryStream()) 
{ 
    stream.Write(byteArray, 0, (int)byteArray.Length); 
    using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(stream, true)) 
    { 
     // Do work here 
    } 
    File.WriteAllBytes("C:\\temp\\test.docx", stream.ToArray()); 
}