环境:net framework 4.5.2
public class WordTool {
/// <summary>
/// 生成会议记录
/// </summary>
/// <param name="date">记录日期时间</param>
/// <param name="markUser">记录人员</param>
/// <param name="address">地点</param>
/// <param name="title">议题</param>
/// <param name="customer">客户人员</param>
/// <param name="dw">均维人员</param>
/// <param name="contentArray">会议记录</param>
public static string Init(string date, string markUser, string address, string title, string customer, string dw, string[] contentArray) {
//路径验证
var currentName = $"File/PreViewWord/{DateTime.Now.ToString("yyyyMMdd-HHssmm")}.docx";
DirectoryInfo dir = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory + "File/PreViewWord");
if (!dir.Exists) dir.Create();
var relativeName = AppDomain.CurrentDomain.BaseDirectory + currentName;
FileInfo file = new FileInfo(relativeName);
if (file.Exists) file.Delete();
using (FileStream fs = new FileStream(relativeName, FileMode.OpenOrCreate)) {
#region 初始化
//1、初始化文档
XWPFDocument m_Doc = new XWPFDocument();
CT_SectPr m_SectPrs = new CT_SectPr(); //设置页面格式(宽度) A4横向
m_SectPrs.pgSz.w = (ulong)11906;
m_SectPrs.pgSz.h = (ulong)16838;
//创建页眉
CT_Hdr m_Hdr = new CT_Hdr();
m_Hdr.AddNewP().AddNewPPr().AddNewSpacing().lineRule = ST_LineSpacingRule.auto;
//页眉内容
m_Hdr.AddNewP().AddNewR().AddNewT().Value = "东莞均维";
XWPFRelation Hrelation = XWPFRelation.HEADER;
XWPFHeader m_h = (XWPFHeader)m_Doc.CreateRelationship(Hrelation, XWPFFactory.GetInstance(),
m_Doc.HeaderList.Count + 1);
m_h.SetHeaderFooter(m_Hdr);
CT_HdrFtrRef m_HdrFtr = m_SectPrs.AddNewHeaderReference();
m_HdrFtr.type = ST_HdrFtr.@default;
m_HdrFtr.id = m_h.GetPackageRelationship().Id;
XWPFParagraph pHeader = m_h.Paragraphs[1];
pHeader.Alignment = ParagraphAlignment.CENTER; //居中
pHeader.Runs[0].FontSize = 7;
//创建页脚
CT_Ftr m_ftr = new CT_Ftr();
m_ftr.AddNewP().AddNewR().AddNewT().Value = (m_Doc.FooterList.Count + 1) + "";
//创建页脚关系(footern.xml)
XWPFRelation Frelation = XWPFRelation.FOOTER;
XWPFFooter m_f = (XWPFFooter)m_Doc.CreateRelationship(Frelation, XWPFFactory.GetInstance(), m_Doc.FooterList.Count + 1);
//设置页脚
m_f.SetHeaderFooter(m_ftr);
CT_HdrFtrRef m_HdrFtr1 = m_SectPrs.AddNewFooterReference();
m_HdrFtr1.type = ST_HdrFtr.@default;
m_HdrFtr1.id = m_f.GetPackageRelationship().Id;
XWPFParagraph pFooter = m_f.Paragraphs[0];
pFooter.Alignment = ParagraphAlignment.CENTER; //居中
pFooter.Runs[0].FontSize = 7;
m_Doc.Document.body.sectPr = m_SectPrs;
#endregion
#region 标题段落
//2、创建主标题段落
XWPFParagraph p1 = m_Doc.CreateParagraph();
p1.Alignment = ParagraphAlignment.LEFT;
XWPFRun row1 = p1.CreateRun();
row1.FontFamily = "黑体";
row1.FontSize = 22;
row1.IsBold = true;
//主标题
row1.SetText("MEETING MINUTES");
CT_P doc_p1 = m_Doc.Document.body.GetPArray(0);
//段落水平居中 标题
doc_p1.AddNewPPr().AddNewJc().val = ST_Jc.center;
#endregion
//空格
XWPFParagraph space1 = m_Doc.CreateParagraph();
space1.Alignment = ParagraphAlignment.CENTER;
XWPFRun spaceRow1 = space1.CreateRun();
#region 纪要详情
//创建表格牵扯到合并表格所以这里一行行创建
XWPFTable table = m_Doc.CreateTable(1, 3);//1⾏3列
table.RemoveRow(0);//去掉第⼀⾏空⽩的
table.Width = 1000 * 5;
table.SetColumnWidth(0, 600);/* 设置列宽 */
table.SetColumnWidth(1, 600);/* 设置列宽 */
table.SetColumnWidth(2, 600);/* 设置列宽 */
//table.SetColumnWidth(1, 1200);
#region 表格第一行
CT_Row nr = new CT_Row();
XWPFTableRow mr = new XWPFTableRow(nr, table);//创建⾏
//设置行高
mr.GetCTRow().AddNewTrPr().AddNewTrHeight().val = (ulong)426;
table.AddRow(mr);//将⾏添加到table中
XWPFTableCell c1 = mr.CreateCell();//创建单元格
CT_Tc ct = c1.GetCTTc();
CT_TcPr cp = ct.AddNewTcPr();
cp.AddNewVMerge().val = ST_Merge.restart;//合并⾏
cp.AddNewVAlign().val = ST_VerticalJc.center;//垂直
ct.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.left;
//ct.GetPList()[0].AddNewR().AddNewT().Value = "日期:2022-05-26";
ct.RemoveP(0);
XWPFParagraph par = c1.AddParagraph();
//首行缩进
//par.IndentationFirstLine = Indentation("宋体", 8, 2, FontStyle.Regular);
XWPFRun run = par.CreateRun();
run.FontFamily = "宋体";
run.IsBold = true;
run.FontSize = 8;
run.SetText(" 日期:" + date);
c1 = mr.CreateCell();//创建单元格
ct = c1.GetCTTc();
cp = ct.AddNewTcPr();
cp.AddNewVMerge().val = ST_Merge.restart;//合并⾏
cp.AddNewVAlign().val = ST_VerticalJc.center;//垂直
ct.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.left;
//ct.GetPList()[0].AddNewR().AddNewT().Value = "记录人:梁非凡";
//移除标题
ct.RemoveP(0);
par = c1.AddParagraph();
run = par.CreateRun();
run.FontFamily = "宋体";
run.FontSize = 8;
run.IsBold = true;
run.SetText(" 记录人:" + markUser);
c1 = mr.CreateCell();//创建单元格
ct = c1.GetCTTc();
cp = ct.AddNewTcPr();
cp.AddNewVMerge().val = ST_Merge.restart;//合并⾏
cp.AddNewVAlign().val = ST_VerticalJc.center;//垂直
ct.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.left;
//ct.GetPList()[0].AddNewR().AddNewT().Value = "地点:均维";
//移除标题
ct.RemoveP(0);
par = c1.AddParagraph();
run = par.CreateRun();
run.FontFamily = "宋体";
run.IsBold = true;
run.FontSize = 8;
run.SetText(" 地点:" + address);
#endregion
#region 表格第二行
// 2行
nr = new CT_Row();
mr = new XWPFTableRow(nr, table);
mr.GetCTRow().AddNewTrPr().AddNewTrHeight().val = (ulong)426;
table.AddRow(mr);
c1 = mr.CreateCell();//创建单元格
ct = c1.GetCTTc();
cp = ct.AddNewTcPr();
cp.gridSpan = new CT_DecimalNumber();
cp.gridSpan.val = "3"; //合并 3列
cp.AddNewVMerge().val = ST_Merge.restart;//合并⾏
ct.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.left;//文字左对齐
cp.AddNewVAlign().val = ST_VerticalJc.center;//文字垂直
//移除标题
ct.RemoveP(0);
//使用中转方法
par = c1.AddParagraph();
//首行缩进
//par.IndentationFirstLine = Indentation("宋体", 8, 2, FontStyle.Regular);
run = par.CreateRun();
run.FontFamily = "黑体";
run.IsBold = true;
run.FontSize = 9;
run.SetText(" 标题:" + title);
//run.AddBreak();
#endregion
#region 表格第三行
// 3⾏,多⾏合并类似
nr = new CT_Row();
mr = new XWPFTableRow(nr, table);
mr.GetCTRow().AddNewTrPr().AddNewTrHeight().val = (ulong)800;
table.AddRow(mr);
c1 = mr.CreateCell();//创建单元格
ct = c1.GetCTTc();
cp = ct.AddNewTcPr();
cp.gridSpan = new CT_DecimalNumber();
cp.gridSpan.val = "3"; //合并 3列
ct.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.left;
cp.AddNewVAlign().val = ST_VerticalJc.center;//垂直
ct.RemoveP(0);
//这里标题就不设置了
//ct.GetPList()[0].AddNewR().AddNewT().Value = @"议题:";
//标题
par = c1.AddParagraph();
//首行缩进
par.IndentationFirstLine = Indentation("黑体", 8, 2, FontStyle.Regular);
run = par.CreateRun();
run.FontFamily = "黑体";
run.IsBold = true;
run.FontSize = 8;
run.SetText("与会人员:");
//run.AddBreak();
//run.AddCarriageReturn(); //换行会多出一行配合addbreak()使用
par = c1.AddParagraph();
//首行缩进
par.IndentationFirstLine = Indentation("宋体", 8, 2, FontStyle.Regular);
run = par.CreateRun();
run.FontFamily = "宋体";
run.IsBold = false;
run.FontSize = 8;
run.SetText("客户:" + customer);
//run.AddBreak();
//run.AddCarriageReturn();
par = c1.AddParagraph();
//首行缩进
par.IndentationFirstLine = Indentation("宋体", 8, 2, FontStyle.Regular);
run = par.CreateRun();
run.FontFamily = "宋体";
run.IsBold = false;
run.FontSize = 8;
run.SetText("均维:" + dw);
#endregion
#endregion
//创建空行
space1 = m_Doc.CreateParagraph();
space1.Alignment = ParagraphAlignment.CENTER;
spaceRow1 = space1.CreateRun();
//创建空行
space1 = m_Doc.CreateParagraph();
space1.Alignment = ParagraphAlignment.CENTER;
spaceRow1 = space1.CreateRun();
#region 会议纪要
//创建表格
table = m_Doc.CreateTable(1, 1);//1⾏3列
table.RemoveRow(0);//去掉第⼀⾏空⽩的
table.Width = 1000 * 5;
table.SetColumnWidth(0, 1800);/* 设置列宽 */
#region 标题
nr = new CT_Row();
mr = new XWPFTableRow(nr, table);//创建⾏
mr.GetCTRow().AddNewTrPr().AddNewTrHeight().val = (ulong)426;
table.AddRow(mr);//将⾏添加到table中
c1 = mr.CreateCell();//创建单元格
ct = c1.GetCTTc();
cp = ct.AddNewTcPr();
cp.AddNewVMerge().val = ST_Merge.restart;//合并⾏
cp.AddNewVAlign().val = ST_VerticalJc.center;//垂直
ct.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.left;
ct.RemoveP(0);
mr.GetCell(0).SetColor("#EEEEEE");
par = mr.GetCell(0).AddParagraph();
run = par.CreateRun();
run.FontFamily = "宋体";
run.FontSize = 8;
run.IsBold = true;
run.SetText("会议记录");
#endregion
#region 内容
nr = new CT_Row();
mr = new XWPFTableRow(nr, table);//创建⾏
table.AddRow(mr);//将⾏添加到table中
c1 = mr.CreateCell();//创建单元格
ct = c1.GetCTTc();
cp = ct.AddNewTcPr();
cp.AddNewVMerge().val = ST_Merge.restart;//合并⾏
cp.AddNewVAlign().val = ST_VerticalJc.center;//垂直
ct.GetPList()[0].AddNewPPr().AddNewJc().val = ST_Jc.left;
ct.RemoveP(0);
foreach (var item in contentArray) {
par = mr.GetCell(0).AddParagraph();
par.IndentationFirstLine = Indentation("宋体", 7, 2, FontStyle.Regular);
par.SpacingBeforeLines = 20;
par.SpacingBeforeLines = 20;
par.FirstLineIndent = 20;
run = par.CreateRun();
run.FontFamily = "宋体";
run.FontSize = 7;
run.IsBold = true;
run.SetText(item);
run.AddBreak();
//run.AddCarriageReturn();
}
#endregion
#endregion
//5、写入到文件
m_Doc.Write(fs);
}
return currentName;
}
//设置字体样式
public XWPFParagraph SetCellText(XWPFDocument doc, XWPFTable table, string setText) {
//table中的⽂字格式设置
CT_P para = new CT_P();
XWPFParagraph pCell = new XWPFParagraph(para, table.Body);
pCell.Alignment = ParagraphAlignment.CENTER;//字体居中
pCell.VerticalAlignment = TextAlignment.CENTER;//字体居中
XWPFRun r1c1 = pCell.CreateRun();
r1c1.SetText(setText);
r1c1.FontSize = 12;
r1c1.FontFamily = "华⽂楷体";
//r1c1.SetTextPosition(20);//设置⾼度
return pCell;
}
protected static int Indentation(String fontname, int fontsize, int Indentationfonts, FontStyle fs) {
//字显示宽度,用于段首行缩进
//字号与fontsize关系
//初号(0号)=84,小初=72,1号=52,2号=44,小2=36,3号=32,小3=30,4号=28,
//小4=24,5号=21,小5=18,6号=15,小6=13,7号=11,8号=10
Bitmap bmp = new Bitmap(1000, 800);
Graphics m_tmpGr = Graphics.FromImage(bmp);
m_tmpGr.PageUnit = GraphicsUnit.Point;
SizeF size = m_tmpGr.MeasureString("好", new Font(fontname, fontsize * 0.75F, fs));
return (int)size.Width * Indentationfonts * 10;
}
}