NPOI编辑WORD文档的一些使用心得

最近需要写数据库的结构说明,那么多表一个个建出来,那么我也快崩溃了,就想到了NPOI组件导出到WORD文档中,本来以为会很麻烦,没想到一天时间也就做出来了,在此记录一下使用心得吧。

我使用的是2.1.3版本,并做了一个WORD模板,直接在该文档中替换编辑。

首先是打开模板文件,这里有个注意项是doc文件使用HWPFDocument进行打开,而docx文件需要使用XWPFDocument来打开,如果使用不正确则会报异常:NOPI Wrong Local header signature: 0xE011CFD0。

然后就是替换模板中的关键字了,我使用的是[xxxx]这种格式做为关键字,

遍历XWPFDocument中的Paragraphs中的XWPFRun的Text成员,判断是否包含,并使用XWPFRun的ReplaceText方法进行替换即可,

遍历完最后你会发现如果你的模板中有表格的话,表格里面的文字是没有被替换掉的,那么还需要遍历XWPFDocument中的Tables了,

XWPFTable中还包含Row,Row中包含Cell,Cell中包含XWPFParagraph,然后再替换XWPFParagraph中的XWPFRun中的Text即可。

关键字替换完毕,如果你想设置页边距的话,这里要记录一下,这方面资料不多。。。

	// 设置页边距
 	CT_SectPr sectPr = new CT_SectPr();
 	sectPr.pgMar = new CT_PageMar();
 	sectPr.pgMar.bottom = "1020";
 	sectPr.pgMar.top = "1020";
 	sectPr.pgMar.left = 1077;
 	sectPr.pgMar.right = 1077;
 	mpDoc.Document.body.sectPr = sectPr;

是的,你没有看错,上下边距是用字符串设置的,还有个header跟footer是ulong型,但是设置那个没有用!并且需要新建CT_SectPr,而不是直接去设置body.sectPr,因为默认为null。。。

下面就是创建数据库表结构信息了,先添加表1.1 xxxx这样格式的表格标题

// 向新文档中添加段落
XWPFParagraph tableTitle = aDoc.CreateParagraph();
tableTitle.Alignment = ParagraphAlignment.CENTER;
// 向该段落中添加文字
XWPFRun titleRun = tableTitle.CreateRun();
titleRun.SetText(string.Format("表1.{0} {1}", aCount, aTable.Name));
然后创建表格并填入内容,这方面资料太多了,没啥好说,直接CreateTable即可,

这里记录下几个有用的方法:

设置单元格的背景色,比如15%灰,使用XWPFTableCell.SetColor("D7D7D7");

对了,你没有看错,是SetColor,没有Background,BackColor之类的方法。。。

合并单元格,XWPFTableRow.MergeCells(int startIndex, int endIndex),这个方法一看就明白了。。。

设置列宽XWPFTable.SetColumnWidth(int columnIndex, ulong width),这个width要记录下,他的计量单位很别扭,

经过我深刻研究发现,这个单位与毫米的关系是width = xx毫米*56.7,当然这是个大约值。。。

设置单元格的对齐方式,这个着实困惑了我好久,按理说设置XWPFTableCell.SetVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);

然后设置XWPFParagraph.Alignment与VerticalAlignment就OK了,但是事与愿违,总是在底部对齐,查看生成的文档表格里总是感觉上面多一行,

那么就继续研究研究了,最后得出使用以下代码即可

aCell.SetVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);

XWPFParagraph pIO = aCell.Paragraphs.Count > 0 ? aCell.Paragraphs[0] : aCell.AddParagraph();
pIO.Alignment = aCenter ? ParagraphAlignment.CENTER : ParagraphAlignment.LEFT;
pIO.VerticalAlignment = TextAlignment.CENTER;
			
XWPFRun rIO = pIO.Runs.Count > 0 ? pIO.Runs[0] : pIO.CreateRun();
应该是默认的XWPFTableCell里面已经有XWPFParagraph跟XWPFRun了,就不需要Create了,之前按照网上例子都是要Create的,那样不多一行才怪了。。。

再说说行高问题吧,XWPFTableRow.Height属性即可设置,但还是要乘上56.7。

最后说说设置中文字体问题,因为XWPFRun的FontSize属性是int型。。。设置5号大小字体实际是10.5,这怎么设置,蒙圈了吧。。。。

还好在网上查找到解决办法了,代码

/// 
/// 设置段落字体
/// 
/// 
private void SetFont(XWPFRun aRun)
{
	CT_RPr rpr = aRun.GetCTR().AddNewRPr();
	CT_Fonts rfonts = rpr.AddNewRFonts();
	rfonts.eastAsia = rfonts.ascii = "微软雅黑";
	// 5号字体10.5大小 对应字号*2
	rpr.AddNewSz().val = 21;
	rpr.AddNewSzCs().val = 21;
}
注意的是这里的字号大小是你设置字体大小实际值的两倍,这也就解决了x.5字体大小的尴尬了。。。

用到的也就这些知识点了,记录留念。

你可能感兴趣的:(C#开发,C#,Winform开发)