asp.net C# で単語の差し込み印刷を作成しました。MergeField をデータテーブルのデータに置き換える必要があります。問題は、最初のページだけが正しく表示され、他のページが追加されますが、必要なデータがないことです。データ可能な行の最後まで繰り返し、行ごとに単語ドキュメントを生成し、これらすべてのドキュメントを1つの単語ファイルに入れ、それを開きたいと思います。コード全体を添付しました。
using Word = Microsoft.Office.Interop.Word;
public void GenerateDoc(DataTable dt)
{
string schoolName = "Name 1";
string schoolAddress = "Address 1";
//OBJECT OF MISSING "NULL VALUE"
Object oMissing = System.Reflection.Missing.Value;
//OBJECTS OF FALSE AND TRUE
Object oTrue = true;
Object oFalse = false;
//CREATING OBJECTS OF WORD AND DOCUMENT
Word.Application oWord = new Word.Application();
Word.Document oWordDoc = new Word.Document();
//THE LOCATION OF THE TEMPLATE FILE ON THE MACHINE
string filePath = Path.Combine(HostingEnvironment.ApplicationPhysicalPath, @"App_Data\envelope3.dotx");
Object oTemplatePath = filePath;
//ADDING A NEW DOCUMENT FROM A TEMPLATE
oWordDoc = oWord.Documents.Add(ref oTemplatePath, ref oMissing, ref oMissing, ref oMissing);
for (int i = 0; i < dt.Rows.Count; i++)
{
string studentName = dt.Rows[i]["StudentName"].ToString();
string studentID = dt.Rows[i]["StudentID"].ToString();
string guard = dt.Rows[i]["GuardName"].ToString();
string phone = dt.Rows[i]["Phone"].ToString();
string address = dt.Rows[i]["Address"].ToString();
string className = dt.Rows[i]["ClassName"].ToString();
foreach (Word.Field myMergeField in oWordDoc.Fields)
{
int iTotalFields = 0;
iTotalFields++;
Word.Range rngFieldCode = myMergeField.Code;
String fieldText = rngFieldCode.Text;
// ONLY GETTING THE MAILMERGE FIELDS
if (fieldText.StartsWith(" MERGEFIELD"))
{
// THE TEXT COMES IN THE FORMAT OF
// MERGEFIELD MyFieldName \\* MERGEFORMAT
// THIS HAS TO BE EDITED TO GET ONLY THE FIELDNAME "MyFieldName"
//Int32 endMerge = fieldText.IndexOf("\\");
//Int32 fieldNameLength = fieldText.Length - endMerge;
String fieldName = fieldText;//.Substring(11, endMerge - 11);
// GIVES THE FIELDNAMES AS THE USER HAD ENTERED IN .dotx FILE
fieldName = fieldName.Trim();
// **** FIELD REPLACEMENT IMPLEMENTATION GOES HERE ****//
// THE PROGRAMMER CAN HAVE HIS OWN IMPLEMENTATIONS HERE
if (fieldName.Contains("SchoolName"))
{
myMergeField.Select();
oWord.Selection.TypeText(schoolName);
}
else if (fieldName.Contains("SchoolAddr"))
{
myMergeField.Select();
oWord.Selection.TypeText(schoolAddress);
}
else if (fieldName.Contains("StudentName"))
{
myMergeField.Select();
oWord.Selection.TypeText(studentName);
}
else if (fieldName.Contains("StudentID"))
{
myMergeField.Select();
oWord.Selection.TypeText(studentID);
}
else if (fieldName.Contains("GuardName"))
{
myMergeField.Select();
oWord.Selection.TypeText(guard);
}
else if (fieldName.Contains("Phone"))
{
myMergeField.Select();
oWord.Selection.TypeText(phone);
}
else if (fieldName.Contains("Address"))
{
myMergeField.Select();
oWord.Selection.TypeText(address);
}
else if (fieldName.Contains("ClassName"))
{
myMergeField.Select();
oWord.Selection.TypeText(className);
}
}
}
//Add to oWord to the final Word Document here
Word.Selection sel = oWord.Selection;
sel.InsertNewPage();
}
//SETTING THE VISIBILITY TO TRUE
oWord.Visible = true;
}
私が最初にしたことは、すべての反復で oWord.Visible = true を呼び出していたことです。それは正しいが、私にとってはまったく楽しいものではありませんでした。新しいページを oWord に追加して、これらすべてを 1 つのドキュメントにまとめたいと考えています。ただし、これらの新しいページには、置き換える必要があるマージフィールドが含まれていません。あちこち検索しましたが、これまでのところ結果はありません。Microsoft.Office.Interop を引き続き使用したい