c# - 字符串参数太长。从数据库中检索数据到word模板

标签 c# visual-studio-2010

我正在尝试从 sql 数据库中的表和 word 文档中的 FindandReplace 中检索一些数据。我在 WordApp.Selection.Find.Execute 方法中收到“字符串参数太长”错误。请帮忙!

private void btnML_Click(object sender, EventArgs e) {

        richTextBox2.Visible = true;
        this.btnML.Visible = true;



        String Template;

        SaveFileDialog saveFileDialog1 = new SaveFileDialog();

        saveFileDialog1.Title = "Save Management Letter";


        saveFileDialog1.Filter = "Microsoft word Format (*.docx)|*.doc";


        saveFileDialog1.ShowDialog();


        NewFileName = saveFileDialog1.FileName.ToString();

        Template = @"C:\Users\czu_ecu\Desktop\OAG-WORK\Management Letter Template_new.docx";

        CreateWordDocument(Template,
                       NewFileName);       

    }


    protected String Findings, Implication, Recommendation, ManagementComment, Person, CDate;




    private void CreateWordDocument(object fileName,
                                    object saveAs)
    {





        String sqlQueryfinding =  "Select [Findings_ID]  ,[AU_ID]  ,[Findings_No] ,[Findings_Title] ,[Findings_Rating]  ,[Findings_Description] ,[Findings_Implication] ,[Findings_Recomendation] ,[Findings_ManagementComment]  ,[Findings_ManagerResponsible] ,[Findings_CompletionDate] ,[FSC_ID]   ,[Findings_Status] from Findings Where AU_ID = 173";;    
        SqlCommand cmd = new SqlCommand(sqlQueryfinding, Con.main_connect());

        //sqlData Reader Object to Read the Value returned from query
        SqlDataReader Dr = cmd.ExecuteReader();

        //Set Missing Value parameter - used to represent
        // a missing value when calling methods through
        // interop.
        object missing = System.Reflection.Missing.Value;

        //Setup the Word.Application class.


        Microsoft.Office.Interop.Word.Application wordApp = new Microsoft.Office.Interop.Word.Application();

        //Setup our Word.Document class we'll use.
        Word.Document aDoc = null;


        // Check to see that file exists

        DateTime today = DateTime.Now;

        object readOnly = false;
        object isVisible = false;

        //Set Word to be not visible.
        wordApp.Visible = false;

        //Open the word document

        aDoc = wordApp.Documents.Open(ref fileName, ref missing,
            false, ref missing, ref missing, ref missing,
            ref missing, ref missing, ref missing, ref missing,
            ref missing, ref isVisible, ref missing, ref missing,
            ref missing, ref missing);



        // Activate the document
        aDoc.Activate();

        while (Dr.Read())
        {

            // Find Place Holders and Replace them with Values.
            this.FindAndReplace(wordApp, "<Finding>", Dr[3].ToString());
            this.FindAndReplace(wordApp, "<FindingDescription>", Dr[5].ToString());
            this.FindAndReplace(wordApp, "<ImplicationRating>", Dr[4].ToString());
            this.FindAndReplace(wordApp, "<Recommendation>", Dr[7].ToString());
            this.FindAndReplace(wordApp, "<ManagementComment>", Dr[8].ToString());
            this.FindAndReplace(wordApp, "<ResponsiblePerson>", Dr[9].ToString());
            this.FindAndReplace(wordApp, "<CompletionDate>", Dr[10].ToString());
        }


        //Example of writing to the start of a document.
        // aDoc.Content.InsertBefore("This is at the beginning\r\n\r\n");

        //Example of writing to the end of a document.
        // aDoc.Content.InsertAfter("\r\n\r\nThis is at the end");


        //Save the document as the correct file name.


        try
        {

            aDoc.SaveAs(ref saveAs,
                     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);
        }

        catch (Exception e)
        {
            // MessageBox.Show(e.ToString());
            MessageBox.Show("Management Letter Created", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        //Close the document - you have to do this.
        aDoc.Close(ref missing, ref missing, ref missing);

        CloseConnection();
        MessageBox.Show("Management Letter Created", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information);
    }





     private void FindAndReplace(Word.Application WordApp,
                               object findText,
                               object replaceWithText)
    {
        object matchCase = true;
        object matchWholeWord = true;
        object matchWildCards = false;
        object matchSoundsLike = false;
        object nmatchAllWordForms = false;
        object forward = true;
        object format = false;
        object matchKashida = false;
        object matchDiacritics = false;
        object matchAlefHamza = false;
        object matchControl = false;
        object read_only = false;
        object visible = true;
        object replace = 2;
        object wrap = 1;

        WordApp.Selection.Find.Execute(
            ref findText, 
            ref matchCase, 
            ref matchWholeWord, 
            ref matchWildCards, 
            ref matchSoundsLike,  
            ref nmatchAllWordForms, 
            ref forward, 
            ref wrap, 
            ref format, 
            ref replaceWithText, 
            ref replace, 
            ref matchKashida, 
            ref  matchDiacritics, 
            ref matchAlefHamza , ref matchControl);
    }

最佳答案

替换时替换文字不能超过255。 相反,您可以选择要替换的文本,然后更改选择的文本。

public static void ReplaceTextInWordDoc(Object findMe, Object replaceMe, ApplicationClass app)
{
    object replaceAll = Word.WdReplace.wdReplaceAll;
    object missing = System.Reflection.Missing.Value;
    app.Application.Selection.Find.ClearFormatting();
    app.Application.Selection.Find.Text = (string)findMe;
    app.Application.Selection.Find.Replacement.ClearFormatting();

    if (replaceMe.ToString().Length < 256) // Normal execution
    {
        app.Application.Selection.Find.Replacement.Text = (string)replaceMe;
        app.Application.Selection.Find.Execute(
        ref missing, ref missing, ref missing, ref missing, ref missing,
        ref missing, ref missing, ref missing, ref missing, ref missing,
        ref replaceAll, ref missing, ref missing, ref missing, ref missing);
    }
    else  // Some real simple logic!!
    {
        app.Application.Selection.Find.Execute(
        ref findMe, 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);

        // the area where the findMe is located in the Document is selected.
        // Hence when you execute the statement below the replaceMe string is
        // placed in the area selected, which is what we wanted!

        app.Application.Selection.Text = (string)replaceMe;//****
    }
}

Checkout Here

关于c# - 字符串参数太长。从数据库中检索数据到word模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23880369/

相关文章:

javascript - session cookie asp.net c#

jQuery Mobile - Visual Studio 2010 的智能感知

visual-studio-2010 - Ctrl+k、Ctrl+d 在处理 C++ 项目的 Visual Studio 2010 中不可用

c# - 我可以使用 DataAdapter C# 填充列表吗

c# - 在 .net core 2 解决方案中引用 .net 4.7 框架程序集

c# - 按工作日的第一天排序工作日

c# - 从非 guid 格式的字符串生成 GUID

c# - 如何在 MVC3 应用程序中构建用于发送的 HTML 消息?

visual-studio-2010 - 在 OSX 上运行 NUnit 测试的步骤

c# - 在 Windows Phone 7 (WP7) 中以编程方式创建按钮