Сохранение в документ Word с закладками с данными из набора данных - PullRequest
0 голосов
/ 21 января 2019

У меня есть программа, которую я пытаюсь поместить поля из базы данных в документ Word, который содержит закладки. Я могу заставить его работать для одной записи за раз, но я пытаюсь заставить его читать набор данных и помещать каждую строку из набора данных на новую страницу, используя документ, содержащий закладки. Я могу заставить его разместить контент на первой странице, но когда он читает вторую строку, он заменяет контент из первой строки этим контентом. Есть ли способ заставить его создать новую страницу для каждой строки, используя документ с закладками?

Ниже приведен код, который я сейчас использую.

с использованием Word = Microsoft.Office.Interop.Word;

    public static void printAll()
        {
            SQLiteConnection con = new SQLiteConnection(ConfigurationManager.ConnectionStrings["myConnection"].ConnectionString);
            SQLiteDataAdapter da;
            DataSet ds;

            object oMissing = System.Reflection.Missing.Value;
            object oEndOfDoc = "\\endofdoc"; /* \endofdoc is a predefined bookmark */

            //Start Word and open a document.
            Word._Application oWord;
            Word._Document oDoc;
            oWord = new Word.Application();
            oWord.Visible = true;
            oDoc = oWord.Documents.Open(Path.Combine(Environment.CurrentDirectory, "Recipe.docx"));
            Word.Range wrdRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range;
            string Title = null;
            string Author;
            string Type;
            string Recipe;


            string query = "SELECT RecipeID, Type, Name, Author, Recipe FROM Recipes";
            da = new SQLiteDataAdapter(query, con);

            ds = new DataSet();
            da.Fill(ds, "Recipes");

            for (int y = 0; y < ds.Tables[0].Rows.Count; y++)
            {
                Title = ds.Tables[0].Rows[y]["Name"].ToString();
                Author = ds.Tables[0].Rows[y]["Author"].ToString();
                Type = ds.Tables[0].Rows[y]["Type"].ToString();
                Recipe = Dangl.TextConverter.Rtf.RtfToText.ConvertRtfToText(ds.Tables[0].Rows[y]["Recipe"].ToString());


                //Inserts title string into title bookmark in word document
                Dictionary<string, string> titleBold = new Dictionary<string, string> { { "Title", Title } };

                foreach (var bookmark in titleBold)
                {
                    Word.Bookmark bm = oDoc.Bookmarks[bookmark.Key];
                    Word.Range range = bm.Range;
                    range.Text = bookmark.Value;
                    range.Font.Bold = 5;
                    oDoc.Bookmarks.Add(bookmark.Key, range);

                }

                // Inserts author, type and recipe into corosponding bookmarks in word document
                Dictionary<string, string> bookmarks = new Dictionary<string, string> { { "Author", Author }, { "Type", Type }, { "Recipe", Recipe } };

                foreach (var bookmark in bookmarks)
                {
                    Word.Bookmark bm = oDoc.Bookmarks[bookmark.Key];
                    Word.Range range = bm.Range;
                    range.Text = bookmark.Value;
                    range.Font.Bold = 0;
                    oDoc.Bookmarks.Add(bookmark.Key, range);

                }


                    object oCollapseEnd = Word.WdCollapseDirection.wdCollapseEnd;

                    oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range.InsertParagraphAfter();
                    object oPageBreak = Word.WdBreakType.wdPageBreak;

                wrdRng.InsertBreak(ref oPageBreak);
                    wrdRng.Collapse(ref oCollapseEnd);
                    wrdRng.InsertAfter(Title);
                    wrdRng.InsertParagraphAfter();


            }
}

Любая помощь будет принята с благодарностью. Заранее спасибо

Обновление Я получил это работает с помощью ответа Синди Майстер. Теперь я могу получить метки книг для каждой записи в наборе данных с помощью строительных блоков. Теперь я добавил возможность размещать каждую запись набора данных на отдельной странице. Я все еще работаю над тем, чтобы он не печатал пустую страницу со строительным блоком в конце.

Ниже приведен рабочий код для тех, кто может искать это решение.

        public static void printAll()
    {
        SQLiteConnection con = new SQLiteConnection(ConfigurationManager.ConnectionStrings["myConnection"].ConnectionString);
        SQLiteDataAdapter da;
        DataSet ds;

        object oMissing = Missing.Value;
        object oEndOfDoc = "\\endofdoc"; /* \endofdoc is a predefined bookmark */

        //Start Word and open a document.
        Word._Application oWord;
        Word._Document oDoc;
        oWord = new Word.Application();
        oWord.Visible = true;
        oDoc = oWord.Documents.Open(Path.Combine(Environment.CurrentDirectory, "Recipe.dotx"));
        Word.Range wrdRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range;
        string Title;
        string Author;
        string Type;
        string Recipe;



        string query = "SELECT RecipeID, Type, Name, Author, Recipe FROM Recipes";
        da = new SQLiteDataAdapter(query, con);

        ds = new DataSet();
        da.Fill(ds, "Recipes");

        for (int y = 0; y < ds.Tables[0].Rows.Count; y++)
        {
            Title = ds.Tables[0].Rows[y]["Name"].ToString();
            Author = ds.Tables[0].Rows[y]["Author"].ToString();
            Type = ds.Tables[0].Rows[y]["Type"].ToString();
            Recipe = Dangl.TextConverter.Rtf.RtfToText.ConvertRtfToText(ds.Tables[0].Rows[y]["Recipe"].ToString());


            //Inserts title string into title bookmark in word document
            Dictionary<string, string> titleBold = new Dictionary<string, string> { { "Title", Title } };

            foreach (var bookmark in titleBold)
            {
                Word.Bookmark bm = oDoc.Bookmarks[bookmark.Key];
                Word.Range range = bm.Range;
                range.Text = bookmark.Value;
                range.Font.Bold = 5;
                oDoc.Bookmarks.Add(bookmark.Key, range);

            }

            // Inserts author, type and recipe into corosponding bookmarks in word document
            Dictionary<string, string> bookmarks = new Dictionary<string, string> { { "Author", Author }, { "Type", Type }, { "Recipe", Recipe } };

            foreach (var bookmark in bookmarks)
            {
                Word.Bookmark bm = oDoc.Bookmarks[bookmark.Key];
                Word.Range range = bm.Range;
                range.Text = bookmark.Value;
                range.Font.Bold = 0;
                oDoc.Bookmarks.Add(bookmark.Key, range);


            }


            object oCollapseEnd = Word.WdCollapseDirection.wdCollapseEnd;

            oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range.InsertParagraphAfter();

           wrdRng.Collapse(ref oCollapseEnd);

            Object nullobj = System.Reflection.Missing.Value;

            Object objBreak = Word.WdBreakType.wdPageBreak;
            Object objUnit = Word.WdUnits.wdStory;

            oWord.Selection.EndKey(ref objUnit, ref nullobj);
            oWord.Selection.InsertBreak(ref objBreak);


            oWord.NormalTemplate.BuildingBlockEntries.Item("BuildingBlockBookmarks").Insert(oDoc.Characters.Last, true);


        }




    }

1 Ответ

0 голосов
/ 22 января 2019

Можно использовать Building Blocks, чтобы вставить «текст котельной плиты». Строительный блок может содержать почти все.

Вставка Building Block с закладками удалит все закладки «с тем же именем» ранее в документе. Это означает, что после того, как закладки были заполнены для первой строки данных, вставьте Building Block, и следующая строка данных перейдет в этот набор закладок. И так далее.

  1. Открыть документ для редактирования.
  2. Выберите часть текста, которая должна быть повторена (включая закладки).
  3. Перейдите на вкладку Вставка / Текст / Быстрые детали и выберите Save Selection to Quick Part Gallery. Введите информацию для Имя, Категория, Галерея и т. Д. В диалоговом окне. Это создает Building Block.
  4. Строительные блоки должны быть сохранены в файле template (dotx или dotm). При установке по умолчанию это может быть Normal.dotm или Building Blocks.dotx. Также можно использовать «пользовательский шаблон», поставляемый как часть вашего проекта.

Следующий пример кода демонстрирует, как строительный блок с именем BB with bookmarks, хранящийся в Normal.dotm, может быть вставлен в конец документа.

oWord.NormalTemplate.BuildingBlockEntries.Item("BB with bookmarks").Insert(oDoc.Characters.Last, true);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...