0

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 を引き続き使用したい

4

0 に答える 0