Применить предопределенный стиль Word к тексту в C # - PullRequest
0 голосов
/ 21 сентября 2018

Я хочу применить предопределенный стиль к своему абзацу (например, «Заголовок2»), чтобы я мог обновить свою таблицу содержания и автоматически заполнить ее.

Это мой код:

using Word = Microsoft.Office.Interop.Word;

object oMissing = System.Reflection.Missing.Value;
Word.Application oWord = new Word.Application();
Word.Document oDoc = oWord.Documents.Add(@"local path to a template", 
  ref oMissing, ref oMissing, ref oMissing);

object obrangePara = oDoc.Bookmarks[oEndOfDoc].Range;
var objpara = oDoc.Content.Paragraphs.Add(ref objrangePara);
objpara.set_Style(Word.WdBuiltinStyle.wdStyleHeading2);
objpara.Range.Text = "some text";

enter image description here

Этот стиль применяется визуально, но не отображается в оглавлении при его обновлении.Когда я выбираю текст в Word, он говорит, что у него нормальный стиль текста, хотя визуально он имеет стиль Heading2.

Как я могу убедиться, что предопределенный стиль применяется правильно?

Здесь вы можете видеть, что стиль визуально в порядке, но Word распознает его как обычный текст: enter image description here enter image description here

Полный список кодов:

        object oMissing = System.Reflection.Missing.Value;
        object oEndOfDoc = "\\endofdoc"; // endofdoc is a predefined bookmark
        var oTemplate = @"C:\TestLab\SantiagoReport.dotx";

        Word.Application oWord;
        Word.Document oDoc;
        oWord = new Word.Application();
        oWord.Visible = true;

        if(File.Exists(oTemplate))
        {
            oDoc = oWord.Documents.Add(oTemplate, ref oMissing, ref oMissing, ref oMissing);

            Word.Table dateTable = findTable(oDoc, "Tests Date");
            dateTable.Cell(2, 1).Range.Text = DateTime.Now.ToString();

            Word.Table snTable = findTable(oDoc, "Serial Number");
            snTable.Cell(2, 1).Range.Text = SerialNumber;

            Word.Table userTable = findTable(oDoc, "User");
            userTable.Cell(2, 1).Range.Text = User;

            Word.Table timeTable = findTable(oDoc, "Total Elapsed Time");
            timeTable.Cell(2, 1).Range.Text = String.Format("{0}h{1}m{2}s", StopWatch.Elapsed.Hours, StopWatch.Elapsed.Minutes, StopWatch.Elapsed.Seconds);

            Word.Table summaryTable = findTable(oDoc, "Summary");
            summaryTable.Cell(2, 2).Range.Text = nbLoadedTests.ToString();
            summaryTable.Cell(3, 2).Range.Text = nbSelectedTests.ToString();
            summaryTable.Cell(4, 2).Range.Text = nbPassedTests.ToString();
            summaryTable.Cell(5, 2).Range.Text = nbFailedTests.ToString();

            var testListBookmarkRange = oDoc.Bookmarks[oEndOfDoc].Range;

            foreach (TestCategory category in TestList)
            {
                //category.ShouldExecuteTest
                object objrangePara = oDoc.Bookmarks[oEndOfDoc].Range;
                //object objrangPara2 = oDoc.Bookmarks[oEndOfDoc].Range;
                //objrangePara.Select();
                Word.Range rangetest = (Word.Range)objrangePara;
                rangetest.set_Style(Word.WdBuiltinStyle.wdStyleHeading2);

                var objpara = oDoc.Content.Paragraphs.Add(ref objrangePara);
                //objpara.set_Style(Word.WdBuiltinStyle.wdStyleHeading2);

                //objpara.Format = new Word.ParagraphFormat();
                //objpara.Format.set_Style(Word.WdBuiltinStyle.wdStyleHeading2);
                //objpara.Range.set_Style(Word.WdBuiltinStyle.wdStyleHeading2);
                //objpara.Range.Text = String.Format("{0}: {1}{2}", category.ID, category.Name, Environment.NewLine);
                rangetest.Text = String.Format("{0}: {1}{2}", category.ID, category.Name, Environment.NewLine);
                //objpara.Range.set_Style(Word.WdBuiltinStyle.wdStyleHeading2);
                //objpara.Format.set_Style(Word.WdBuiltinStyle.wdStyleHeading2);


                foreach (Test test in category.TestList)
                {
                    testListBookmarkRange = oDoc.Bookmarks[oEndOfDoc].Range;

                    Word.Table tbl = oDoc.Tables.Add(testListBookmarkRange, 3, 2);
                    tbl.Borders.InsideLineStyle = Word.WdLineStyle.wdLineStyleSingle;
                    tbl.Borders.OutsideLineStyle = Word.WdLineStyle.wdLineStyleSingle;
                    tbl.Cell(1, 1).Range.Text = test.ID.ToString();
                    tbl.Cell(1, 2).Range.Text = test.Name;
                    tbl.Cell(2, 1).Range.Text = "Result";
                    if (test.Result != null)
                        tbl.Cell(2, 2).Range.Text = test.Result.Pass ? "Pass" : "Fail";
                    tbl.Cell(3, 1).Range.Text = "Comment";
                    if (test.Result != null)
                        tbl.Cell(3, 2).Range.Text = test.Result.Message;
                    objrangePara = oDoc.Bookmarks[oEndOfDoc].Range;
                    objpara = oDoc.Content.Paragraphs.Add(ref objrangePara);
                    objpara.Range.Text = Environment.NewLine;
                    //test.TestItem.cbRunTest.Checked

                }
            }

            oDoc.TablesOfContents[1].Update();

            object pathtofile = @"C:\TestLab\test.docx";
            oDoc.SaveAs2(ref pathtofile);

            oDoc.Close();
            oWord.Quit();
            GC.Collect();
        }

Ответы [ 2 ]

0 голосов
/ 30 сентября 2018

У меня работает следующий подход.В отличие от кода в вопросе, следующий пример

  • Работает исключительно с Word.Range объектами
  • Свертывает диапазон для добавления нового содержимого
  • ИспользованиеInsertAfter("\n") для вставки нового абзаца
  • Добавляет текст до с применением стиля

Обратите внимание, что если вы планируете вставить таблицу после текста, отформатированного с помощью любогокроме стиля Normal, вы должны вставить новый абзац и отформатировать его в стиле Normal, а затем вставить таблицу.В противном случае вы можете столкнуться с проблемами с форматированием таблицы, если вы используете стили таблицы.

object oCollapseEnd = Word.WdCollapseDirection.wdCollapseEnd;
foreach (string s in lst)
{
    Word.Range rngEndOfDoc = oDoc.Bookmarks[oEndOfDoc].Range;
    rngEndOfDoc.InsertAfter("\n");
    rngEndOfDoc.Collapse(ref oCollapseEnd);
    rngEndOfDoc.Text = s;
    rngEndOfDoc.set_Style(Word.WdBuiltinStyle.wdStyleHeading2);
}
0 голосов
/ 24 сентября 2018

Сначала установите пакет ниже с помощью диспетчера пакетов NuGet:

Install-Package Microsoft.Office.Interop.Word

Теперь вы можете применять собственный стиль к любому диапазону выбора.

В приведенном ниже примере кода заголовок Стиль 1 будет применяться к первому абзацу в «Test.docx»: документ.

// Define new application and open MS Word document.
Application app = new Application();
Document doc = app.Documents.Open(@"D:\Test.docx");

// Select first paragraph.
doc.Paragraphs[1].Range.Select();

// Define style as object and assign your custom style as string to it.
object style = "Heading 1";

// Set custom style to selected range
app.Selection.set_Style(ref style);

// Close document and pass true if you want save changes and finally quit from application.
doc.Close(true);
app.Quit();

При таком подходе любые изменения, например применение стиля к любому диапазону выбора, будут влиять на их визуальное применение.

...