POI 饼图 折线+柱状 多柱状

看代码  看就完了  POI 4.1.2的 下面三个

<dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</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-ooxml-schemas</artifactId>
            <version>4.1.2</version>
        </dependency>
    </dependencies>


import com.uil.excelchart.entry.LineChart;
import org.apache.poi.ss.usermodel.ClientAnchor;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xddf.usermodel.LineCap;
import org.apache.poi.xddf.usermodel.XDDFLineProperties;
import org.apache.poi.xddf.usermodel.XDDFShapeProperties;
import org.apache.poi.xddf.usermodel.chart.*;
import org.apache.poi.xssf.usermodel.XSSFChart;
import org.apache.poi.xssf.usermodel.XSSFDrawing;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xssf.usermodel.charts.XSSFChartLegend;
import org.apache.xmlbeans.XmlException;
import org.openxmlformats.schemas.drawingml.x2006.chart.*;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @author liu
 * 升级poi  4.1.2
 */
public class ChartUtil {
    public static void main(String[] args) {
        try {
            createChart();
            createPie();
        } catch (XmlException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    public static void createChart() throws XmlException, IOException {
        XSSFWorkbook workbook = new XSSFWorkbook();
        XSSFSheet sheet = workbook.createSheet("Pie Chart");

        ArrayList<String> xArr = new ArrayList<>();
        xArr.add("1yue");
        xArr.add("2yue");
        xArr.add("3yue");
        xArr.add("4yue");
        xArr.add("5yue");
        xArr.add("6yue");
        xArr.add("7yue");
        ArrayList<Double> yArr1 = new ArrayList<>();
        yArr1.add(26d);
        yArr1.add(6d);
        yArr1.add(10d);
        yArr1.add(22d);
        yArr1.add(4d);
        yArr1.add(12d);
        yArr1.add(11d);
        ArrayList<Double> yArr2 = new ArrayList<>();
        yArr2.add(22d);
        yArr2.add(8d);
        yArr2.add(14d);
        yArr2.add(27d);
        yArr2.add(14d);
        yArr2.add(22d);
        yArr2.add(6d);
        ArrayList<Double> yArr3 = new ArrayList<>();
        yArr3.add(21.2);
        yArr3.add(0d);
        yArr3.add(17.15);
        yArr3.add(21.13);
        yArr3.add(22d);
        yArr3.add(12d);
        yArr3.add(9d);

        // Create a chart
        XSSFDrawing drawing = sheet.createDrawingPatriarch();
        ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 7, 8, 33);
        XSSFChart chart = drawing.createChart(anchor);
        // 创建图表系列
        XSSFChartLegend legend = chart.getOrCreateLegend();
        legend.setPosition(org.apache.poi.ss.usermodel.charts.LegendPosition.TOP);
        XDDFCategoryAxis xAxis = chart.createCategoryAxis(AxisPosition.BOTTOM);
        XDDFValueAxis yAxis = chart.createValueAxis(AxisPosition.LEFT);
        chart.setTitleOverlay(false);
        //设置柱表两端的柱子 不要被遮挡
        yAxis.setCrossBetween(AxisCrossBetween.BETWEEN);
        XDDFBarChartData data = (XDDFBarChartData) chart.createData(ChartTypes.BAR, xAxis, yAxis);

        data.setBarDirection(BarDirection.COL);
        data.setVaryColors(true);
        //动态数据
        XDDFDataSource<String> xData = XDDFDataSourcesFactory.fromArray(xArr.toArray(new String[]{}));
        XDDFNumericalDataSource<Double> yData1 = XDDFDataSourcesFactory.fromArray(yArr1.toArray(new Double[]{}));
        XDDFChartData.Series series1 = data.addSeries(xData, yData1);
        series1.setTitle("NLZ", null);
//        XDDFNumericalDataSource<Double> yData2 = XDDFDataSourcesFactory.fromArray(yArr2.toArray(new Double[]{}));
        XDDFNumericalDataSource<Double> yData3 = XDDFDataSourcesFactory.fromArray(yArr3.toArray(new Double[]{}));


//        XDDFChartData.Series series2 = data.addSeries(xData, yData2);
//        XDDFChartData.Series series3 = data.addSeries(xData, yData3);
//        series2.setTitle("NCR", null);
//        series3.setTitle("CCC", null);
        XDDFChartData lineData = chart.createData(ChartTypes.LINE, xAxis, yAxis);
        XDDFChartData.Series series = lineData.addSeries(xData, yData3);
        series.setTitle("ddd", null);
        series.setShowLeaderLines(true);
        XDDFShapeProperties shapeProperties = series.getShapeProperties();
        if (shapeProperties == null) {
            shapeProperties = new XDDFShapeProperties();
            series.setShapeProperties(shapeProperties);
        }
        XDDFLineProperties lineProperties = shapeProperties.getLineProperties();
        if (lineProperties == null) {
            lineProperties = new XDDFLineProperties();
            shapeProperties.setLineProperties(lineProperties);
        }
        lineProperties.setWidth(2.5);
        lineProperties.setLineCap(LineCap.FLAT);
        data.setGapWidth(50);
        data.setBarGrouping(BarGrouping.STANDARD);
        //设置数字标签 但是会显示所有的数据如x周的数据  所以要取消掉其他的
        CTPlotArea plotArea = chart.getCTChart().getPlotArea();
        for (CTBarSer ser : plotArea.getBarChartArray(0).getSerList()) {
            CTBoolean ctBoolean = CTBoolean.Factory.newInstance();
            ctBoolean.setVal(false);
            CTDLbls ctdLbls = ser.addNewDLbls();
            ctdLbls.addNewShowVal().setVal(true);
            ctdLbls.addNewNumFmt().setFormatCode("#");
            ctdLbls.setShowBubbleSize(ctBoolean);
            ctdLbls.setShowCatName(ctBoolean);
            ctdLbls.setShowLeaderLines(ctBoolean);
            ctdLbls.setShowLegendKey(ctBoolean);
            ctdLbls.setShowSerName(ctBoolean);
            ctdLbls.setShowPercent(ctBoolean);
        }
        for (CTLineSer ser : plotArea.getLineChartArray(0).getSerList()) {
            CTBoolean ctBoolean = CTBoolean.Factory.newInstance();
            ctBoolean.setVal(false);
            CTDLbls ctdLbls = ser.addNewDLbls();
            ctdLbls.addNewShowVal().setVal(true);
            ctdLbls.addNewNumFmt().setFormatCode("#");
            ctdLbls.setShowBubbleSize(ctBoolean);
            ctdLbls.setShowCatName(ctBoolean);
            ctdLbls.setShowLeaderLines(ctBoolean);
            ctdLbls.setShowLegendKey(ctBoolean);
            ctdLbls.setShowSerName(ctBoolean);
            ctdLbls.setShowPercent(ctBoolean);
        }

        chart.plot(data);
        chart.plot(lineData);
        // 保存工作簿到文件
        try (FileOutputStream fileOut = new FileOutputStream("D:\\桌面文件\\pieChart.xlsx")) {
            workbook.write(fileOut);
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            // 关闭工作簿
            try {
                workbook.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }

    }

    /**
     * 创建饼图
     */
    public static void createPie() {
        String titleName = "ppp";
        List<String> titleList = new ArrayList<>();
        List<Integer> dataList = new ArrayList<>();
        titleList.add("a");
        titleList.add("b");
        titleList.add("c");
        titleList.add("d");
        titleList.add("e");
        dataList.add(12);
        dataList.add(5);
        dataList.add(3);
        dataList.add(17);
        dataList.add(22);
        Workbook workbook = new XSSFWorkbook();
        XSSFSheet sheet = (XSSFSheet) workbook.createSheet("Pie Chart");

        XSSFDrawing drawing = sheet.createDrawingPatriarch();
        ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 7, 8, 33);
        XSSFChart chart = drawing.createChart(anchor);
        chart.setTitleOverlay(false);
        //图例位置
        XDDFChartLegend legend = chart.getOrAddLegend();
        legend.setPosition(LegendPosition.TOP);
        //分类轴标数据
        XDDFDataSource<String> countries = XDDFDataSourcesFactory.fromArray(titleList.toArray(new String[]{}));
        XDDFNumericalDataSource<Integer> values = XDDFDataSourcesFactory.fromArray(dataList.toArray(new Integer[]{}));
        XDDFChartData data = chart.createData(ChartTypes.PIE, null, null);
        //设置为可变颜色
        data.setVaryColors(true);
        //图表加载数据
        data.addSeries(countries, values);
        //绘制
        CTChart ctChart = chart.getCTChart();
        chart.plot(data);
        chart.setTitleText("OUTAGE PER AREA");
        chart.getCTChartSpace().addNewRoundedCorners().setVal(false);
        CTDLbls ctdLbls = ctChart.getPlotArea().getPieChartArray(0).getSerArray(0).addNewDLbls();
        ctdLbls.addNewShowVal().setVal(false);
        ctdLbls.addNewShowLegendKey().setVal(true);
        //类别名称
        ctdLbls.addNewShowCatName().setVal(false);
        //百分比
        ctdLbls.addNewShowSerName().setVal(false);
        ctdLbls.addNewShowPercent().setVal(true);
        //引导线
        ctdLbls.addNewShowLeaderLines().setVal(false);
        //分隔符为分行符
        ctdLbls.setSeparator("\n");
        try (FileOutputStream fileOut = new FileOutputStream("D:\\桌面文件\\pChart.xlsx")) {
            workbook.write(fileOut);
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            // 关闭工作簿
            try {
                workbook.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }

    /**
     * 创建折线图
     */
    public static void createLine(LineChart lineChart) {
        List<Object> xAxisList = lineChart.getXAxisList();
        List<String> chartTitleList = lineChart.getTitleList();
        List<List<Integer>> chartDataList = lineChart.getDataList();
        String chartTitle = lineChart.getChartTitle();
        Workbook workbook = new XSSFWorkbook();
        XSSFSheet sheet = (XSSFSheet) workbook.createSheet("Pie Chart");

        XSSFDrawing drawing = sheet.createDrawingPatriarch();
        ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 7, 8, 33);
        XSSFChart chart = drawing.createChart(anchor);
        chart.setTitleOverlay(false);
        //图例位置
        XDDFChartLegend legend = chart.getOrAddLegend();
        legend.setPosition(LegendPosition.TOP);
        //分类轴标(X轴),标题位置
        XDDFCategoryAxis bottomAxis = chart.createCategoryAxis(AxisPosition.BOTTOM);
        //值(Y轴)轴,标题位置
        XDDFValueAxis leftAxis = chart.createValueAxis(AxisPosition.LEFT);
        //LINE:折线图
        XDDFLineChartData data = (XDDFLineChartData) chart.createData(ChartTypes.LINE, bottomAxis, leftAxis);
        XDDFCategoryDataSource countries = XDDFDataSourcesFactory.fromArray(Arrays.copyOf(xAxisList.toArray(), xAxisList.toArray().length, String[].class));
        for (int i = 0; i < chartDataList.size(); i++) {
            List<Integer> floats = chartDataList.get(i);
            XDDFNumericalDataSource<Integer> dataSource = XDDFDataSourcesFactory.fromArray(floats.toArray(new Integer[]{}));
            //图表加载数据,折线
            XDDFLineChartData.Series series = (XDDFLineChartData.Series) data.addSeries(countries, dataSource);
            series.setTitle(chartTitleList.get(i), null);
            //直线
            series.setSmooth(false);
            //设置标记大小
            series.setMarkerSize((short) 2);
            //添加标签数据,折线图中拐点值展示
            series.setShowLeaderLines(true);
//            chart.getCTChart().getPlotArea().getLineChartArray(0).getSerArray(i).getDLbls()
//                    .addNewDLblPos().setVal(org.openxmlformats.schemas.drawingml.x2006.chart.STDLblPos.CTR);
            chart.getCTChart().getPlotArea().getLineChartArray(0).getSerArray(i).getDLbls().addNewShowVal().setVal(true);
            chart.getCTChart().getPlotArea().getLineChartArray(0).getSerArray(i).getDLbls().addNewShowLegendKey().setVal(false);
            chart.getCTChart().getPlotArea().getLineChartArray(0).getSerArray(i).getDLbls().addNewShowCatName().setVal(false);
            chart.getCTChart().getPlotArea().getLineChartArray(0).getSerArray(i).getDLbls().addNewShowSerName().setVal(false);
        }
        //绘制
        chart.plot(data);
        if (chartDataList.size() == 1) {
            chart.getCTChart().getPlotArea().getLineChartArray(0).addNewVaryColors().setVal(false);
        }
    }

}

不懂问我吧  可以加QQ 582323339       因为没到三级。。。 直接加吧  带上问题

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
对于poi树状图、饼图折线图的生成,可以使用Apache POI提供的XSSFChart和XDDFChart类进行操作。 首先,我们需要创建一个工作簿对象,然后在工作簿中创建一个工作表对象。接着,我们可以创建一个图表对象,并将其添加到工作表中。然后,我们可以使用XSSFChart和XDDFChart类的方法来定义图表的数据和样式。 具体实现步骤如下: 1. 创建一个工作簿对象 ``` XSSFWorkbook workbook = new XSSFWorkbook(); ``` 2. 创建一个工作表对象 ``` XSSFSheet sheet = workbook.createSheet("Chart"); ``` 3. 创建一个图表对象 ``` XSSFChart chart = sheet.createDrawingPatriarch().createChart(anchor); ``` 其中,anchor是图表的位置和大小,可以使用XSSFClientAnchor类来定义。 4. 定义图表的数据和样式 对于饼图折线图和树状图,数据一般是通过一个数据源来提供的。我们可以使用XDDFDataSource类来创建数据源,并将其添加到图表中。样式方面,可以使用XDDFChartLegend和XDDFChartData类来定义图表的标题、图例、颜色等属性。 下面是一个生成饼图的示例代码: ``` // 创建一个工作簿对象 XSSFWorkbook workbook = new XSSFWorkbook(); // 创建一个工作表对象 XSSFSheet sheet = workbook.createSheet("Chart"); // 创建一个图表对象 XSSFChart chart = sheet.createDrawingPatriarch().createChart(anchor); // 创建一个数据源 XDDFDataSource<String> categoryDataSource = XDDFDataSourcesFactory.fromStringCellRange(sheet, new CellRangeAddress(1, 4, 0, 0)); XDDFNumericalDataSource<Double> dataDataSource = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(1, 4, 1, 1)); // 创建一个饼图数据对象 XDDFPieChartData data = (XDDFPieChartData) chart.createData(ChartTypes.PIE, null, null); // 添加数据源到饼图数据对象中 data.setCategoryData(categoryDataSource); data.setValues(dataDataSource); // 创建一个饼图样式对象 XDDFChartLegend legend = chart.getOrAddLegend(); legend.setPosition(LegendPosition.TOP_RIGHT); XDDFPieChartSeries series = (XDDFPieChartSeries) data.getSeries().get(0); series.setTitle("Pie Chart"); XDDFShapeProperties shapeProperties = series.getShapeProperties(); shapeProperties.setFillProperties(new XDDFSolidFillProperties(XDDFColor.from(PresetColor.BLUE))); ``` 这样,就可以在Excel文档中生成一个饼图了。其他类型的图表生成也是类似的,只需要根据需要调用不同的类和方法即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值