MS Word Interop,使用标题保留段落和表格,防止它们分裂到下一页

时间:2015-06-29 14:33:33

标签: c# asp.net ms-word ms-office office-interop

我使用下面的代码完美地合并了排队的html文件列表,并使用MS Word Interop将它们保存为PDF或DOCX。我遇到了分页问题。我无法弄清楚如何在页面中断页面和表格。我的目标是将段落和表格中的文本保存在一起。大多数表格上面还有一个标题文字。如果可能的话,将它们保持在一起会很好。有没有办法以编程方式将这些项目保持在一起?正在使用的文档没有静态的措辞或格式。它们都是动态创建的,并且可以根据具体情况完全不同。此代码是在.NET 2.0环境中开发的。

public static void MergeA(string[] filesToMerge, string outputFilename, bool insertPageBreaks, bool pdf)
    {
        //object defaultTemplate = documentTemplate;
        object missing = System.Type.Missing;
        object pageBreak = Microsoft.Office.Interop.Word.WdBreakType.wdPageBreak;
        object outputFile = outputFilename;
        object oFileFormat = Microsoft.Office.Interop.Word.WdSaveFormat.wdFormatDocumentDefault;
        if (pdf)
        {
            oFileFormat = Microsoft.Office.Interop.Word.WdSaveFormat.wdFormatPDF;
        }

        // Create  a new Word application
        Microsoft.Office.Interop.Word._Application wordApplication = new Microsoft.Office.Interop.Word.Application();
        wordApplication.Visible = false;

        try
        {
            // Create a new file based on our template
            Microsoft.Office.Interop.Word._Document wordDocument = wordApplication.Documents.Add(
                                          ref missing
                                        , ref missing
                                        , ref missing
                                        , ref missing);

            // Make a Word selection object.
            Microsoft.Office.Interop.Word.Selection selection = wordApplication.Selection;

            // Loop thru each of the Word documents
            foreach (string file in filesToMerge)
            {
                // Insert the files to our template
                selection.InsertFile( 
                                        file
                                        , ref missing
                                        , ref missing
                                        , ref missing
                                        , ref missing);

                //Do we want page breaks added after each documents?
                if (insertPageBreaks)
                {
                    selection.InsertBreak(ref pageBreak);
                }
            }

            // Save the document to it’s output file.                
            wordDocument.SaveAs2(
                            ref outputFile
                        , ref oFileFormat
                        , 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);

            // Clean up!
            wordDocument = null;
        }
        catch (Exception ex)
        {
            //I didn’t include a default error handler so i’m just throwing the error
            throw ex;
        }
        finally
        {
            // Finally, Close our Word application
            wordApplication.Quit(ref missing, ref missing, ref missing);
        }
    }
我几乎就在那里。我在SaveAs2之前插入页面if if语句后添加了下面的代码。这看起来像我希望的那样工作,但我仍然遇到问题,它打破了表头。我认为我可能需要将标题标签封装在表格中,但对于我们如何使用它,这将非常困难,因为原始文件(filesToMerge)是在html中动态创建的。我还认为我需要减少字体,因为它似乎也导致一些文本被切断或减少一半。它切断文字似乎有点奇怪。在进一步检查保存的文档之后,我非常幸运地将原始html文件封装在表格中。这有很大帮助。看起来我需要修复剪切文本并将页眉文本与分页符表上的表格保持在一起,我现在已经解决了这个问题。任何想法都会很棒。我希望这个问题对其他人有帮助,因为有一些较旧的帖子,但它们不是很详细。

            //Format tables so that they do not split up on page breaks.
            foreach (Microsoft.Office.Interop.Word.Table oTable in wordDocument.Tables)
            {
                oTable.AllowPageBreaks = false;                    
                oTable.Rows.AllowBreakAcrossPages = 0;                    
            }

经过进一步的研究,我很困惑。看来表格标题在html中的T​​R TD标签内,当保存为单词doc时,实际上是在表格内,但它并没有将它们保持在一起。通过上述循环,我不确定为什么会发生这种情况。

2 个答案:

答案 0 :(得分:1)

我忘记了这个问题,但我确实解决了这个问题,因为它收到了很多观点,我觉得展示我的解决方案是有用的。

            foreach (Microsoft.Office.Interop.Word.Table oTable in wordDocument.Tables)
            {
                oTable.AllowPageBreaks = false;                    
                oTable.Rows.AllowBreakAcrossPages = 0;                    
            }

我已经完成了问题。现在我需要弄清楚如何在表格上方包含标签以打破表格。

可能有更好的方法来完成所有这些,因为原始格式是HTML,业务需要是在Word和PDF中保存HTML格式的页面。我遇到的问题是所有编程保存的格式都看起来与HTML不同,并且不是最好看的。问题在于表格,文本和不正确的分页大小

答案 1 :(得分:0)

它可能无法给出您想要的答案,但是......

Microsoft目前不建议也不支持从任何无人参与的非交互式客户端应用程序或组件(包括ASP,ASP.NET,DCOM和NT服务)自动化Microsoft Office应用程序,因为Office在此环境中运行Office时,可能会出现不稳定的行为和/或死锁。

如果要构建在服务器端上下文中运行的解决方案,则应尝试使用已为安全无人值守执行的组件。或者,您应该尝试找到允许至少部分代码在客户端运行的替代方法。如果从服务器端解决方案使用Office应用程序,则应用程序将缺少许多成功运行的必要功能。此外,您将承担整体解决方案稳定性的风险。请在Considerations for server-side Automation of Office文章中详细了解相关内容。

您可以考虑使用Open XML SDK或为服务器端执行而设计的任何第三方组件。有关详细信息,请参阅Welcome to the Open XML SDK 2.5 for Office