【发布时间】: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 循环中创建新文档,您将获得每个标题的文档,但如果您不使用模板,则会收到错误,因为原始文档已被锁定以进行编辑。