我正在尝试以下代码。它需要一个fileName(带有许多部分的docx文件),我尝试迭代每个部分获取部分名称。问题是我最终得到了不可读的docx文件。它没有错误,但我认为我在获取该部分中的元素时做错了。
public void Split(string fileName) {
using (WordprocessingDocument myDoc =
WordprocessingDocument.Open(fileName, true)) {
string curCliCode = "";
MainDocumentPart mdp = myDoc.MainDocumentPart;
foreach (var element in mdp.Document.Body.ChildElements) {
if (element.Descendants().OfType<SectionProperties>().Count() == 1) {
//get the name of the section from the footer
var footer = (FooterPart) mdp.GetPartById(
element.Descendants().OfType<SectionProperties>().First().OfType
<FooterReference>().First().
Id.Value);
foreach (Paragraph p in footer.Footer.ChildElements.OfType<Paragraph>()) {
if (p.InnerText != "") {
curCliCode = p.InnerText;
}
}
if (curCliCode != "") {
var forFile = new List<OpenXmlElement>();
var els = element.ElementsBefore();
if (els != null) {
foreach (var e in els) {
if (e != null) {
forFile.Add(e);
}
}
for (int i = 0; i < els.Count(); i++) {
els.ElementAt(i).Remove();
}
}
Create(curCliCode, forFile);
}
}
}
}
}
private void Create(string cliCode,IEnumerable<OpenXmlElement> docParts) {
var parts = from e in docParts select e.Clone();
const string template = @"\Test\toSplit\blank.docx";
string destination = string.Format(@"\Test\{0}.docx", cliCode);
File.Copy(template, destination,true);
/* Create the package and main document part */
using (WordprocessingDocument myDoc =
WordprocessingDocument.Open(destination, true)) {
MainDocumentPart mainPart = myDoc.MainDocumentPart;
/* Create the contents */
foreach(var part in parts) {
mainPart.Document.Body.Append((OpenXmlElement)part);
}
/* Save the results and close */
mainPart.Document.Save();
myDoc.Close();
}
}
有谁知道问题可能是什么(或如何正确地将一个部分从一个文件复制到另一个文件)?
答案 0 :(得分:1)
我已经在这方面做了一些工作,而我发现的宝贵之处在于使用预期文件来区分已知的好文件;错误通常很明显。
我要做的是拿一个你知道可行的文件,然后将所有部分复制到模板中。从理论上讲,这两个文件应该是相同的。在docx文件中的document.xml上运行diff,你会看到差异。
顺便说一句,我假设您知道docx实际上是一个zip;将扩展名更改为“zip”,您将能够获得构成格式的实际xml文件。就diff工具而言,我使用Scooter Software的Beyond Compare。
答案 1 :(得分:1)
按照您正在进行的操作的方法仅适用于简单文档(即不包含图像,超链接,注释等的文档)。要处理这些更复杂的文档,请查看http://blogs.msdn.com/b/ericwhite/archive/2009/02/05/move-insert-delete-paragraphs-in-word-processing-documents-using-the-open-xml-sdk.aspx以及生成的DocumentBuilder API(CodePlex上PowerTools for Open XML项目的一部分)。
为了使用DocumentBuilder将docx拆分为多个部分,您仍然需要首先找到包含sectPr元素的段落的索引。