首先导入Nuget包NPOI;
1.使用NPOI生成Word
2.读取word模板填充数据
ps:第一次写,请见谅。本文需要有一定代码基础才能观看,如有不懂,可以提问。其中包含NPOI生成word,根据word模板填充数据,生成复杂的word 表格以及对word 中段落的样式修改
1.使用NPOI生成word
public void main(){
//里面使用的方法都在下面
try
{
string currentDate = DateTime.Now.ToString("yyyyMMdd");
string checkTime = DateTime.Now.ToString("yymmddss");//检查时间
var uploadPath = @"D:\MyCode\Words\Files\";
string workFileName = checkTime + "Test";
string fileName = string.Format("{0}.docx", workFileName, System.Text.Encoding.UTF8);
if (!Directory.Exists(uploadPath))
{
Directory.CreateDirectory(uploadPath);
}
//TODO:使用FileStream文件流来写入数据(传入参数为:文件所在路径,对文件的操作方式,对文件内数据的操作)
//通过使用文件流,创建文件流对象,向文件流中写入内容,并保存为Word文档格式
using (var stream = new FileStream(Path.Combine(uploadPath, fileName), FileMode.Create, FileAccess.Write))
{
//创建document文档对象对象实例
XWPFDocument document = new XWPFDocument();
#region 页脚
document.Document.body.sectPr = new CT_SectPr();
var with = document.Document.body.sectPr.pgSz.w;
//设置为纵向
document.Document.body.sectPr.pgSz.w = document.Document.body.sectPr.pgSz.h;
document.Document.body.sectPr.pgSz.h = with;
//页面边距
document.Document.body.sectPr.pgMar.left = 800;//左边距
document.Document.body.sectPr.pgMar.right = 800;//右边距
document.Document.body.sectPr.pgMar.top = "850";//上边距
document.Document.body.sectPr.pgMar.bottom = "850";//下边距
CT_SectPr m_SectPr = document.Document.body.sectPr;
//创建页脚
CT_Ftr m_ftr = new CT_Ftr();
m_ftr.AddNewP().AddNewR().AddNewT().Value = "Wuxi XDC ADC Contract Proposal";
//创建页脚关系(footern.xml)
XWPFRelation Frelation = XWPFRelation.FOOTER;
XWPFFooter m_f = (XWPFFooter)document.CreateRelationship(Frelation, XWPFFactory.GetInstance(), document.FooterList.Count + 1);
//设置页脚
m_f.SetHeaderFooter(m_ftr);
m_f.SetXWPFDocument(document);
CT_HdrFtrRef m_HdrFtr1 = m_SectPr.AddNewFooterReference();
m_HdrFtr1.type = ST_HdrFtr.@default;
m_HdrFtr1.id = m_f.GetPackageRelationship().Id;
#endregion
/**
*这里我通过设置公共的Word文档中SetParagraph(段落)实例创建和段落样式格式设置,大大减少了代码的冗余,
* 避免每使用一个段落而去创建一次段落实例和设置段落的基本样式
*(如下,ParagraphInstanceSetting为段落实例创建和样式设置,后面索引表示为当前是第几行段落,索引从0开始)
*/
#region 头部
int pos = 1;
//图片标题
document.SetParagraph(ParagraphInsertImg(document), 0);
//文本标题
document.SetParagraph(ParagraphInstanceSetting(document, "", true, 18, "宋体", ParagraphAlignment.CENTER), pos++);
//文本标题
document.SetParagraph(ParagraphInstanceSetting(document, "", true, 18, "宋体", ParagraphAlignment.CENTER), pos++);
//文本标题《项目编号》
document.SetParagraph(ParagraphInstanceSetting(document, $"", true, 18, "宋体", ParagraphAlignment.CENTER), pos++);
//创建文档中的表格对象实例
XWPFTable firstXwpfTable = document.CreateTable(8, 3);//显示的行列数rows:8行,cols:3列
firstXwpfTable.Width = 6000;//总宽度
firstXwpfTable.SetColumnWidth(0, 2000); /* 设置列宽 */
firstXwpfTable.SetColumnWidth(1, 2000); /* 设置列宽 */
firstXwpfTable.SetColumnWidth(2, 2000); /* 设置列宽 */
firstXwpfTable.SetTopBorder(XWPFTable.XWPFBorderType.NIL, 0, 0, "");
firstXwpfTable.SetBottomBorder(XWPFTable.XWPFBorderType.NIL, 0, 0, "");
firstXwpfTable.SetLeftBorder(XWPFTable.XWPFBorderType.NIL, 0, 0, "");
firstXwpfTable.SetRightBorder(XWPFTable.XWPFBorderType.NIL, 0, 0, "");
firstXwpfTable.SetInsideHBorder(XWPFTable.XWPFBorderType.NIL, 0, 0, "");
firstXwpfTable.SetInsideVBorder(XWPFTable.XWPFBorderType.NIL, 0, 0, "");
firstXwpfTable.SetCellMargins(0, 100, 0, 0);
//Table 表格第一行展示...后面的都是一样,只改变GetRow中的行数
firstXwpfTable.GetRow(0).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, " ", ParagraphAlignment.RIGHT, 24, true, 10));
firstXwpfTable.GetRow(0).GetCell(1).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, "委托方:", ParagraphAlignment.RIGHT, 24, true, 10));
firstXwpfTable.GetRow(0).GetCell(2).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, $"{"苏州光明生物制药有限公司"}", ParagraphAlignment.LEFT, 24, false));
//Table 表格第一行展示...后面的都是一样,只改变GetRow中的行数
firstXwpfTable.GetRow(1).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, " ", ParagraphAlignment.RIGHT, 24, true, 10));
firstXwpfTable.GetRow(1).GetCell(1).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, ":", ParagraphAlignment.RIGHT, 24, true, 10));
firstXwpfTable.GetRow(1).GetCell(2).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, $"", ParagraphAlignment.LEFT, 24, false));
//Table 表格第一行展示...后面的都是一样,只改变GetRow中的行数
firstXwpfTable.GetRow(2).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, " ", ParagraphAlignment.RIGHT, 24, true, 10));
firstXwpfTable.GetRow(2).GetCell(1).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, ":", ParagraphAlignment.RIGHT, 24, true, 10));
firstXwpfTable.GetRow(2).GetCell(2).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, $"", ParagraphAlignment.LEFT, 24, false));
//Table 表格第一行展示...后面的都是一样,只改变GetRow中的行数
firstXwpfTable.GetRow(3).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, " ", ParagraphAlignment.RIGHT, 24, true, 10));
firstXwpfTable.GetRow(3).GetCell(1).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, ":", ParagraphAlignment.RIGHT, 24, true, 10));
firstXwpfTable.GetRow(3).GetCell(2).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, $"{""}", ParagraphAlignment.LEFT, 24, false));
//Table 表格第一行展示...后面的都是一样,只改变GetRow中的行数
firstXwpfTable.GetRow(4).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, " ", ParagraphAlignment.RIGHT, 24, true, 10));
firstXwpfTable.GetRow(4).GetCell(1).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, ":", ParagraphAlignment.RIGHT, 24, true, 10));
firstXwpfTable.GetRow(4).GetCell(2).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, $"", ParagraphAlignment.LEFT, 24, false));
//Table 表格第一行展示...后面的都是一样,只改变GetRow中的行数
firstXwpfTable.GetRow(5).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, " ", ParagraphAlignment.RIGHT, 24, true, 10));
firstXwpfTable.GetRow(5).GetCell(1).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, ":", ParagraphAlignment.RIGHT, 24, true, 10));
firstXwpfTable.GetRow(5).GetCell(2).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, $"", ParagraphAlignment.LEFT, 24, false));
//Table 表格第一行展示...后面的都是一样,只改变GetRow中的行数
firstXwpfTable.GetRow(6).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, " ", ParagraphAlignment.RIGHT, 24, true, 10));
firstXwpfTable.GetRow(6).GetCell(1).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, ":", ParagraphAlignment.RIGHT, 24, true, 10));
firstXwpfTable.GetRow(6).GetCell(2).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, $"", ParagraphAlignment.LEFT, 24, false));
//Table 表格第一行展示...后面的都是一样,只改变GetRow中的行数
firstXwpfTable.GetRow(7).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, " ", ParagraphAlignment.RIGHT, 24, true, 10));
firstXwpfTable.GetRow(7).GetCell(1).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, ":", ParagraphAlignment.RIGHT, 24, true, 10));
firstXwpfTable.GetRow(7).GetCell(2).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable, $"", ParagraphAlignment.LEFT, 24, false));
#endregion
#region 内容
//文本
document.SetParagraph(ParagraphInstanceSetting(document, "xxxx.", false, 10, "宋体", ParagraphAlignment.LEFT), pos++);
//下划线标题
document.SetParagraph(ParagraphInstanceSetting(document, $"xxx", true, 12, "宋体", ParagraphAlignment.LEFT, false, "", "000000", false, true), pos++);
//文本
document.SetParagraph(ParagraphInstanceSetting(document, "xxxx", false, 12, "宋体", ParagraphAlignment.LEFT), pos++);
//文本
document.SetParagraph(ParagraphInstanceSetting(document, @"xx", false, 12, "宋体", ParagraphAlignment.LEFT), pos++);
//下划线标题
document.SetParagraph(ParagraphInstanceSetting(document, $"xx", true, 12, "宋体", ParagraphAlignment.LEFT, false, "", "000000", false, true), pos++);
//文本
document.SetParagraph(ParagraphInstanceSetting(document, @"xxx。", false, 12, "宋体", ParagraphAlignment.LEFT), pos++);
//下划线标题
document.SetParagraph(ParagraphInstanceSetting(document, $"", true, 12, "宋体", ParagraphAlignment.LEFT, false, "", "000000", false, false), pos++);
document.SetParagraph(ParagraphInstanceSetting(document, " ", false, 12, "宋体", ParagraphAlignment.LEFT), pos++);
document.SetParagraph(ParagraphInstanceSetting(document, "", false, 12, "宋体", ParagraphAlignment.LEFT), pos++);
document.SetParagraph(ParagraphInstanceSetting(document, " • ", false, 12, "宋体", ParagraphAlignment.LEFT), pos++);
document.SetParagraph(ParagraphInstanceSetting(document, " • ", false, 12, "宋体", ParagraphAlignment.LEFT), pos++);
document.SetParagraph(ParagraphInstanceSetting(document, " • ", false, 12, "宋体", ParagraphAlignment.LEFT), pos++);
document.SetParagraph(ParagraphInstanceSetting(document, " • ", false, 12, "宋体", ParagraphAlignment.LEFT), pos++);
document.SetParagraph(ParagraphInstanceSetting(document, " • (包括液体和冻干制剂)", false, 12, "宋体", ParagraphAlignment.LEFT), pos++);
//下划线标题
document.SetParagraph(ParagraphInstanceSetting(document, $",", true, 12, "宋体", ParagraphAlignment.LEFT, false, "", "000000", false, false), pos++);
document.SetParagraph(ParagraphInstanceSetting(document, $"", true, 12, "宋体", ParagraphAlignment.LEFT, false, "", "000000", false, false), pos++);
document.SetParagraph(ParagraphInstanceSetting(document, @"", false, 12, "宋体", ParagraphAlignment.LEFT), pos++);
document.SetParagraph(ParagraphInstanceSetting(document, $"表格1", true, 12, "宋体", ParagraphAlignment.LEFT, false, "", "000000", false, false), pos++);
#endregion
#region 文档第一个表格对象实例
//创建文档中的表格对象实例
XWPFTable firstXwpfTable1 = document.CreateTable(2, 3);//显示的行列数rows:3行,cols:4列
firstXwpfTable1.Width = 3000;//总宽度
firstXwpfTable1.SetColumnWidth(0, 1000); /* 设置列宽 */
firstXwpfTable1.SetColumnWidth(1, 1000); /* 设置列宽 */
//Table 表格第一行展示...后面的都是一样,只改变GetRow中的行数
firstXwpfTable1.GetRow(0).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable1, " ", ParagraphAlignment.CENTER, 24, true));
firstXwpfTable1.GetRow(0).GetCell(1).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable1, "xxxx", ParagraphAlignment.CENTER, 24, false));
firstXwpfTable1.GetRow(0).GetCell(2).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable1, "xx", ParagraphAlignment.CENTER, 24, true));
//Table 表格第二行
firstXwpfTable1.GetRow(1).GetCell(0).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable1, "xx", ParagraphAlignment.CENTER, 24, true));
firstXwpfTable1.GetRow(1).GetCell(1).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable1, "xx", ParagraphAlignment.CENTER, 24, false));
firstXwpfTable1.GetRow(1).GetCell(2).SetParagraph(SetTableParagraphInstanceSetting(document, firstXwpfTable1, "xx", ParagraphAlignment.CENTER, 24, true));
document.SetParagraph(ParagraphInstanceSetting(document, $"", true, 12, "宋体", ParagraphAlignment.LEFT, false, "", "000000", false, false), pos++);
document.SetParagraph(ParagraphInstanceSetting(document, $"", true, 12, "宋体", ParagraphAlignment.LEFT, false, "", "000000", false, false), pos++);
document.SetParagraph(ParagraphInstanceSetting(document, $"xx", false, 12, "宋体", ParagraphAlignment.LEFT, false, "", "000000", false, false), pos++);
document.SetParagraph(ParagraphInstanceSetting(document, $"", true, 12, "宋体", ParagraphAlignment.LEFT, false, "", "000000", false, false), pos++);
document.SetParagraph(ParagraphInstanceSetting(document, " • xxx", false, 12, "宋体", ParagraphAlignment.LEFT), pos++);
document.SetParagraph(ParagraphInstanceSetting(document, " • x", false, 12, "宋体", ParagraphAlignment.LEFT), pos++);
document.SetParagraph(ParagraphInstanceSetting(document, " • xx ", false, 12, "宋体", ParagraphAlignment.LEFT), pos++);
document.SetParagraph(ParagraphInstanceSetting(document, " • xxx", false, 12, "宋体", ParagraphAlignment.LEFT), pos++);
document.SetParagraph(ParagraphInstanceSetting(document, " • xxx", false, 12, "宋体", ParagraphAlignment.LEFT), pos++);
document.SetParagraph(ParagraphInstanceSetting(document, " • x", false, 12, "宋体", ParagraphAlignment.LEFT), pos++);
document.SetParagraph(ParagraphInstanceSetting(document, " • xx", false, 12, "宋体", ParagraphAlignment.LEFT), pos++);
document.SetParagraph(ParagraphInstanceSetting(document, " • x", false, 12, "宋体", ParagraphAlignment.LEFT), pos++);
document.SetParagraph(ParagraphInstanceSetting(document, $"", true, 12, "宋体", ParagraphAlignment.LEFT, false, "", "000000", false, false), pos++);
document.SetParagraph(ParagraphInstanceSetting(document, $"x", false, 12, "宋体", ParagraphAlignment.LEFT, false, "", "000000", false, false), pos++);
document.SetParagraph(ParagraphInstanceSetting(document, $"", true, 12, "宋体", ParagraphAlignment.LEFT, fal