我在本项目中使用NPOI操作Word文件,分别对Word中段落、表格、页边距、页脚进行了操作。
一、创建一个docx
XWPFDocument doc = new XWPFDocument(stream); // stream是文件流,此处用来读取文件,若要新建则不需要传入文件流
复制代码
二、设置页边距
XWPFDocument m_Docx = new XWPFDocument(); //新建一个docx文件
CT_SectPr sectPr = new CT_SectPr();
sectPr.pgMar = new CT_PageMar();
sectPr.pgMar.bottom = "1442"; // 下
sectPr.pgMar.top = "994"; // 上
sectPr.pgMar.left = 1800; // 左
sectPr.pgMar.right = 1800; // 右
m_Docx.Document.body.sectPr = sectPr; // 设置页边距
复制代码
注:此处上和下是string类型、而左和右则用的int类型。
三、操作表格
操作表格分为两种情况:第一种新建docx文件添加一个新的表格、第二中就是读取已有文件中的表格。我在项目中只用了第二种。
我们先看看表格有哪些属性:
XWPFDocument doc = new XWPFDocument(stream); // 读取一个docx文件
var tables = doc.Tables; // 文件中的所有表格 是一个列表
foreach (var table in tables) // 遍历所有表
{
foreach (var row in table.Rows) // 表中的每一行
{
foreach (var cell in row.GetTableCells()) // 表中的每一格
{
foreach (var para in cell.Paragraphs) // 表中的在格子里的每一个段落
{
// ...
//在这次项目我用了ReplaceText来替换段落中的文字
para.ReplaceText(para.ParagraphText, string.Empty);//第一个参数就原文字,第二个参数就是你想要替换的文字
//修改段落中的样式(字体)
foreach (var parafont in para.Runs)
{
parafont.FontSize = 14 // 设置字体大小 int
parafont.SetFontFamily("宋体", FontCharRange.None);// 设置成宋体 第二个参数是 字体字符范围
/* None = 0,
Ascii = 1,
CS = 2,
EastAsia = 3,
HAnsi = 4
*/
// para.Runs[1].SetText(D2D.ChangeReason);
}
}
}
}
}复制代码
代码中的Runs我不太理解具体的划分规则,我在文件中加了ChangeReason和ChangeType自己定的位。
其中有这么一种情况,我们可以使用已有的一个表格放到一个新建的docx文件中,这样我们就可以把上面编辑好的表格放入新的docx文件中了。
XWPFDocument doc = new XWPFDocument(stream); // 读取一个docx文件
var tables = doc.Tables;
XWPFDocument m_Docx = new XWPFDocument(); //新建一个docx文件
m_Docx.CreateTable(); // 新建一个表格
m_Docx.SetTable(index, tables[index]); // 设置一个表格 包含两个参数 一个是表格的索引,一个是表格的实体
复制代码
注:必须先CreateTable,然后在SetTable并且索引不能超过界限。
四、操作段落
操作段落和表格类似都是可以新建,或是从已有文件中获取。
XWPFDocument m_Docx = new XWPFDocument();//新建一个docx文件
m_Docx.CreateParagraph(); //新建一个段落
p1.Alignment = ParagraphAlignment.CENTER; //居中
XWPFRun runTitle = p1.CreateRun();
runTitle.IsBold = true; //加粗
runTitle.SetText("天津市大学软件学院学生信息采集表");//设置文字
runTitle.FontSize = 22;
runTitle.SetFontFamily("宋体", FontCharRange.None);//宋体
XWPFDocument doc = new XWPFDocument(stream);// 读取一个docx文件
var para=doc.GetParagraphArray(index)// 获取某一个段落
doc.GetParagraphsEnumerator(); // 这个应该是获取文件中所有的段落 当时没有注意到
XWPFDocument m_Docx = new XWPFDocument();//新建一个docx文件
m_Docx.CreateParagraph();
m_Docx.SetParagraph(para, index);//设置段落
复制代码
注:必须先CreateTParagraph,然后在SetParagraph并且索引不能超过界限。
五、操作页脚
操作页脚和表格类似都是可以新建,或是从已有文件中获取。
XWPFDocument m_Docx = new XWPFDocument(); //新建一个docx文件
//创建页脚
CT_Ftr m_ftr = new CT_Ftr();
m_ftr.AddNewP().AddNewR().AddNewT().Value = "fff";//页脚内容
XWPFDocument doc = new XWPFDocument(stream); // 读取一个docx文件
var foot = doc.GetFooterArray(0)._getHdrFtr(); //获取页脚
//创建页脚关系
XWPFRelation Frelation = XWPFRelation.FOOTER;
XWPFFooter m_f = (XWPFFooter)m_Docx.CreateRelationship(Frelation, XWPFFactory.GetInstance(), m_Docx.FooterList.Count + 1);
//设置页脚
m_f.SetHeaderFooter(m_ftr); // 新的
m_f.SetHeaderFooter(foot ); // 读取的
CT_HdrFtrRef m_HdrFtr = m_SectPr.AddNewFooterReference();
m_HdrFtr.type = ST_HdrFtr.@default;
m_HdrFtr.id = m_f.GetPackageRelationship().Id;
复制代码