Java导出word,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);//设置文字底纹

生成目录

添加pom.xml

<repository>
   <id>com.e-iceblue</id>
     <name>e-iceblue</name>
     <url>https://repo.e-iceblue.cn/repository/maven-public/</url>
 </repository>
 <!--操作 WordExcelPDF 或者其他多种文件格式-->
 <dependency>
      <groupId>e-iceblue</groupId>
      <artifactId>spire.office.free</artifactId>
      <version>5.3.1</version>
  </dependency>

Java 给现有 Word 文档添加目录

生成折线图、柱状图、饼状图

pom.xml添加:

<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi-ooxml</artifactId>
	<version>4.1.2</version>
</dependency>
<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi-ooxml-schemas</artifactId>
	<version>4.1.2</version>
</dependency>
<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi</artifactId>
	<version>4.1.2</version>
</dependency>
<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi-scratchpad</artifactId>
	<version>4.1.2</version>
</dependency>
<dependency>
	<groupId>org.apache.xmlbeans</groupId>
	<artifactId>xmlbeans</artifactId>
	<version>3.1.0</version>
</dependency>
<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>ooxml-schemas</artifactId>
	<version>1.4</version>
</dependency>

折线图:
折线图主要有X轴,Y轴,图表,图例,数据集等相关设置。使用POI生成图表到word文档中,具体步骤如下:

  1. 创建word文档的XWPFDocument对象
  2. 创建chart图表的XWPFChart对象
  3. 创建X轴(分类轴)的XDDFCategoryAxis对象
  4. 创建Y轴(值轴)的XDDFValueAxis对象
  5. 创建折线图的XDDFLineChartData对象
  6. addSeries加载数据集
  7. 使用plot绘制折线图
  8. 输出到word文档
  9. 关闭流对象
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.util.Units;
import org.apache.poi.xddf.usermodel.chart.*;
import org.apache.poi.xwpf.usermodel.XWPFChart;
import org.apache.poi.xwpf.usermodel.XWPFDocument;

import java.io.FileOutputStream;
import java.io.IOException;

public class LineChart {
    
    

    public static void main(String[] args) throws Exception {
    
    
        // 1、创建word文档对象
        XWPFDocument document = new XWPFDocument();
        // 2、创建chart图表对象,抛出异常
        XWPFChart chart = document.createChart(15 * Units.EMU_PER_CENTIMETER, 10 * Units.EMU_PER_CENTIMETER);
        // 3、图表相关设置
        chart.setTitleText("使用POI创建的折线图"); // 图表标题
        chart.setTitleOverlay(false); // 图例是否覆盖标题

        // 4、图例设置
        XDDFChartLegend legend = chart.getOrAddLegend();
        legend.setPosition(LegendPosition.TOP); // 图例位置:上下左右

        // 5、X轴(分类轴)相关设置
        XDDFCategoryAxis xAxis = chart.createCategoryAxis(AxisPosition.BOTTOM); // 创建X轴,并且指定位置
        xAxis.setTitle("日期(年月)"); // x轴标题
        String[] xAxisData = new String[] {
    
    
                "2021-01","2021-02","2021-03","2021-04","2021-05","2021-06",
                "2021-07","2021-08","2021-09","2021-10","2021-11","2021-12",
        };
        XDDFCategoryDataSource xAxisSource = XDDFDataSourcesFactory.fromArray(xAxisData); // 设置X轴数据

        // 6、Y轴(值轴)相关设置
        XDDFValueAxis yAxis = chart.createValueAxis(AxisPosition.LEFT); // 创建Y轴,指定位置
        yAxis.setTitle("粉丝数(个)"); // Y轴标题
        Integer[] yAxisData = new Integer[]{
    
    
                10, 35, 21, 46, 79, 88,
                39, 102, 71, 28, 99, 57
        };
        XDDFNumericalDataSource<Integer> yAxisSource = XDDFDataSourcesFactory.fromArray(yAxisData); // 设置Y轴数据

        // 7、创建折线图对象
        XDDFLineChartData lineChart = (XDDFLineChartData) chart.createData(ChartTypes.LINE, xAxis, yAxis);

        // 8、加载折线图数据集
        XDDFLineChartData.Series lineSeries = (XDDFLineChartData.Series) lineChart.addSeries(xAxisSource, yAxisSource);
        lineSeries.setTitle("粉丝数", null); // 图例标题
        lineSeries.setSmooth(true); // 线条样式:true平滑曲线,false折线
        lineSeries.setMarkerSize((short) 6); // 标记点大小
        lineSeries.setMarkerStyle(MarkerStyle.CIRCLE); // 标记点样式

        // 9、绘制折线图
        chart.plot(lineChart);

        // 10、输出到word文档
        FileOutputStream fos = new FileOutputStream("H:\\poi\\lineChart.docx");
        document.write(fos); // 导出word

        // 11、关闭流
        fos.close();
        document.close();
    }
}

柱状图:
柱状图主要有X轴,Y轴,图表,图例,数据集等相关设置,具体实现代码如下所示:

import org.apache.poi.util.Units;
import org.apache.poi.xddf.usermodel.chart.*;
import org.apache.poi.xwpf.usermodel.XWPFChart;
import org.apache.poi.xwpf.usermodel.XWPFDocument;

import java.io.FileOutputStream;

public class BarChart {
    
    
    public static void main(String[] args) throws Exception {
    
    
        // 1、创建word文档对象
        XWPFDocument document = new XWPFDocument();
        // 2、创建chart图表对象,抛出异常
        XWPFChart chart = document.createChart(15 * Units.EMU_PER_CENTIMETER, 10 * Units.EMU_PER_CENTIMETER);

        // 3、图表相关设置
        chart.setTitleText("使用POI创建的柱状图"); // 图表标题
        chart.setTitleOverlay(false); // 图例是否覆盖标题

        // 4、图例设置
        XDDFChartLegend legend = chart.getOrAddLegend();
        legend.setPosition(LegendPosition.TOP); // 图例位置:上下左右

        // 5、X轴(分类轴)相关设置
        XDDFCategoryAxis xAxis = chart.createCategoryAxis(AxisPosition.BOTTOM); // 创建X轴,并且指定位置
        xAxis.setTitle("日期(年月)"); // x轴标题
        String[] xAxisData = new String[] {
    
    
                "2021-01","2021-02","2021-03","2021-04","2021-05","2021-06",
                "2021-07","2021-08","2021-09","2021-10","2021-11","2021-12",
        };
        XDDFCategoryDataSource xAxisSource = XDDFDataSourcesFactory.fromArray(xAxisData); // 设置X轴数据

        // 6、Y轴(值轴)相关设置
        XDDFValueAxis yAxis = chart.createValueAxis(AxisPosition.LEFT); // 创建Y轴,指定位置
        yAxis.setTitle("粉丝数(个)"); // Y轴标题
        yAxis.setCrossBetween(AxisCrossBetween.BETWEEN); // 设置图柱的位置:BETWEEN居中
        Integer[] yAxisData = new Integer[]{
    
    
                10, 35, 21, 46, 79, 88,
                39, 102, 71, 28, 99, 57
        };
        XDDFNumericalDataSource<Integer> yAxisSource = XDDFDataSourcesFactory.fromArray(yAxisData); // 设置Y轴数据

        // 7、创建柱状图对象
        XDDFBarChartData barChart = (XDDFBarChartData) chart.createData(ChartTypes.BAR, xAxis, yAxis);
        barChart.setBarDirection(BarDirection.COL); // 设置柱状图的方向:BAR横向,COL竖向,默认是BAR

        // 8、加载柱状图数据集
        XDDFBarChartData.Series barSeries = (XDDFBarChartData.Series) barChart.addSeries(xAxisSource, yAxisSource);
        barSeries.setTitle("粉丝数", null); // 图例标题

        // 9、绘制柱状图
        chart.plot(barChart);

        // 10、输出到word文档
        FileOutputStream fos = new FileOutputStream("H:\\poi\\barChart.docx");
        document.write(fos); // 导出word

        // 11、关闭流
        fos.close();
        document.close();
    }
}

饼状图:
饼状图主要是图表,图例,数据集等相关设置,具体实现代码如下所示:

import org.apache.poi.util.Units;
import org.apache.poi.xddf.usermodel.chart.*;
import org.apache.poi.xwpf.usermodel.XWPFChart;
import org.apache.poi.xwpf.usermodel.XWPFDocument;

import java.io.FileOutputStream;

/**
 * @version 1.0.0
 * @Description: poi生成饼图
 * @Date: 2021/12/25 20:04
 * @Copyright (C) ZhuYouBin
 */
public class PieChart {
    
    
    public static void main(String[] args) throws Exception {
    
    
        // 1、创建word文档对象
        XWPFDocument document = new XWPFDocument();
        // 2、创建chart图表对象,抛出异常
        XWPFChart chart = document.createChart(15 * Units.EMU_PER_CENTIMETER, 10 * Units.EMU_PER_CENTIMETER);

        // 3、图表相关设置
        chart.setTitleText("使用POI创建的饼图"); // 图表标题
        chart.setTitleOverlay(false); // 图例是否覆盖标题

        // 4、图例设置
        XDDFChartLegend legend = chart.getOrAddLegend();
        legend.setPosition(LegendPosition.TOP); // 图例位置:上下左右

        // 5、X轴(分类轴)相关设置:饼图中的图例显示
        String[] xAxisData = new String[] {
    
    
                "2021-01","2021-02","2021-03","2021-04","2021-05","2021-06",
                "2021-07","2021-08","2021-09","2021-10","2021-11","2021-12",
        };
        XDDFCategoryDataSource xAxisSource = XDDFDataSourcesFactory.fromArray(xAxisData); // 设置分类数据

        // 6、Y轴(值轴)相关设置:饼图中的圆形显示
        Integer[] yAxisData = new Integer[]{
    
    
                10, 35, 21, 46, 79, 88,
                39, 102, 71, 28, 99, 57
        };
        XDDFNumericalDataSource<Integer> yAxisSource = XDDFDataSourcesFactory.fromArray(yAxisData); // 设置值数据

        // 7、创建饼图对象,饼状图不需要X,Y轴,只需要数据集即可
        XDDFPieChartData pieChart = (XDDFPieChartData) chart.createData(ChartTypes.PIE, null, null);

        // 8、加载饼图数据集
        XDDFPieChartData.Series pieSeries = (XDDFPieChartData.Series) pieChart.addSeries(xAxisSource, yAxisSource);
        pieSeries.setTitle("粉丝数", null); // 系列提示标题

        // 9、绘制饼图
        chart.plot(pieChart);

        // 10、输出到word文档
        FileOutputStream fos = new FileOutputStream("H:\\poi\\pieChart.docx");
        document.write(fos); // 导出word

        // 11、关闭流
        fos.close();
        document.close();
    }
}

生成折线图、柱状图、饼状图原文链接:https://blog.csdn.net/u014641168/article/details/125338018

散点图

public void createScatterChart(XWPFChart chart, ScatterChartForm scatterChartForm) {
    
    
        // 标题
        chart.setTitleText(scatterChartForm.getTitle());
        //标题覆盖
        chart.setTitleOverlay(false);
        //图例位置
        XDDFChartLegend legend = chart.getOrAddLegend();
        legend.setPosition(LegendPosition.TOP);
        //分类轴标(X轴),标题位置
        XDDFCategoryAxis bottomAxis = chart.createCategoryAxis(AxisPosition.BOTTOM);
        bottomAxis.setTitle(scatterChartForm.getBottomTitle());
        //值(Y轴)轴,标题位置
        XDDFValueAxis leftAxis = chart.createValueAxis(AxisPosition.LEFT);
        leftAxis.setTitle(scatterChartForm.getLeftTitle());
        XDDFScatterChartData data = null;
        for (int i = 0; i < scatterChartForm.getLists().size(); i++) {
    
    
            // 处理数据
            XDDFNumericalDataSource bottomDataSource = XDDFDataSourcesFactory.fromArray(scatterChartForm.getLists().get(i).getBottomData());
            XDDFNumericalDataSource<Integer> leftDataSource = XDDFDataSourcesFactory.fromArray(scatterChartForm.getLists().get(i).getLeftData());
            // 生成数据
            if (data == null) {
    
    
                data = (XDDFScatterChartData) chart.createData(ChartTypes.SCATTER, bottomAxis, leftAxis);
                // 是否自动生成颜色
                data.setVaryColors(false);
            }

            //图表加载数据,折线1
            XDDFScatterChartData.Series series = (XDDFScatterChartData.Series) data.addSeries(bottomDataSource, leftDataSource);
            //设置标记样式
            series.setMarkerStyle(scatterChartForm.getStyle());
            series.setMarkerSize(scatterChartForm.getMarkerSize());
            // 设置系列标题
            series.setTitle(scatterChartForm.getLists().get(i).getTitle(), null);
            // 去除连接线
            chart.getCTChart().getPlotArea().getScatterChartArray(0).getSerArray(i).addNewSpPr().addNewLn().addNewNoFill();
            if (scatterChartForm.getLists().get(i).getXddfColor() != null) {
    
    
                // 创建一个设置对象
                XDDFSolidFillProperties fillMarker = new XDDFSolidFillProperties(scatterChartForm.getLists().get(i).getXddfColor());
                XDDFShapeProperties propertiesMarker = new XDDFShapeProperties();
                // 给对象填充颜色属性
                propertiesMarker.setFillProperties(fillMarker);
                // 修改系列颜色
                chart.getCTChart().getPlotArea().getScatterChartArray(0).getSerArray(i).getMarker()
                        .addNewSpPr().set(propertiesMarker.getXmlObject());
            }
        }
        //绘制
        chart.plot(data);
    }

并列柱状图

/**
     * 并列柱状图显示
     * @throws Exception
     */
    @Test
    public void JFreeChart4() throws Exception{
    
    
        //绘制柱形图
        // 1、创建word文档对象
        XWPFDocument doc = new XWPFDocument();
        // 2、创建chart图表对象,抛出异常
        XWPFChart chart = doc.createChart(15 * Units.EMU_PER_CENTIMETER, 10 * Units.EMU_PER_CENTIMETER);

        // 3、图表相关设置
//        chart.setTitleText("使用POI创建的柱状图"); // 图表标题
        chart.setTitleText("");
//        chart.setTitleOverlay(false); // 图例是否覆盖标题

        // 4、图例设置
        XDDFChartLegend legend = chart.getOrAddLegend();

//        legend.setPosition(LegendPosition.TOP); // 图例位置:上下左右

        // 5、X轴(分类轴)相关设置
        XDDFCategoryAxis xAxis = chart.createCategoryAxis(AxisPosition.BOTTOM); // 创建X轴,并且指定位置
//        xAxis.setTitle("日期(年月)"); // x轴标题
        String[] xAxisData = new String[] {
    
    
                "创新投入","创新绩效","创新环境","创新潜力",
        };
        XDDFCategoryDataSource xAxisSource = XDDFDataSourcesFactory.fromArray(xAxisData); // 设置X轴数据

        // 6、Y轴(值轴)相关设置
        XDDFValueAxis yAxis = chart.createValueAxis(AxisPosition.LEFT); // 创建Y轴,指定位置
//        yAxis.setTitle("粉丝数(个)"); // Y轴标题
        yAxis.setCrossBetween(AxisCrossBetween.BETWEEN); // 设置图柱的位置:BETWEEN居中

        Integer[] yAxisData = new Integer[]{
    
    
                10, 35, 21, 43
        };

        Integer[] yAxisData1 = new Integer[]{
    
    
                11, 40, 22, 46
        };

        Integer[] yAxisData2 = new Integer[]{
    
    
                15, 24, 34, 2
        };
        XDDFNumericalDataSource<Integer> yAxisSource = XDDFDataSourcesFactory.fromArray(yAxisData); // 设置Y轴数据
        XDDFNumericalDataSource<Integer> yAxisSource1 = XDDFDataSourcesFactory.fromArray(yAxisData1); // 设置Y轴数据
        XDDFNumericalDataSource<Integer> yAxisSource2 = XDDFDataSourcesFactory.fromArray(yAxisData2); // 设置Y轴数据
        // 7、创建柱状图对象
        XDDFBarChartData barChart = (XDDFBarChartData) chart.createData(ChartTypes.BAR, xAxis, yAxis);
        barChart.setBarDirection(BarDirection.COL); // 设置柱状图的方向:BAR横向,COL竖向,默认是BAR
//        barChart.setVaryColors(true);   //设置可变颜色

        // 8、加载柱状图数据集
        XDDFBarChartData.Series barSeries = (XDDFBarChartData.Series) barChart.addSeries(xAxisSource, yAxisSource);
        XDDFBarChartData.Series barSeries1 = (XDDFBarChartData.Series) barChart.addSeries(xAxisSource, yAxisSource1);
        XDDFBarChartData.Series barSeries2 = (XDDFBarChartData.Series) barChart.addSeries(xAxisSource, yAxisSource2);
        barSeries.setTitle("平均值", null); // 图例标题
        barSeries1.setTitle("最大值", null); // 图例标题
        barSeries2.setTitle("最小值", null); // 图例标题

        // 9、绘制柱状图
        chart.plot(barChart);

        CTPlotArea plotArea = chart.getCTChart().getPlotArea();
        //柱状图1上显示数值
        plotArea.getBarChartArray(0).getSerArray(0).addNewDLbls();
        plotArea.getBarChartArray(0).getSerArray(0).getDLbls().addNewShowVal().setVal(true);
        plotArea.getBarChartArray(0).getSerArray(0).getDLbls().addNewShowLegendKey().setVal(false);
        plotArea.getBarChartArray(0).getSerArray(0).getDLbls().addNewShowCatName().setVal(false);
        plotArea.getBarChartArray(0).getSerArray(0).getDLbls().addNewShowSerName().setVal(false);

        //柱状图2上显示数值
        plotArea.getBarChartArray(0).getSerArray(1).addNewDLbls();
        plotArea.getBarChartArray(0).getSerArray(1).getDLbls().addNewShowVal().setVal(true);
        plotArea.getBarChartArray(0).getSerArray(1).getDLbls().addNewShowLegendKey().setVal(false);
        plotArea.getBarChartArray(0).getSerArray(1).getDLbls().addNewShowCatName().setVal(false);
        plotArea.getBarChartArray(0).getSerArray(1).getDLbls().addNewShowSerName().setVal(false);

        //柱状图3上显示数值
        plotArea.getBarChartArray(0).getSerArray(2).addNewDLbls();
        plotArea.getBarChartArray(0).getSerArray(2).getDLbls().addNewShowVal().setVal(true);
        plotArea.getBarChartArray(0).getSerArray(2).getDLbls().addNewShowLegendKey().setVal(false);
        plotArea.getBarChartArray(0).getSerArray(2).getDLbls().addNewShowCatName().setVal(false);
        plotArea.getBarChartArray(0).getSerArray(2).getDLbls().addNewShowSerName().setVal(false);

        // 10、输出到word文档
        FileOutputStream fos = new FileOutputStream("F:\\li\\4.doc");
        doc.write(fos); // 导出word

        // 11、关闭流
        fos.close();
        doc.close();
    }

堆叠柱状图

    @Test
    public void JFreeChart5() throws Exception{
    
    
        //绘制柱形图
        // 1、创建word文档对象
        XWPFDocument doc = new XWPFDocument();
        // 2、创建chart图表对象,抛出异常
        XWPFChart chart = doc.createChart(15 * Units.EMU_PER_CENTIMETER, 10 * Units.EMU_PER_CENTIMETER);

        // 3、图表相关设置
//        chart.setTitleText("使用POI创建的柱状图"); // 图表标题
        chart.setTitleText("");
//        chart.setTitleOverlay(false); // 图例是否覆盖标题

        // 4、图例设置
        XDDFChartLegend legend = chart.getOrAddLegend();

//        legend.setPosition(LegendPosition.TOP); // 图例位置:上下左右

        // 5、X轴(分类轴)相关设置
        XDDFCategoryAxis xAxis = chart.createCategoryAxis(AxisPosition.BOTTOM); // 创建X轴,并且指定位置
//        xAxis.setTitle("日期(年月)"); // x轴标题
        String[] xAxisData = new String[] {
    
    
                "2021-01","2021-02","2021-03","2021-04","2021-05","2021-06",
                "2021-07","2021-08","2021-09","2021-10","2021-11","2021-12",
        };
        XDDFCategoryDataSource xAxisSource = XDDFDataSourcesFactory.fromArray(xAxisData); // 设置X轴数据

        // 6、Y轴(值轴)相关设置
        XDDFValueAxis yAxis = chart.createValueAxis(AxisPosition.LEFT); // 创建Y轴,指定位置
//        yAxis.setTitle("粉丝数(个)"); // Y轴标题
        yAxis.setCrossBetween(AxisCrossBetween.BETWEEN); // 设置图柱的位置:BETWEEN居中

        Integer[] yAxisData = new Integer[]{
    
    
                10, 35, 21, 46, 79, 88,
                39, 102, 71, 28, 99, 57
        };

        XDDFNumericalDataSource<Integer> yAxisSource = XDDFDataSourcesFactory.fromArray(yAxisData); // 设置Y轴数据
        // 7、创建柱状图对象
        XDDFBarChartData barChart = (XDDFBarChartData) chart.createData(ChartTypes.BAR, xAxis, yAxis);
        barChart.setBarDirection(BarDirection.COL); // 设置柱状图的方向:BAR横向,COL竖向,默认是BAR
//        barChart.setVaryColors(true);   //设置可变颜色

        // 8、加载柱状图数据集
        XDDFBarChartData.Series barSeries = (XDDFBarChartData.Series) barChart.addSeries(xAxisSource, yAxisSource);
//        barSeries.setTitle("",null);
//        barSeries.setTitle("粉丝数", null); // 图例标题

        // 9、绘制柱状图
        chart.plot(barChart);
        Integer[] yAxisData1 = new Integer[]{
    
    
                25, 32, 12, 45, 45, 32,
                39, 102, 71, 28, 99, 89
        };
        XDDFCategoryDataSource xAxisSource1 = XDDFDataSourcesFactory.fromArray(xAxisData); // 设置X轴数据
        XDDFNumericalDataSource<Integer> yAxisSource1 = XDDFDataSourcesFactory.fromArray(yAxisData1); // 设置Y轴数据
        // 7、创建柱状图对象
        XDDFBarChartData barChart1 = (XDDFBarChartData) chart.createData(ChartTypes.BAR, xAxis, yAxis);
        barChart1.setBarDirection(BarDirection.COL); // 设置柱状图的方向:BAR横向,COL竖向,默认是BAR
//        barChart.setVaryColors(true);   //设置可变颜色

        // 8、加载柱状图数据集
        XDDFBarChartData.Series barSeries1 = (XDDFBarChartData.Series) barChart1.addSeries(xAxisSource1, yAxisSource1);
//        barSeries.setTitle("",null);
//        barSeries.setTitle("粉丝数", null); // 图例标题

        // 9、绘制柱状图
        chart.plot(barChart1);
        // 10、输出到word文档
        FileOutputStream fos = new FileOutputStream("F:\\li\\5.doc");
        doc.write(fos); // 导出word

        // 11、关闭流
        fos.close();
        doc.close();
    }

柱状折线组合图

   
    @Test
    public void JFreeChart6() throws Exception{
    
    
        //绘制柱形图
        // 1、创建word文档对象
        XWPFDocument doc = new XWPFDocument();
        // 2、创建chart图表对象,抛出异常
        XWPFChart chart = doc.createChart(15 * Units.EMU_PER_CENTIMETER, 10 * Units.EMU_PER_CENTIMETER);

        // 3、图表相关设置
//        chart.setTitleText("使用POI创建的柱状图"); // 图表标题
        chart.setTitleText("");
//        chart.setTitleOverlay(false); // 图例是否覆盖标题

        // 4、图例设置
//        XDDFChartLegend legend = chart.getOrAddLegend();

//        legend.setPosition(LegendPosition.TOP); // 图例位置:上下左右

        // 5、X轴(分类轴)相关设置
        XDDFCategoryAxis xAxis = chart.createCategoryAxis(AxisPosition.BOTTOM); // 创建X轴,并且指定位置
//        xAxis.setTitle("日期(年月)"); // x轴标题
        String[] xAxisData = new String[] {
    
    
                "2021-01","2021-02","2021-03","2021-04","2021-05","2021-06",
                "2021-07","2021-08","2021-09","2021-10","2021-11","2021-12",
        };
        XDDFCategoryDataSource xAxisSource = XDDFDataSourcesFactory.fromArray(xAxisData); // 设置X轴数据

        // 6、Y轴(值轴)相关设置
        XDDFValueAxis yAxis = chart.createValueAxis(AxisPosition.LEFT); // 创建Y轴,指定位置
//        yAxis.setTitle("粉丝数(个)"); // Y轴标题
        yAxis.setCrossBetween(AxisCrossBetween.BETWEEN); // 设置图柱的位置:BETWEEN居中

        Integer[] yAxisData = new Integer[]{
    
    
                10, 35, 21, 46, 79, 88,
                39, 102, 71, 28, 99, 57
        };
        XDDFNumericalDataSource<Integer> yAxisSource = XDDFDataSourcesFactory.fromArray(yAxisData); // 设置Y轴数据
        // 7、创建柱状图对象
        XDDFBarChartData barChart = (XDDFBarChartData) chart.createData(ChartTypes.BAR, xAxis, yAxis);
        barChart.setBarDirection(BarDirection.COL); // 设置柱状图的方向:BAR横向,COL竖向,默认是BAR
//        barChart.setVaryColors(true);   //设置可变颜色

        // 8、加载柱状图数据集
        XDDFBarChartData.Series barSeries = (XDDFBarChartData.Series) barChart.addSeries(xAxisSource, yAxisSource);
//        barSeries.setTitle("",null);
//        barSeries.setTitle("粉丝数", null); // 图例标题

        // 9、绘制柱状图
        chart.plot(barChart);
        Integer[] yAxisData2 = new Integer[]{
    
    
                10, 35, 21, 46, 79, 88,
                39, 102, 71, 28, 99, 57
        };
        XDDFNumericalDataSource<Integer> yAxisSource2 = XDDFDataSourcesFactory.fromArray(yAxisData2); // 设置Y轴数据

        // 7、创建折线图对象
        XDDFLineChartData lineChart = (XDDFLineChartData) chart.createData(ChartTypes.LINE, xAxis, yAxis);

        // 8、加载折线图数据集
        XDDFLineChartData.Series lineSeries = (XDDFLineChartData.Series) lineChart.addSeries(xAxisSource, yAxisSource2);
        lineSeries.setTitle("粉丝数", null); // 图例标题
        lineSeries.setSmooth(true); // 线条样式:true平滑曲线,false折线
        lineSeries.setMarkerSize((short) 6); // 标记点大小
        lineSeries.setMarkerStyle(MarkerStyle.CIRCLE); // 标记点样式

        // 9、绘制折线图
        chart.plot(lineChart);
        // 10、输出到word文档
        FileOutputStream fos = new FileOutputStream("F:\\li\\6.doc");
        doc.write(fos); // 导出word

        // 11、关闭流
        fos.close();
        doc.close();
    }

给导出的柱状图添加文字

		// 在绘制折线图chart.plot(lineChart);下一步添加
        CTPlotArea plotArea = chart.getCTChart().getPlotArea();
        //柱状图1上显示数值
        plotArea.getBarChartArray(0).getSerArray(0).addNewDLbls();
        plotArea.getBarChartArray(0).getSerArray(0).getDLbls().addNewShowVal().setVal(true);
        plotArea.getBarChartArray(0).getSerArray(0).getDLbls().addNewShowLegendKey().setVal(false);
        plotArea.getBarChartArray(0).getSerArray(0).getDLbls().addNewShowCatName().setVal(false);
        plotArea.getBarChartArray(0).getSerArray(0).getDLbls().addNewShowSerName().setVal(false);

        //柱状图2上显示数值
        plotArea.getBarChartArray(0).getSerArray(1).addNewDLbls();
        plotArea.getBarChartArray(0).getSerArray(1).getDLbls().addNewShowVal().setVal(true);
        plotArea.getBarChartArray(0).getSerArray(1).getDLbls().addNewShowLegendKey().setVal(false);
        plotArea.getBarChartArray(0).getSerArray(1).getDLbls().addNewShowCatName().setVal(false);
        plotArea.getBarChartArray(0).getSerArray(1).getDLbls().addNewShowSerName().setVal(false);

给导出的柱状图设置颜色

		// 在绘制折线图chart.plot(lineChart);下一步添加
		if (xAxisData.length>0){
    
    
            //给第一个条形图的每个条形图设置颜色
            CTBarSer ser = plotArea.getBarChartArray(0).getSerArray(0);
            for (int i = 0; i < xAxisData.length; i++) {
    
    
                CTDPt dpt = ser.addNewDPt();
                dpt.addNewIdx().setVal(i);
                dpt.addNewSpPr().addNewSolidFill().addNewSrgbClr().setVal(new byte[]{
    
    (byte) 148, (byte) 39, (byte) 25});
            }
            //给第二个条形图的每个条形图设置颜色
            CTBarSer ser1 = plotArea.getBarChartArray(0).getSerArray(1);
            for (int i1 = 0; i1 < xAxisData.length; i1++) {
    
    
                CTDPt dpt1 = ser1.addNewDPt();
                dpt1.addNewIdx().setVal(i1);
                dpt1.addNewSpPr().addNewSolidFill().addNewSrgbClr().setVal(new byte[]{
    
    (byte) 219, (byte) 106, (byte) 57});
            }
        }

换行

创建空白行,文字内容写,\r回车\n换行符

\r\n

单行的话,内容只用写\n就行
如果需要连续换多行写多个即可 \r\n\r\n\r\n 即为连续换三行

强制分页

XWPFDocument.createParagraph().createRun().addBreak(BreakType.PAGE)

导入图片

 //插入图片 
 //根据我自己的计算,
 //代码里传入的width,1大概对应word中图片宽度2.65mm
 //代码里传入的height,1大概对应word中图片高度2.64mm
 //有需要可以自己算一下,可能会有一点误差,稍微改一下就好了
    private static void createPicture(XWPFDocument doc,String urlVisit,Integer width,Integer height) throws Exception{
    
    
        InputStream in = null;
        try {
    
    
            XWPFParagraph firstParagraph = doc.createParagraph();
            XWPFRun run = firstParagraph.createRun();
            // 获取远程图片
            URL url = new URL(urlVisit);
            in = url.openStream();
            //图片输入流、图片类型、图片名称、宽度、高度
            run.addPicture(in, org.apache.poi.xwpf.usermodel.Document.PICTURE_TYPE_PNG, "",
                    Units.pixelToEMU(width), Units.pixelToEMU(height));
            //换行
            run.addBreak(BreakType.TEXT_WRAPPING);
        } catch (InvalidFormatException e) {
    
    
            e.printStackTrace();
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
    }

向指定行添加颜色

这是对指定一行设置颜色,j代表这一行有几列格

for (int j = 0; j < 5; j++) {
    
    
   row2.getCell(j).setColor("B4C6E7");
}		

合并单元格

    /**
     * 跨列合并
     * @param table 表格
     * @param row 所合并的行
     * @param fromCell 起始列
     * @param toCell 终止列
     */
    public  void mergeCellsHorizontal(XWPFTable table, int row, int fromCell, int toCell) {
    
    
        for (int cellIndex = fromCell; cellIndex <= toCell; cellIndex++) {
    
    
            XWPFTableCell cell = table.getRow(row).getCell(cellIndex);
            if ( cellIndex == fromCell ) {
    
    
                cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
            } else {
    
    
                cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
            }
        }
    }

    /**
     * 跨行合并
     * @param table 表格
     * @param col 所合并的列
     * @param fromRow 起始行
     * @param toRow 终止行
     */
    public  void mergeCellsVertically(XWPFTable table, int col, int fromRow, int toRow) {
    
    
        for (int rowIndex = fromRow; rowIndex <= toRow; rowIndex++) {
    
    
            XWPFTableCell cell = table.getRow(rowIndex).getCell(col);
            if ( rowIndex == fromRow ) {
    
    
                cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);
            } else {
    
    
                cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);
            }
        }
    }

POI设置行间距为固定值

 //设置行间距	size:固定值大小
    public static void setLineSpace(XWPFParagraph p,int size) {
    
    
        CTP ctp = p.getCTP();
        CTPPr ppr = ctp.isSetPPr() ? ctp.getPPr() : ctp.addNewPPr();
        CTSpacing spacing = ppr.isSetSpacing()? ppr.getSpacing() : ppr.addNewSpacing();
        spacing.setAfter(BigInteger.valueOf(0));
        spacing.setBefore(BigInteger.valueOf(0));
        //设置行距类型为 EXACT
        spacing.setLineRule(STLineSpacingRule.EXACT);
        //1磅数是20
        spacing.setLine(BigInteger.valueOf(size*20));
    }

文本添加上标,下标

		XWPFParagraph p = doc.createParagraph();
        p.setAlignment(ParagraphAlignment.LEFT);
        XWPFRun run = p.createRun();
        createSupText(run,"    其中,x",false,16,"仿宋_GB2312");
        XWPFRun run2 = p.createRun();
        createSup(run2,"ij",false,16,"仿宋_GB2312");
        XWPFRun run3 = p.createRun();
        createSupText(run3,"为第i个一级指标下、第j个二级指标;x",false,16,"仿宋_GB2312");
        XWPFRun run4 = p.createRun();
        createSup(run4,"j",false,16,"仿宋_GB2312");
        XWPFRun run5 = p.createRun();
        createSupText(run5,"为第j个二级指标相应的标准值。",false,16,"仿宋_GB2312");
	 /**
     * 设置角标段落普通文字样式
     * @param text 文本
     * @param bold 是否加粗
     * @param size 字体大小
     * @param fontFamily 字体
     */
    private static void createSupText(XWPFRun r,String text,Boolean bold,
                                  Integer size, String fontFamily){
    
    
        r.setText(text);    //文本内容
        r.setBold(bold);    //字体是否加粗
        r.setFontSize(size);    //字体大小
        r.setFontFamily(fontFamily);   //字体
    }

    /**
     * 设置角标段落角标文字样式
     * @param text 文本
     * @param bold 是否加粗
     * @param size 字体大小
     * @param fontFamily 字体
     */
    private static void createSup(XWPFRun r,String text,Boolean bold,
                                  Integer size, String fontFamily){
    
    
        r.setText(text);    //文本内容
        r.setBold(bold);    //字体是否加粗
        r.setFontSize(size);    //字体大小
        r.setFontFamily(fontFamily);   //字体
        // 添加下标
        CTVerticalAlignRun ctVerticalAlignRun = r.getCTR().addNewRPr().addNewVertAlign();
        // SUPERSCRIPT 上标	SUBSCRIPT 下标
        ctVerticalAlignRun.setVal(STVerticalAlignRun.SUBSCRIPT);
    }

导出来文本的样式为
在这里插入图片描述

一段文本分别设置多种不同样式

		//只需要创建一个段落,不停的new新的Run就行了,每段Run设置不同的样式即可
		XWPFParagraph pa = doc.createParagraph();
        pa.setAlignment(ParagraphAlignment.LEFT);
        XWPFRun r = pa.createRun();
        r.setText("哈哈哈");    //文本内容
        r.setBold(true);    //字体是否加粗
        r.setFontSize(16);    //字体大小
        r.setFontFamily("仿宋_GB2312");   //字体
        XWPFRun r2 = pa.createRun();
        r2.setText("嘿嘿嘿");
        r2.setFontFamily("黑体");
        r2.setFontSize(22);
        XWPFRun r3 = pa.createRun();
        r3.setText("嘻嘻嘻");
        r3.setItalic(true);

导出文本样式为
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/whatevery/article/details/123589094