私は.docx
にMailMergeが含まれているので、コード(C#)でソースを変更する必要があります。ライブラリとして私はOpenXml
を使用しています。 docxをzipファイルとして開き、パスを検索すると、データソースのリンクがword/settings.xml
とword/_rels/settings.xml.rels
という2つの異なる場所に格納されていることがわかりました。OpenMmlでMailMergeを編集する
var template = new MemoryStream(myDocxInByteArray);
using (var doc = DocumentFormat.OpenXml.Packaging.WordprocessingDocument.Open(template, true))
{
var s = doc.MainDocumentPart.DocumentSettingsPart.Settings;
foreach (var els in s.ChildElements)
{
if (els is DocumentFormat.OpenXml.Wordprocessing.MailMerge)
{
var mm = (DocumentFormat.OpenXml.Wordprocessing.MailMerge)els;
mm.Query.Val = "SELECT * FROM " + myNewPath;
break;
}
}
}
これは正常に動作し、ファイルが開かれたときしかし言葉は、それがword/_rels/settings.xml.rels
で定義されているので、新しいパスからだけでなく、古いものからファイルをロードするように求められます:・ファーストを置き換えるために
。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/mailMergeSource" Target="oldPath" TargetMode="External"/>
</Relationships>
どのように私はWordprocessingDocument
でこのオブジェクト(Relation
)を見つけることができますか?それを見つけることができません... またはそれを変更する別の方法はありますか?
EDIT:
私は別のソースを持つ2つの異なる空のファイルを作成し、それらを比較するために、生産性向上ツールのOpenXmlで開かれました。私がすでに見たように、違いはword/settings.xml
とword/_rels/settings.xml.rels
です。
てみてください古い関係を取得する
一つの方法は、以下のように(そのままで、これは、LINQのを必要とする)でありますWordで文書を開き、データソースを変更して別の名前で保存します。 Open XML SDK生産性ツールの「比較」機能を使用して、1つのドキュメントを別のドキュメントに変更するために生成するコードを確認します。 FWIWの場合は、新しいRelation ID(Relsファイルに格納される)を作成し、それを使ってrId1を置き換えて削除する必要があります。これは、通常、この種のことがOpen XML SDKでどのように機能するかです。 –
しかし、古い関係を削除するにはどうすればよいですか? OpenXmlで開くことができません。 – Emaborsa