У меня есть программа, которую я пытаюсь поместить поля из базы данных в документ 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);
}
}