c# - 字互操作 C# : Insert new page using existing page

标签 c# ms-word interop office-interop

我有一个 Word 模板文件,其中包含一个表格,有 11 行和 3 列。所以第一页的表格中有 33 个单元格。我用一些数据填充这些单元格,但是如果记录数大于 33 条(例如 66 条),我将创建两个文件,每个文件包含 33 条记录。我想创建一个包含所有 66 条记录的单个文件,并且一个文件中应该有两页,而不是两个单独的文件。我该怎么做?

以下是我用来创建一个文档文件的代码。

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;

    }

关于c# - 字互操作 C# : Insert new page using existing page,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40677666/

相关文章:

c# - COM Word Selection TypeText 带换行符

c# - 在 SSIS 中使用 Excel 互操作的问题

c# - SQL Server 的图表构建问题

c# - 将对象序列化为平面 Dictionary<string,string>

c# - 使用 Open XML SDK 2.0 或 Linq 在 Word 2010 中删除自定义属性的内容

c# - 通过功能区代码隐藏在 Word 中打开文件

VB.NET 中的 C 函数

c# - 将 .net 4.0 语法 OfType 转换为 .net 3.5

c# - 如何根据条件调用不同版本的覆盖方法?

c# - 基本线程