Используя Interop.Word, есть ли способ заменить (используя Find.Execute) и сохранить выравнивание исходного текста?

Я пытаюсь написать код поиска/замены для документов Word, используя Word Automation через Interop.Word (11.0). Во всех моих документах есть различные поля (которые не отображаются в Document.Fields), заключенные в квадратные скобки, например, <DATE> нужно заменить на DateTime.Now.Format("MM/dd/yyyy"). Поиск/замена работает нормально. Однако часть заменяемого текста выравнивается по правому краю, и после замены текст переносится на следующую строку. Есть ли способ сохранить обоснование при выполнении замены? Код ниже:

using Word = Microsoft.Office.Interop.Word;

Word.Application wordApp = null;
try
{
    wordApp = new Word.Application {Visible = false};
    //.... open the document ....
    object unitsStory = Word.WdUnits.wdStory;
    object moveType = Word.WdMovementType.wdMove;
    wordApp.Selection.HomeKey(ref unitsStory, ref moveType);
    wordApp.Selection.Find.ClearFormatting();
    wordApp.Selection.Find.Replacement.ClearFormatting();  //tried removing this, no luck
    object replaceTextWith = DateTime.Now.ToString("MM/dd/yyyy");
    object textToReplace = "<DATE>";
    object replaceAll = Word.WdReplace.wdReplaceAll;
    object typeMissing = System.Reflection.Missing.Value;
    wordApp.Selection.Find.Execute(ref textToReplace, ref typeMissing, 
        ref typeMissing, ref typeMissing, ref typeMissing, ref typeMissing, 
        ref typeMissing, ref typeMissing, ref typeMissing, ref typeMissing, 
        ref replaceTextWith, ref replaceAll, ref typeMissing, ref typeMissing, 
        ref typeMissing, ref typeMissing);
    // ... save quit etc.... 
}
finally
{
     //clean up wordApp
}

ТИА.


person AJ.    schedule 18.05.2010    source источник


Ответы (1)


Вы можете Microsoft.Office.Interop.Word.WdParagraphAlignment для выравнивания

        Microsoft.Office.Interop.Word.Application word = new Microsoft.Office.Interop.Word.Application();
        Microsoft.Office.Interop.Word.Document doc = new Microsoft.Office.Interop.Word.Document();

        object missing = System.Type.Missing;

        try
        {
            object fileName = @"C:\TT\change.doc";
            doc = word.Documents.Open(ref fileName,
                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);

            doc.Activate();

            foreach (Microsoft.Office.Interop.Word.Range tmpRange in doc.StoryRanges)
            {
                tmpRange.Find.Text = "<DATE>";
                tmpRange.Find.Replacement.Text = DateTime.Now.ToString("MM/dd/yyyy");
                tmpRange.Find.Replacement.ParagraphFormat.Alignment =
                    Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphJustify;



                tmpRange.Find.Wrap = Microsoft.Office.Interop.Word.WdFindWrap.wdFindContinue;
                object replaceAll = Microsoft.Office.Interop.Word.WdReplace.wdReplaceAll;

                tmpRange.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);
            }

            doc.Save();

            doc.Close(ref missing, ref missing, ref missing);
            word.Application.Quit(ref missing, ref missing, ref missing);
        }
        catch (Exception ex)
        {
            doc.Close(ref missing, ref missing, ref missing);
            word.Application.Quit(ref missing, ref missing, ref missing);
        }
person manish    schedule 15.02.2011
comment
После выхода из приложения освободите объект из памяти, используя Marshal.ReleaseComObject (ваш объект). - person KFP; 31.08.2016