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

    xiaoxiao2021-03-25  221

    最近需要写数据库的结构说明,那么多表一个个建出来,那么我也快崩溃了,就想到了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,这怎么设置,蒙圈了吧。。。。

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

    /// <summary> /// 设置段落字体 /// </summary> /// <param name="aRun"></param> 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字体大小的尴尬了。。。

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

    转载请注明原文地址: https://ju.6miu.com/read-489.html

    最新回复(0)