最近需要写数据库的结构说明,那么多表一个个建出来,那么我也快崩溃了,就想到了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;
下面就是创建数据库表结构信息了,先添加表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字体大小的尴尬了。。。
用到的也就这些知识点了,记录留念。