【问题标题】:Saving to a Word Document with bookmarks with data from a data set保存到带有数据集数据的书签的 Word 文档
【发布时间】:2019-01-24 03:45:50
【问题描述】:

我有一个程序,我试图将数据库中的字段放入包含书签的 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();


            }
}

任何帮助将不胜感激。提前致谢

更新 在 Cindy Meister 的回答的帮助下,我得到了它的帮助。 我现在可以使用 Building Blocks 将书签标记为数据集中的每个条目。 我现在添加了将每个数据集条目放在自己的页面上的功能。我仍在努力让它不打印最后包含构建块的空白页。

以下是可能正在寻找此解决方案的任何人的工作代码。

        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);


        }




    }

【问题讨论】:

  • 问题是您只创建一个文档,因此每次为书签分配值时,书签都会获得一个新值,您需要为每个新值创建一个新书签。您是想要收集每个带有食谱的 word 文档,还是想要一个“多页”文档,每页都有食谱?如果您移动调用以在 for 循环中创建新文档,您将获得每个标题的文档,但如果您不使用模板,则会收到错误,因为原始文档已被锁定以进行编辑。

标签: c# ms-word


【解决方案1】:

可以使用 Building Blocks 插入“样板文本”。一个 Building Block 几乎可以包含所有内容。

插入带有书签的 Building Block 将删除文档中前面的所有“同名”书签。这意味着,在为第一行数据填充书签后,插入 Building Block,下一行数据将进入这组书签。以此类推。

  1. 打开文档进行编辑。
  2. 选择应重复的文本部分(包括书签)。
  3. 转到插入/文本/快速部件并选择Save Selection to Quick Part Gallery。在对话框中输入名称、类别、画廊等信息。这将创建一个 Building Block。
  4. Building Blocks 必须保存在 模板 文件(dotx 或 dotm)中。在默认安装中,这可以是 Normal.dotm 或 Building Blocks.dotx。也可以使用作为项目一部分提供的“自定义模板”。

以下代码示例演示了如何将存储在 Normal.dotm 中的名为 BB with bookmarks 的 Building Block 插入到文档的末尾。

oWord.NormalTemplate.BuildingBlockEntries.Item("BB with bookmarks").Insert(oDoc.Characters.Last, true);

【讨论】:

  • 非常感谢,这正是我想要的。你是救生员。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-24
  • 1970-01-01
相关资源
最近更新 更多