编程语言
首页 > 编程语言> > Java使用Poi实现导出Word段落以及表格,XWPFParagraph和XWPFRun详解

Java使用Poi实现导出Word段落以及表格,XWPFParagraph和XWPFRun详解

作者:互联网

导出段落

public void exportSummarizeWord(HttpServletResponse response, Integer id) {
        Summarize summarize = baseMapper.selectById(id);
        if (summarize!=null){
            XWPFDocument doc = new XWPFDocument();// 创建Word文件
            selectParagraph(doc, ParagraphAlignment.CENTER,"年度工作总结",true,20,20);
            selectParagraph(doc, ParagraphAlignment.LEFT,"名称:"+summarize.getName(),true,16,20);
            selectParagraph(doc, ParagraphAlignment.LEFT,"主体:"+summarize.getImplement(),true,16,20);
            selectParagraph(doc, ParagraphAlignment.LEFT,"级别:"+summarize.getLevel(),true,16,20);
            selectParagraph(doc, ParagraphAlignment.LEFT,"一、基本运行情况",true,16,20);
            selectParagraph(doc, ParagraphAlignment.LEFT,summarize.getOperation(),false,12,5);
            selectParagraph(doc, ParagraphAlignment.LEFT,"二、科技创新情况",true,16,20);
            selectParagraph(doc, ParagraphAlignment.LEFT,summarize.getScience(),false,12,5);
            selectParagraph(doc, ParagraphAlignment.LEFT,"三、年度主要开展",true,16,20);
            selectParagraph(doc, ParagraphAlignment.LEFT,summarize.getWork(),false,12,5);
            selectParagraph(doc, ParagraphAlignment.LEFT,"四、目前存在的问题和困难",true,16,20);
            selectParagraph(doc, ParagraphAlignment.LEFT,summarize.getProblem(),false,12,5);
            selectParagraph(doc, ParagraphAlignment.LEFT,"五、工作计划",true,16,20);
            selectParagraph(doc, ParagraphAlignment.LEFT,summarize.getPlan(),false,12,5);

            try {
                response.setCharacterEncoding("UTF-8");
                response.setHeader("content-Type", "application/vnd.ms-excel");
                response.setHeader("Content-Disposition",
                        "attachment;filename=" + URLEncoder.encode("年度总结.docx", "UTF-8"));
                //excel导出的路径和名称
                OutputStream out = response.getOutputStream();
                doc.write(out);
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    private static void selectParagraph(XWPFDocument doc,ParagraphAlignment pa,String text,Boolean bold,Integer size,Integer position){
        XWPFParagraph p = null;// 新建一个段落
        XWPFRun r = null;//创建段落文本
        p = doc.createParagraph();
        r = p.createRun();
        //对齐方式
        p.setAlignment(pa);
        //字体对齐方式:1左对齐 2居中3右对齐
        //p.setFontAlignment(2);
        //文本内容
        r.setText(text);
        //是否加粗
        r.setBold(bold);
        //字体大小
        r.setFontSize(size);
        //行间距(我测试的正常文本间距为5,标题间距20)
        r.setTextPosition(position);
    }

导出效果图为
在这里插入图片描述

导出表格:

	XWPFDocument doc = new XWPFDocument();// 创建Word文件
	//创建一个6行8列的表格
	XWPFTable table1 = doc.createTable(6, 8);
    //列宽自适应
    table1.setWidthType(TableWidthType.AUTO);
    // 获取到刚刚插入的行 第一行,下标为0
    XWPFTableRow row1 = table1.getRow(0);
    // 设置单元格内容
    row1.getCell(0).setText("序号");
    row1.getCell(1).setText("指标名称");
    row1.getCell(2).setText("单位");
    row1.getCell(3).setText("数值");
    row1.getCell(4).setText("序号");
    row1.getCell(5).setText("指标名称");
    row1.getCell(6).setText("单位");
    row1.getCell(7).setText("数值");
    XWPFTableRow row2 = table1.getRow(1);
    row2.getCell(0).setText("1");
    row2.getCell(1).setText("核心面积");
    row2.getCell(2).setText("亩");
    row2.getCell(3).setText(garden.getKernel());
    row2.getCell(4).setText("6");
    row2.getCell(5).setText("当年总产值");
    row2.getCell(6).setText("万元");
    row2.getCell(7).setText(garden.getOverallIndustry());
    XWPFTableRow row3 = table1.getRow(2);
    row3.getCell(0).setText("2");
    row3.getCell(1).setText("其中:建设用地");
    row3.getCell(2).setText("亩");
    row3.getCell(3).setText(garden.getConstruction());
    row3.getCell(4).setText("7");
    row3.getCell(5).setText("第一产业产值");
    row3.getCell(6).setText("万元");
    row3.getCell(7).setText(garden.getOneIndustry());
    XWPFTableRow row4 = table1.getRow(3);
    row4.getCell(0).setText("3");
    row4.getCell(1).setText("示范区面积");
    row4.getCell(2).setText("亩");
    row4.getCell(3).setText(garden.getDemonstrate());
    row4.getCell(4).setText("8");
    row4.getCell(5).setText("第二产业产值");
    row4.getCell(6).setText("万元");
    row4.getCell(7).setText(garden.getTwoIndustry());
    XWPFTableRow row5 = table1.getRow(4);
    row5.getCell(0).setText("4");
    row5.getCell(1).setText("辐射区面积");
    row5.getCell(2).setText("亩");
    row5.getCell(3).setText(garden.getRadiation());
    row5.getCell(4).setText("9");
    row5.getCell(5).setText("第三产业产值");
    row5.getCell(6).setText("万元");
    row5.getCell(7).setText(garden.getThreeIndustry());
    XWPFTableRow row6 = table1.getRow(5);
    row6.getCell(0).setText("5");
    row6.getCell(1).setText("核心区从业人员");
    row6.getCell(2).setText("人");
    if (garden.getPractitioner()!=null) {
        row6.getCell(3).setText(garden.getPractitioner().toString());
    }
    doc.setTable(0, table1);

效果图为
在这里插入图片描述

XWPFParagraph对象的属性详解

创建文本对象
XWPFDocument docxDocument = new XWPFDocument();
创建段落对象
XWPFParagraph p1 = docxDocument.createParagraph();
p1.setAlignment(ParagraphAlignment.LEFT);
p1.setBorderBetween(Borders.APPLES);
p1.setBorderBottom(Borders.APPLES);
p1.setBorderLeft(Borders.APPLES);指定应显示在左边页面指定段周围的边界。
p1.setBorderRight(Borders.ARCHED_SCALLOPS);指定应显示在右侧的页面指定段周围的边界。
p1.setBorderTop(Borders.ARCHED_SCALLOPS);指定应显示上方一组有相同的一组段边界设置的段落的边界。这几个是对段落之间的格式的统一,相当于格式刷
p1.setFirstLineIndent(99);//---正文宽度会稍微变窄
p1.setFontAlignment(1);//---段落的对齐方式 1左 2中 3右 4往上 左 不可写0和负数
p1.setIndentationFirstLine(400);//---首行缩进,指定额外的缩进,应适用于父段的第一行。
p1.setIndentationHanging(400);//---首行前进,指定的缩进量,应通过第一行回到开始的文本流的方向上移动缩进从父段的第一行中删除。
p1.setIndentationLeft(400);//---整段缩进(右移)指定应为从左到右段,该段的内容的左边的缘和这一段文字左边的距和右边文本边距和左段权中的那段文本的右边缘之间的缩进,如果省略此属性,则应假定其值为零。
p1.setIndentationRight(400);//---指定应放置这一段,该段的内容从左到右段的右边缘的正确文本边距和右边文本边距和左段权中的那段文本的右边缘之间的缩进,如果省略此属性,则应假定其值为零。
p1.setIndentFromLeft(400);//---整段右移
p1.setIndentFromRight(400);
p1.setNumID(BigInteger.TEN);
p1.setPageBreak(true);//--指定当渲染此分页视图中的文档,这一段的内容都呈现在文档中的新页的开始。
p1.setSpacingAfter(6);//--指定应添加在文档中绝对单位这一段的最后一行之后的间距。
p1.setSpacingAfterLines(6);//--指定应添加在此线单位在文档中的段落的最后一行之后的间距。
p1.setSpacingBefore(6);//--指定应添加上面这一段文档中绝对单位中的第一行的间距。
p1.setSpacingBeforeLines(6);//--指定应添加在此线单位在文档中的段落的第一行之前的间距。
p1.setSpacingLineRule(LineSpacingRule.AT_LEAST);//--指定行之间的间距如何计算存储在行属性中。
p1.setStyle("");//--此方法提供了样式的段落,这非常有用.
p1.setVerticalAlignment(TextAlignment.CENTER);//---指定的文本的垂直对齐方式将应用于此段落中的文本
p1.setWordWrapped(true);//--此元素指定是否消费者应中断超过一行的文本范围,通过打破这个词 (打破人物等级) 的两行或通过移动到下一行 (在词汇层面上打破) 这个词的拉丁文字。

XWPFRun 参数详解

创建文本对象
XWPFDocument docxDocument = new XWPFDocument();
创建段落对象
XWPFParagraph p1 = docxDocument.createParagraph();
XWPFRun r1=p1.createRun();//p1.createRun()将一个新运行追加到这一段
setText(String value)或setText(String value,int pos)
r1.setText(data);
r1.setTextPosition(20);//这个相当于设置行间距的,此元素指定文本应为此运行在关系到周围非定位文本的默认基线升降的量。不是真正意义上的行间距
r1.setStrike(true);//---设置删除线的,坑人!!!
r1.setStrikeThrough(true);//也是设置删除线,可能有细微的区别吧
r1.setEmbossed(true);//变的有重影(变黑了一点)
r1.setDoubleStrikethrough(true);//设置双删除线
r1.setColor("33CC00");//---设置字体颜色
r1.setFontFamily("fantasy");
r1.setFontFamily("cursive");//---设置ASCII(0 - 127)字体样式 
r1.setBold(jiacu);//---"加黑加粗"
r1.setFontSize(size);//---字体大小
r1.setImprinted(true);//感觉与setEmbossed(true)类似,有重影
r1.setItalic(true);//---文本会有倾斜,是一种字体?
r1.setShadow(true);//---文本会变粗有重影,与前面两个有重影效果的方法感觉没什么区别
r1.setSmallCaps(true);//---改变了  英文字母  的格式
r1.setSubscript(VerticalAlign.BASELINE);//---valign垂直对齐的
r1.setUnderline(UnderlinePatterns.DASH);//--填underline type设置下划线
document.createTable(2, 2);//--创建一个制定行列的表
document.enforceReadonlyProtection();//--强制执行制度保护
r1.setDocumentbackground(doc, "FDE9D9");//设置页面背景色
r1.testSetUnderLineStyle(doc);//设置下划线样式以及突出显示文本
r1.addNewPage(doc, BreakType.PAGE);
r1.testSetShdStyle(doc);//设置文字底纹

标签:p1,Java,r1,doc,setText,Poi,getCell,XWPFParagraph,true
来源: https://blog.csdn.net/whatevery/article/details/123589094