簡體   English   中英

Word Interop C#:使用現有頁面插入新頁面

[英]Word Interop C#: Insert new page using existing page

我有一個包含模板的Word模板文件,它有11行3列。 因此,首頁上的表格中有33個單元格。 我用一些數據填充了這些單元格,但是,如果記錄數大於33(例如66),則我將創建兩個文件,每個文件包含33條記錄。 我想創建一個包含所有66條記錄的文件,並且一個文件中應該有兩個頁面,而不是兩個單獨的文件。 我該怎么辦?

以下是我用來創建一個doc文件的代碼。

private static string FillTemplate(List<ClientListItem> clients, string fileName)
    {
        //Filled document file name
        var savedFileName = string.Empty;
        //Search template file in current directory
        var templateFilePath = System.AppDomain.CurrentDomain.BaseDirectory + "templateFile.doc";

        #region Generate file for labels

        object missing = System.Type.Missing;
        // Create Word application
        WORD._Application app = new WORD.Application();

        try
        {
            Print("Creating label document.");
            // Create new file
            WORD._Document doc = app.Documents.Open(templateFilePath);

            //Print("Creating app selection object");
            WORD.Selection selection = app.Selection;

            //If the template file contains tables
            if (selection.Tables.Count > 0)
            {
                //Use first table
                //Table's are accessed with starting index as 1 not 0
                var tableToUse = selection.Tables[1];

                //Counter for number of parent caregivers inserted
                var counter = 0;
                //Number of parent caregivers
                var numberOfParentCaregivers = clients.Count;
                //Loop on each row
                //Rows are accessed with starting index as 1 not 0
                for (int rowIndex = 1; rowIndex <= tableToUse.Rows.Count; rowIndex++)
                {
                    //Loop on each column
                    //Columns are accessed with starting index as 1 not 0
                    for (int columnIndex = 1; columnIndex <= tableToUse.Columns.Count; columnIndex++)
                    {
                        //If counter has reached to its limit
                        if (counter + 1 > numberOfParentCaregivers)
                        {
                            //Stop
                            break;
                        }

                        //If current column index is even
                        if (columnIndex % 2 == 0)
                        {
                            //Do not process it
                            //Why? Check template file for yourself
                            continue;
                        }

                        //Get parent caregiver to set
                        var parentCaregiver = clients[counter];

                        Print("Generating label to add to document.");

                        //Get label to add to document
                        var labelToAdd = string.Format("{0} {1},{6}{2},{6} {3}, {4} {5}", parentCaregiver.Parent1LastName, parentCaregiver.Parent1FirstName,
                            parentCaregiver.Parent1StreetAddress, parentCaregiver.Parent1City, parentCaregiver.Parent1State, parentCaregiver.Parent1Zip, Environment.NewLine);

                        //Print(string.Format("Adding label {0} at {1}, {2} position.", labelToAdd, rowIndex, columnIndex));

                        //Get cell to set value
                        var tableCell = tableToUse.Cell(rowIndex, columnIndex);
                        //Set text in cell
                        tableCell.Range.Text = labelToAdd;
                        //Middle align text
                        tableCell.Range.ParagraphFormat.Alignment = WORD.WdParagraphAlignment.wdAlignParagraphCenter;

                        Print(string.Format("Label added {0} at {1}, {2} position.", labelToAdd, rowIndex, columnIndex));
                        counter++;
                    }

                    //If counter has reched to its limit
                    //i.e. no parent caregivers to process - all processed
                    if (counter + 1 > numberOfParentCaregivers)
                    {
                        //stop
                        break;
                    }
                }
            }

            // Set file name to save
            savedFileName = string.Format(@"{0}{1}{2}", Path.GetTempPath(), fileName, Path.GetExtension(templateFilePath));
            object fname = savedFileName;
            Print(string.Format("Saving new document at {0}", savedFileName));
            // SaveAs new file
            doc.SaveAs(ref fname, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);
            Print(string.Format("{0} saved successfully.", savedFileName));
            app.Documents.Close(ref missing, ref missing, ref missing);
        }
        catch (Exception exc)
        {
            Print("Exception while generating label document");
            Print(exc.ToString());
            //Set file Name to empty string
            savedFileName = string.Empty;
        }
        finally
        {
            // Close Word application
            app.Quit(ref missing, ref missing, ref missing);
            Marshal.ReleaseComObject(app);
            app = null;
            GC.Collect();
            GC.WaitForPendingFinalizers();
            GC.Collect();
            GC.WaitForPendingFinalizers();
        }

        //Return saved file name
        return savedFileName;

    }

請提出更改建議,以便我可以根據要添加到模板文件中的記錄數創建任意數量的頁面。

謝謝,尼克希爾。

我更改了代碼,以遍歷要插入表的所有項目,而不是遍歷表的單元格。 在此循環內,將增加列和行的索引,並且當所有單元格都已填充時,在粘貼原始表副本的文檔末尾插入分頁符。 此時,兩個索引都重置為1,將新表設置為要使用的表,並且一切正常進行。

這是代碼:

    private static string FillTemplate(List<ClientListItem> clients, string fileName)
    {
        //Filled document file name
        var savedFileName = string.Empty;
        //Search template file in current directory
        var templateFilePath = System.AppDomain.CurrentDomain.BaseDirectory + "templateFile.doc";



        object missing = System.Type.Missing;
        // Create Word application
        WORD._Application app = new WORD.Application();

        try
        {
            app.Visible = true;
            Print("Creating label document.");
            // Create new file
            WORD._Document doc = app.Documents.Open(templateFilePath);

            //Print("Creating app selection object");
            WORD.Selection selection = app.Selection;

            //If the template file contains tables
            if (selection.Tables.Count > 0)
            {
                //Use first table
                var tableToUse = selection.Tables[1];

                //copy the empty table in the clipboard
                WORD.Range range = tableToUse.Range;
                range.Copy();

                int rowIndex = 1;
                int columnIndex = 1;

                // loop over all the items to insert
                foreach (ClientListItem parentCaregiver in clients)
                {
                    // check if all the cells in the current row have been used
                    if (columnIndex > tableToUse.Columns.Count)
                    {
                        // if this is the case increment the row index and restart from the first column
                        columnIndex = 1;
                        rowIndex++;
                        // check if all the rows in the current table have been used
                        if (rowIndex > tableToUse.Columns.Count)
                        {
                            // if this is the case create a new table and restart from the first row
                            rowIndex = 1;
                            // first go to end of document
                            selection.EndKey(WORD.WdUnits.wdStory, WORD.WdMovementType.wdMove);
                            // then add page break
                            object breakType = WORD.WdBreakType.wdPageBreak; 
                            selection.InsertBreak(ref breakType);
                            // add a new table (initially with 1 row and one column) at the end of the document
                            // i.e. on the new page
                            WORD.Table tableCopy = doc.Tables.Add(selection.Range, 1, 1, ref missing, ref missing);
                            // paste the original empty table over the new one
                            tableCopy.Range.Paste();
                            // makes the copied table the one to use
                            tableToUse = tableCopy;
                        }
                    }
                    Print("Generating label to add to document.");

                    //Get label to add to document
                    var labelToAdd = string.Format("{0} {1},{6}{2},{6} {3}, {4} {5}", parentCaregiver.Parent1LastName, parentCaregiver.Parent1FirstName,
                        parentCaregiver.Parent1StreetAddress, parentCaregiver.Parent1City, parentCaregiver.Parent1State, parentCaregiver.Parent1Zip, Environment.NewLine);

                    //Get cell to set value
                    var tableCell = tableToUse.Cell(rowIndex, columnIndex);
                    //Set text in cell
                    tableCell.Range.Text = labelToAdd;
                    //Middle align text
                    tableCell.Range.ParagraphFormat.Alignment = WORD.WdParagraphAlignment.wdAlignParagraphCenter;

                    Print(string.Format("Label added {0} at {1}, {2} position.", labelToAdd, rowIndex, columnIndex));

                    columnIndex++;
                }


            }

            // Set file name to save
            savedFileName = fileName; // string.Format(@"{0}{1}{2}", Path.GetTempPath(), fileName, Path.GetExtension(templateFilePath));
            object fname = savedFileName;
            Print(string.Format("Saving new document at {0}", savedFileName));
            // SaveAs new file
            doc.SaveAs(ref fname, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);
            Print(string.Format("{0} saved successfully.", savedFileName));
            app.Documents.Close(ref missing, ref missing, ref missing);
        }
        catch (Exception exc)
        {
            Print("Exception while generating label document");
            Print(exc.ToString());
            //Set file Name to empty string
            savedFileName = string.Empty;
        }
        finally
        {
            // Close Word application
            app.Quit(ref missing, ref missing, ref missing);
            Marshal.ReleaseComObject(app);
            app = null;
            GC.Collect();
            GC.WaitForPendingFinalizers();
            GC.Collect();
            GC.WaitForPendingFinalizers();
        }

        //Return saved file name
        return savedFileName;

    }

另一種方法是,您可以將模板文件AddDocument而不用打開它,然后在每次到達表的最后一個單元格后使用Range.InsertFile后,使用Range.InsertFile插入模板文件。 我使用了while循環只是為了保持當前的流量並通過使用index變量枚舉項目。

private static string FillTemplate(List<ClientListItem> clients, string fileName)
{
    //Filled document file name
    var savedFileName = string.Empty;
    //Search template file in current directory
    var templateFilePath = System.AppDomain.CurrentDomain.BaseDirectory + "templateFile.doc";

    //#region Generate file for labels

    object missing = System.Type.Missing;
    // Create Word application
    WORD._Application app = new WORD.Application();

    try
    {
        Print("Creating label document.");
        // Create new file
        //WORD._Document doc = app.Documents.Open(templateFilePath);
        // Instead of creating a new file, just add our template to the document
        WORD._Document doc = app.Documents.Add(templateFilePath);

        //Print("Creating app selection object");
        WORD.Selection selection = app.Selection;

        //If the template file contains tables
        if (selection.Tables.Count > 0)
        {
            //Use first table
            //Table's are accessed with starting index as 1 not 0
            var tableToUse = selection.Tables[selection.Tables.Count];

            //Counter for number of parent caregivers inserted
            var counter = 0;
            //Number of parent caregivers
            var numberOfParentCaregivers = clients.Count;
            //Loop on each row

            int rowIndex = 1, columnIndex = 1;

            while (counter < numberOfParentCaregivers)
            {
                if(columnIndex > tableToUse.Columns.Count)
                {
                    // Reset column index if we have reached the last column
                    columnIndex = 1;
                    // And go to the next row
                    rowIndex++;

                    if(rowIndex > tableToUse.Rows.Count)
                    {
                        // Reset row index if we have reached the last row
                        rowIndex = 1;
                        // Go the the end of the document, add a page break and insert our empty table template
                        object startPoint = 0;
                        WORD.Range range = doc.Range(ref startPoint, ref missing);
                        range.Collapse(WORD.WdCollapseDir‌​ection.wdCollapseEnd‌​);
                        range.InsertBreak(WORD.WdBreakTyp‌​e.wdSectionBreakNext‌​Page);
                        range.InsertFile(templateFilePath);
                        // Assign the new inserted template table to our current table to use
                        tableToUse = range.Tables[selection.Tables.Count];
                    }
                }

                var parentCaregiver = clients[counter];

                Print("Generating label to add to document.");

                //Get label to add to document
                var labelToAdd = string.Format("{0} {1},{6}{2},{6} {3}, {4} {5}", parentCaregiver.Parent1LastName, parentCaregiver.Parent1FirstName,
                    parentCaregiver.Parent1StreetAddress, parentCaregiver.Parent1City, parentCaregiver.Parent1State, parentCaregiver.Parent1Zip, Environment.NewLine);

                //Print(string.Format("Adding label {0} at {1}, {2} position.", labelToAdd, rowIndex, columnIndex));

                //Get cell to set value
                var tableCell = tableToUse.Cell(rowIndex, columnIndex);
                //Set text in cell
                tableCell.Range.Text = labelToAdd;
                //Middle align text
                tableCell.Range.ParagraphFormat.Alignment = WORD.WdParagraphAlignment.wdAlignParagraphCenter;

                Print(string.Format("Label added {0} at {1}, {2} position.", labelToAdd, rowIndex, columnIndex));
                // Increate items counter and columns counter on each loop
                counter++;
                columnIndex++;
            }
        }

        // Set file name to save
        savedFileName = string.Format(@"{0}{1}{2}", Path.GetTempPath(), fileName, Path.GetExtension(templateFilePath));
        object fname = savedFileName;
        Print(string.Format("Saving new document at {0}", savedFileName));
        // SaveAs new file
        doc.SaveAs(ref fname, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);
        Print(string.Format("{0} saved successfully.", savedFileName));
        app.Documents.Close(ref missing, ref missing, ref missing);
    }
    catch (Exception exc)
    {
        Print("Exception while generating label document");
        Print(exc.ToString());
        //Set file Name to empty string
        savedFileName = string.Empty;
    }
    finally
    {
        // Close Word application
        app.Quit(ref missing, ref missing, ref missing);
        Marshal.ReleaseComObject(app);
        app = null;
        GC.Collect();
        GC.WaitForPendingFinalizers();
        GC.Collect();
        GC.WaitForPendingFinalizers();
    }

    //Return saved file name
    return savedFileName;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM