gpt4 book ai didi

c# - Word 互操作 C# : Insert new page using existing page

转载 作者:太空宇宙 更新时间:2023-11-03 21:06:59 25 4
gpt4 key购买 nike

我有一个 word 模板文件,其中包含一个表格,它有 11 行和 3 列。所以第一页的表格中有 33 个单元格。我用一些数据填充这些单元格,但是如果记录数大于 33(比如 66),我将创建两个文件,每个文件包含 33 条记录。我想创建一个包含所有 66 条记录的文件,一个文件中应该有两页,而不是两个单独的文件。我应该怎么做?

以下是我用来创建一个文档文件的代码。

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;

}

请提出更改建议,以便我可以根据要添加到模板文件中的记录数创建任意数量的页面。

谢谢,尼克尔。

最佳答案

我更改了您的代码,循环遍历要插入表格中的所有项目,而不是循环遍历表格的单元格。在此循环内,列和行的索引递增,当所有单元格都已填充时,将在粘贴原始表格副本的文档末尾插入分页符。此时两个索引都重置为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;

}

关于c# - Word 互操作 C# : Insert new page using existing page,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40677666/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com