我有一个包含表格的单词模板文件,它有11行3列。所以第一页的表格中有33个单元格。我用一些数据填充这些单元格,但是如果记录数大于33表示66,我创建两个文件,每个文件包含33个记录。我想创建一个包含所有66条记录的单个文件,一个文件中应该有两个页面而不是两个单独的文件。我该怎么办?
以下是我用来创建一个doc文件的代码。
private static string FillTemplate(List<ClientListItem> clients, string fileName)
{
//Filled document file name
var savedFileName = string.Empty;
//Search template file in current directory
var templateFilePath = System.AppDomain.CurrentDomain.BaseDirectory + "templateFile.doc";
#region Generate file for labels
object missing = System.Type.Missing;
// Create Word application
WORD._Application app = new WORD.Application();
try
{
Print("Creating label document.");
// Create new file
WORD._Document doc = app.Documents.Open(templateFilePath);
//Print("Creating app selection object");
WORD.Selection selection = app.Selection;
//If the template file contains tables
if (selection.Tables.Count > 0)
{
//Use first table
//Table's are accessed with starting index as 1 not 0
var tableToUse = selection.Tables[1];
//Counter for number of parent caregivers inserted
var counter = 0;
//Number of parent caregivers
var numberOfParentCaregivers = clients.Count;
//Loop on each row
//Rows are accessed with starting index as 1 not 0
for (int rowIndex = 1; rowIndex <= tableToUse.Rows.Count; rowIndex++)
{
//Loop on each column
//Columns are accessed with starting index as 1 not 0
for (int columnIndex = 1; columnIndex <= tableToUse.Columns.Count; columnIndex++)
{
//If counter has reached to its limit
if (counter + 1 > numberOfParentCaregivers)
{
//Stop
break;
}
//If current column index is even
if (columnIndex % 2 == 0)
{
//Do not process it
//Why? Check template file for yourself
continue;
}
//Get parent caregiver to set
var parentCaregiver = clients[counter];
Print("Generating label to add to document.");
//Get label to add to document
var labelToAdd = string.Format("{0} {1},{6}{2},{6} {3}, {4} {5}", parentCaregiver.Parent1LastName, parentCaregiver.Parent1FirstName,
parentCaregiver.Parent1StreetAddress, parentCaregiver.Parent1City, parentCaregiver.Parent1State, parentCaregiver.Parent1Zip, Environment.NewLine);
//Print(string.Format("Adding label {0} at {1}, {2} position.", labelToAdd, rowIndex, columnIndex));
//Get cell to set value
var tableCell = tableToUse.Cell(rowIndex, columnIndex);
//Set text in cell
tableCell.Range.Text = labelToAdd;
//Middle align text
tableCell.Range.ParagraphFormat.Alignment = WORD.WdParagraphAlignment.wdAlignParagraphCenter;
Print(string.Format("Label added {0} at {1}, {2} position.", labelToAdd, rowIndex, columnIndex));
counter++;
}
//If counter has reched to its limit
//i.e. no parent caregivers to process - all processed
if (counter + 1 > numberOfParentCaregivers)
{
//stop
break;
}
}
}
// Set file name to save
savedFileName = string.Format(@"{0}{1}{2}", Path.GetTempPath(), fileName, Path.GetExtension(templateFilePath));
object fname = savedFileName;
Print(string.Format("Saving new document at {0}", savedFileName));
// SaveAs new file
doc.SaveAs(ref fname, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);
Print(string.Format("{0} saved successfully.", savedFileName));
app.Documents.Close(ref missing, ref missing, ref missing);
}
catch (Exception exc)
{
Print("Exception while generating label document");
Print(exc.ToString());
//Set file Name to empty string
savedFileName = string.Empty;
}
finally
{
// Close Word application
app.Quit(ref missing, ref missing, ref missing);
Marshal.ReleaseComObject(app);
app = null;
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
}
//Return saved file name
return savedFileName;
}
请建议更改,以便我可以根据要添加到模板文件中的记录数创建任意数量的页面。
谢谢, 尼基尔。
答案 0 :(得分:3)
我更改了代码循环所有项目以插入表格而不是循环遍历表格的单元格。在此循环内,列和行的索引会递增,并且当所有单元格都已填充时,会在文档末尾插入分页符,其中粘贴原始表的副本。此时,两个索引重置为1,新表被设置为要使用的表,并且一切都正常。
这是代码:
private static string FillTemplate(List<ClientListItem> clients, string fileName)
{
//Filled document file name
var savedFileName = string.Empty;
//Search template file in current directory
var templateFilePath = System.AppDomain.CurrentDomain.BaseDirectory + "templateFile.doc";
object missing = System.Type.Missing;
// Create Word application
WORD._Application app = new WORD.Application();
try
{
app.Visible = true;
Print("Creating label document.");
// Create new file
WORD._Document doc = app.Documents.Open(templateFilePath);
//Print("Creating app selection object");
WORD.Selection selection = app.Selection;
//If the template file contains tables
if (selection.Tables.Count > 0)
{
//Use first table
var tableToUse = selection.Tables[1];
//copy the empty table in the clipboard
WORD.Range range = tableToUse.Range;
range.Copy();
int rowIndex = 1;
int columnIndex = 1;
// loop over all the items to insert
foreach (ClientListItem parentCaregiver in clients)
{
// check if all the cells in the current row have been used
if (columnIndex > tableToUse.Columns.Count)
{
// if this is the case increment the row index and restart from the first column
columnIndex = 1;
rowIndex++;
// check if all the rows in the current table have been used
if (rowIndex > tableToUse.Columns.Count)
{
// if this is the case create a new table and restart from the first row
rowIndex = 1;
// first go to end of document
selection.EndKey(WORD.WdUnits.wdStory, WORD.WdMovementType.wdMove);
// then add page break
object breakType = WORD.WdBreakType.wdPageBreak;
selection.InsertBreak(ref breakType);
// add a new table (initially with 1 row and one column) at the end of the document
// i.e. on the new page
WORD.Table tableCopy = doc.Tables.Add(selection.Range, 1, 1, ref missing, ref missing);
// paste the original empty table over the new one
tableCopy.Range.Paste();
// makes the copied table the one to use
tableToUse = tableCopy;
}
}
Print("Generating label to add to document.");
//Get label to add to document
var labelToAdd = string.Format("{0} {1},{6}{2},{6} {3}, {4} {5}", parentCaregiver.Parent1LastName, parentCaregiver.Parent1FirstName,
parentCaregiver.Parent1StreetAddress, parentCaregiver.Parent1City, parentCaregiver.Parent1State, parentCaregiver.Parent1Zip, Environment.NewLine);
//Get cell to set value
var tableCell = tableToUse.Cell(rowIndex, columnIndex);
//Set text in cell
tableCell.Range.Text = labelToAdd;
//Middle align text
tableCell.Range.ParagraphFormat.Alignment = WORD.WdParagraphAlignment.wdAlignParagraphCenter;
Print(string.Format("Label added {0} at {1}, {2} position.", labelToAdd, rowIndex, columnIndex));
columnIndex++;
}
}
// Set file name to save
savedFileName = fileName; // string.Format(@"{0}{1}{2}", Path.GetTempPath(), fileName, Path.GetExtension(templateFilePath));
object fname = savedFileName;
Print(string.Format("Saving new document at {0}", savedFileName));
// SaveAs new file
doc.SaveAs(ref fname, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);
Print(string.Format("{0} saved successfully.", savedFileName));
app.Documents.Close(ref missing, ref missing, ref missing);
}
catch (Exception exc)
{
Print("Exception while generating label document");
Print(exc.ToString());
//Set file Name to empty string
savedFileName = string.Empty;
}
finally
{
// Close Word application
app.Quit(ref missing, ref missing, ref missing);
Marshal.ReleaseComObject(app);
app = null;
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
}
//Return saved file name
return savedFileName;
}
答案 1 :(得分:1)
另一种方法是,您可以Add
将模板文件Document
发送到Range.InsertFile
而不是打开它,然后在分页后使用while
插入模板文件每次到达表格的最后一个单元格。我使用private static string FillTemplate(List<ClientListItem> clients, string fileName)
{
//Filled document file name
var savedFileName = string.Empty;
//Search template file in current directory
var templateFilePath = System.AppDomain.CurrentDomain.BaseDirectory + "templateFile.doc";
//#region Generate file for labels
object missing = System.Type.Missing;
// Create Word application
WORD._Application app = new WORD.Application();
try
{
Print("Creating label document.");
// Create new file
//WORD._Document doc = app.Documents.Open(templateFilePath);
// Instead of creating a new file, just add our template to the document
WORD._Document doc = app.Documents.Add(templateFilePath);
//Print("Creating app selection object");
WORD.Selection selection = app.Selection;
//If the template file contains tables
if (selection.Tables.Count > 0)
{
//Use first table
//Table's are accessed with starting index as 1 not 0
var tableToUse = selection.Tables[selection.Tables.Count];
//Counter for number of parent caregivers inserted
var counter = 0;
//Number of parent caregivers
var numberOfParentCaregivers = clients.Count;
//Loop on each row
int rowIndex = 1, columnIndex = 1;
while (counter < numberOfParentCaregivers)
{
if(columnIndex > tableToUse.Columns.Count)
{
// Reset column index if we have reached the last column
columnIndex = 1;
// And go to the next row
rowIndex++;
if(rowIndex > tableToUse.Rows.Count)
{
// Reset row index if we have reached the last row
rowIndex = 1;
// Go the the end of the document, add a page break and insert our empty table template
object startPoint = 0;
WORD.Range range = doc.Range(ref startPoint, ref missing);
range.Collapse(WORD.WdCollapseDirection.wdCollapseEnd);
range.InsertBreak(WORD.WdBreakType.wdSectionBreakNextPage);
range.InsertFile(templateFilePath);
// Assign the new inserted template table to our current table to use
tableToUse = range.Tables[selection.Tables.Count];
}
}
var parentCaregiver = clients[counter];
Print("Generating label to add to document.");
//Get label to add to document
var labelToAdd = string.Format("{0} {1},{6}{2},{6} {3}, {4} {5}", parentCaregiver.Parent1LastName, parentCaregiver.Parent1FirstName,
parentCaregiver.Parent1StreetAddress, parentCaregiver.Parent1City, parentCaregiver.Parent1State, parentCaregiver.Parent1Zip, Environment.NewLine);
//Print(string.Format("Adding label {0} at {1}, {2} position.", labelToAdd, rowIndex, columnIndex));
//Get cell to set value
var tableCell = tableToUse.Cell(rowIndex, columnIndex);
//Set text in cell
tableCell.Range.Text = labelToAdd;
//Middle align text
tableCell.Range.ParagraphFormat.Alignment = WORD.WdParagraphAlignment.wdAlignParagraphCenter;
Print(string.Format("Label added {0} at {1}, {2} position.", labelToAdd, rowIndex, columnIndex));
// Increate items counter and columns counter on each loop
counter++;
columnIndex++;
}
}
// Set file name to save
savedFileName = string.Format(@"{0}{1}{2}", Path.GetTempPath(), fileName, Path.GetExtension(templateFilePath));
object fname = savedFileName;
Print(string.Format("Saving new document at {0}", savedFileName));
// SaveAs new file
doc.SaveAs(ref fname, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);
Print(string.Format("{0} saved successfully.", savedFileName));
app.Documents.Close(ref missing, ref missing, ref missing);
}
catch (Exception exc)
{
Print("Exception while generating label document");
Print(exc.ToString());
//Set file Name to empty string
savedFileName = string.Empty;
}
finally
{
// Close Word application
app.Quit(ref missing, ref missing, ref missing);
Marshal.ReleaseComObject(app);
app = null;
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
}
//Return saved file name
return savedFileName;
}
循环来保持当前流量并使用索引变量枚举项目。
#include <iostream>
#include <vector>
#include <list>
#include <iterator>
using namespace std;
std::list<char> listA = {'1','2','3','4','5'};
std::list<char> listB = {'a','b','c','d','e'};
//listC = a,1,b,2,c,3 etc...
int main()
{
std::list<char> new_list;
for (auto iterator = listA.begin(), end = listA.end(); iterator != end; ++iterator)
{
// get current index
int index = std::distance(listA.begin(), iterator);
// insert item from list a
new_list.push_back(*iterator);
// listb item
auto it = listB.begin();
std::advance(it, index);
new_list.push_back( *it);
}
for (auto n : new_list)
{
std::cout << n << std::endl;
}
return 0;
}