Я написал следующий код, позволяющий пользователям запрашивать данные на основе документа Word, который будет напечатан, и источника данных (разные системы), где они могут выбрать ИСТОЧНИК1, ИСТОЧНИК2 или ОБА. Данные запрашиваются, помещаются в ODBC DataReader, а затем передаются по циклу для заполнения элемента управления ListView.
Затем я позволяю пользователям выбирать, какие записи они хотят распечатать, и эти записи обрабатываются в выбранный текстовый документ как операция слияния.
Сейчас я пытаюсь сохранить каждую отдельную страницу документа Word (каждую запись слияния) в определенную папку с собственным именем.
КОД:
private void btnSearch_Click(object sender, EventArgs e)
{
lvData.Clear();
string qryCmd = "";
createColumns();
switch (cmbLetterType.SelectedIndex)
{
case 0:
qryCmd = chkSystem("oldAddr");
break;
case 1:
qryCmd = chkSystem("newAddr");
break;
case 2:
qryCmd = chkSystem("nameChg");
break;
}
// If the option for BOTH is selected, qryCmd is a long string containing the individual queries for SOURCE1 and SOURCE2.
// Here I check if a semicolon (;) exists, denoting that there are 2 cmd queries in the string.
// If so, I split the query calling GetiSeriesData() with the first query string, then assigning qryCmd the second
// strings value and continuing processing as normal.
if (qryCmd.Contains(";"))
{
char[] delimitChar = { ';' };
string[] splitQueries = qryCmd.Split(delimitChar);
qryCmd = splitQueries[0];
GetiSeriesData(qryCmd);
qryCmd = splitQueries[1];
}
GetiSeriesData(qryCmd);
// Display message if no records found.
if (lvData.Items.Count == 0)
{
MessageBox.Show("No records found.");
}
lblRecCnt.Text = lvData.Items.Count.ToString();
this.lvData.CheckBoxes = true;
}
public void GetiSeriesData(string query)
{
OdbcDataReader dr;
try
{
//Set value of system based on table being looked at in ConnectionString
string sysValue = "";
if (query.Contains("lib1"))
{
sysValue = "P";
}
if (query.Contains("lib2"))
{
sysValue = "N";
}
MergeDocLibrary mdl = new MergeDocLibrary();
dr = mdl.GetData(query);
Int16 x = 0;
string gndr = "";
// Fill ListView Control lvData
while (dr.Read())
{
lvData.Items.Add(dr["MEMNO"].ToString().Trim());
lvData.Items[x].SubItems.Add(dr["NAME"].ToString().Trim());
lvData.Items[x].SubItems.Add(dr["ADDR1"].ToString().Trim());
lvData.Items[x].SubItems.Add(dr["ADDR2"].ToString().Trim());
lvData.Items[x].SubItems.Add(dr["CITY"].ToString().Trim());
lvData.Items[x].SubItems.Add(dr["STATE"].ToString().Trim());
lvData.Items[x].SubItems.Add(dr["ZIP"].ToString().Trim());
lvData.Items[x].SubItems.Add(dr["OLD_ADDR1"].ToString().Trim());
lvData.Items[x].SubItems.Add(dr["OLD_ADDR2"].ToString().Trim());
lvData.Items[x].SubItems.Add(dr["OLD_CITY"].ToString().Trim());
lvData.Items[x].SubItems.Add(dr["OLD_STATE"].ToString().Trim());
lvData.Items[x].SubItems.Add(dr["OLD_ZIP"].ToString().Trim());
lvData.Items[x].SubItems.Add(sysValue.ToString().Trim());
lvData.Items[x].SubItems.Add(DateTime.Today.ToString("d"));
lvData.Items[x].SubItems.Add(dr["SEX"].ToString().Trim());
lvData.Items[x].SubItems.Add(dr["LNAME"].ToString().Trim());
if (dr["SEX"].ToString().Trim() == "M")
{
gndr = "Mr.";
}
else // (dr["SEX"].ToString().Trim() == "F)
{
gndr = "Ms.";
}
lvData.Items[x].SubItems.Add(gndr + dr["LNAME"].ToString().Trim());
lvData.Items[x].SubItems.Add(dr["CITY"].ToString().Trim() + ", " + dr["STATE"].ToString().Trim() + " " + dr["ZIP"].ToString().Trim());
x += 1;
}
mdl.closeConn();
}
catch (Exception ex)
{
MessageBox.Show("Source:\t" + ex.Source + "\nMessage: \t" + ex.Message + "\nData:\t" + ex.Data);
}
finally
{
}
}
public void OpenAndReview()
{
try
{
string docSave = @"C:\Users\NAME\Desktop\Test.doc";
//MergeDocLibrary mdl = new MergeDocLibrary();
//mdl.mergeDocument(docSource, docLoc);
// Original Mail Merge Document
Word.Range rng;
object start = 0;
object end = 0;
Word.Range newWrdRng;
Word.Application oWord = new Word.Application();
Word.Document oWrdDoc = new Word.Document();
// New Document Instance
Word.Application oNewWord = new Word.Application();
Word.Document oNewWrdDoc = new Word.Document();
// Set 'False' in PROD, 'True' in DEV
oWord.Visible = true;
oNewWord.Visible = true;
Object oTemplatePath = docLoc;
// Open Mail Merge Doc
oWrdDoc = oWord.Documents.Open(oTemplatePath);
// Open New Document
oNewWrdDoc = oNewWord.Documents.Open(docSave);
Object oMissing = System.Reflection.Missing.Value;
// Open Mail Merge Datasource
oWrdDoc.MailMerge.OpenDataSource(docSource, oMissing, oMissing, oMissing,
oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing);
// Execute Mail Merge
oWrdDoc.MailMerge.Execute();
// Set Mail Merge Document as Active Doc
//oWrdDoc.Activate();
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
MessageBox.Show(oWord.ActiveDocument.Sections.Count.ToString());
// 3 Records selected gives 4 Sections Counted??
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Subtract 1 to account for the extra section being counted?
int docCnt = oWord.ActiveDocument.Sections.Count - 1;
int cnt = 0;
while (cnt != docCnt)
{
cnt++;
// Copy Desired Section from Mail Merge
oWord.ActiveDocument.Sections[cnt].Range.Copy();
// Set focus to the New Word Doc instance
oNewWord.Activate();
// Paste copied range to New Word Doc
oNewWord.ActiveDocument.Range(0, 0).Paste();
// Save New Word Doc
oNewWord.ActiveDocument.SaveAs2(@"C:\Users\NAME\Desktop\SuccesfullySavedDoc-" + cnt + ".doc");
// Clear New Word Doc
oNewWord.ActiveDocument.Content.Select();
oNewWord.Selection.TypeBackspace();
// Set Mail Merge as Active Document
oWord.Activate();
}
// .............
// Save new docuemnt...?
oNewWrdDoc.SaveAs2("SuccesfullySavedTest.doc");
}
catch (Exception ex)
{
MessageBox.Show("Source:\t" + ex.Source + "\nMessage: \t" + ex.Message + "\nData:\t" + ex.Data);
}
finally
{
//
}
}
...
EDIT3: документ очищается с каждой новой итерацией цикла. Теперь пытаюсь понять, почему каждый документ сохраняется с лишней пустой страницей 2.
Грубый план:
Документ 1: Запись 1 + дополнительная пустая страница (не знаете, почему?)
Документ 2: Запись 2 + дополнительная пустая страница (не знаете, почему?)
Документ 3: ЗАПИСЬ 3 + дополнительная пустая страница (не знаете, почему?)