poi生成excel饼图设置颜色

news2024/11/15 19:48:22

 效果

实现 

import com.gideon.entity.ChartPosition;
import com.gideon.entity.LineChart;
import com.gideon.entity.PieChart;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xddf.usermodel.PresetColor;
import org.apache.poi.xddf.usermodel.XDDFColor;
import org.apache.poi.xddf.usermodel.XDDFSolidFillProperties;
import org.apache.poi.xddf.usermodel.chart.*;
import org.apache.poi.xssf.usermodel.*;
import org.openxmlformats.schemas.drawingml.x2006.chart.*;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class ChartUtils {
    private static XSSFChart createDrawingPatriarch(XSSFSheet sheet, ChartPosition chartPosition, String chartTitle) {
        //创建一个画布
        XSSFDrawing drawing = sheet.createDrawingPatriarch();
        //前偏移量四个默认0
        XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, chartPosition.getCol1(), chartPosition.getRow1(), chartPosition.getCol2(), chartPosition.getRow2());
        //创建一个chart对象
        XSSFChart chart = drawing.createChart(anchor);
        //标题
        chart.setTitleText(chartTitle);
        //标题是否覆盖图表
        chart.setTitleOverlay(false);
        return chart;
    }

    /**
     * 创建饼图
     *
     * @param sheet 图表
     * @see com.gideon.entity.PieChart  饼图数据的封装
     * @see com.gideon.entity.ChartPosition 饼图的坐标位置
     */
    public static void createPie(XSSFSheet sheet, ChartPosition chartPosition, PieChart pieChart) {
        String titleName = pieChart.getTitleName();
        List<String> titleList = pieChart.getTitleList();
        List<Integer> dataList = pieChart.getDataList();
        XSSFChart chart = createDrawingPatriarch(sheet, chartPosition, titleName);

        //图例位置
        XDDFChartLegend legend = chart.getOrAddLegend();
        legend.setPosition(LegendPosition.BOTTOM);
        //分类轴标数据
        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);

        // 饼图设置颜色
        CTPlotArea plotArea = chart.getCTChart().getPlotArea();
        CTPieSer ser = plotArea.getPieChartArray(0).getSerArray(0);
        CTDPt dpt = ser.addNewDPt();
        List<byte[]> bytes = new ArrayList<>();
        // 设置RGB颜色
        bytes.add(new byte[]{(byte) 51, (byte) 208, (byte) 189});
        bytes.add(new byte[]{(byte) 254, (byte) 190, (byte) 107});
        bytes.add(new byte[]{(byte) 254, (byte) 112, (byte) 110});
        bytes.add(new byte[]{(byte) 81, (byte) 146, (byte) 255});
        for (int i = 0; i < 4; i++) {
            dpt.addNewIdx().setVal(i);
            dpt.addNewSpPr().addNewSolidFill().addNewSrgbClr().setVal(bytes.get(i));
            dpt = ser.addNewDPt();
        }
        // 绘制
        chart.plot(data);

        CTDLbls ctdLbls = chart.getCTChart().getPlotArea().getPieChartArray(0).getSerArray(0).addNewDLbls();
        ctdLbls.addNewShowVal().setVal(false);
        ctdLbls.addNewShowLegendKey().setVal(false);
        // 百分比
        ctdLbls.addNewShowSerName().setVal(false);
        ctdLbls.addNewShowPercent().setVal(true);
        // 类别名称
        ctdLbls.addNewShowCatName().setVal(false);
        // 引导线
        ctdLbls.addNewShowLeaderLines().setVal(false);
        // 数据标签内
        ctdLbls.addNewDLblPos().setVal(STDLblPos.Enum.forString("inEnd"));
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/696893.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

react封装jsoneditor

1、安装&#xff1a; api文档&#xff1a;jsoneditor npm install jsoneditor2、代码&#xff1a; JsonEditor/index.tsx: import { useMemoizedFn } from ahooks; import JSONEditor from jsoneditor; import { useEffect, useState } from react; import ./index.less;in…

SpringBoot - 如何使用SpringBootServletInitializer将SpringBoot项目打成WAR包并部署TOMCAT中

写在前面 请先阅读&#xff1a; MAVEN的SCOPE属性详细说明&#xff1a;https://blog.csdn.net/goodjava2007/article/details/122860143 SpringBootServletInitializer的作用 SpringBootServletInitializer 是一个 SpringBoot 提供的、用于配置SERVLET初始化的类&#xff0c…

美颜SDK的未来发展:从单纯的美颜到更多的人脸应用

近年来&#xff0c;随着智能手机的普及和社交媒体的兴起&#xff0c;美颜应用成为了人们生活中越来越重要的一部分。为了满足用户对美颜的需求&#xff0c;美颜SDK&#xff08;软件开发工具包&#xff09;应运而生&#xff0c;它为开发者提供了一种方便的方式来集成美颜功能到他…

样本标准差与总体标准差中自由度理解

在计算总体标准差时&#xff0c;其计算公式如下&#xff1a; 计算样本标准差是&#xff1a; 这里样本标准差用的是n-1&#xff0c;不是n。根据chatgpt的回答&#xff0c;理解如下&#xff1a; 当样本均值使用作为均值估计量会引入一定的不确定性&#xff08;偏差&#xff09;&…

华为OD机试真题 Python 实现【天然蓄水池】【2023Q1 200分】,附详细解题思路

一、题目描述 公元2919年&#xff0c;人类终于发现了一颗宜居星球——X星。现想在X星一片连绵起伏的山脉间建一个天然蓄水库&#xff0c;如何选取水库边界&#xff0c;使蓄水量最大&#xff1f; 要求&#xff1a; 山脉用正整数数组s表示&#xff0c;每个元素代表山脉的高度。…

基于GPT3.5模型搭建的聊天系统BAIChat

1. 使用chatgpt前提条件 需要特殊的网络环境。如果是小白&#xff0c;不会搭建网络环境&#xff0c;可以关注我私信我&#xff0c;在线帮你搭建网络环境。 2.BAIChat链接 https://chatbot.theb.ai/#/chat/1686535596065 GPT3 研究背景 最近的研究表明&#xff0c;在 pretrai…

docker命令创建 Portainer容器

Portainer控制台可查看docker中各个容器的相关信息&#xff0c;实时查看容器启动日志以及对各个容器进行重启、删除&#xff0c;重建等代替命令的一列操作&#xff0c;使用起来非常方便。 创建目录data并赋权限 # 数据目录 mkdir -p /software/docker/portainer/data # 赋权限…

线性代数高级--二次型--特征值与特征向量--特征值分解--多元函数的泰勒展开

目录 二次型 概念 示例 性质和特点 特征值与特征向量 概念 示例 注意 性质和特点 特征值分解 注意 多元函数的泰勒展开 回顾一元函数泰勒展开 多元函数的泰勒展开 二次型 概念 二次型是一个关于向量的二次多项式&#xff0c;通常用矩阵表示。 考虑一个n维向量…

Oracle 实现A表B表字段/表名不同,定时任务+存储过程,定期执行增删改查

说明 假设Oracle A表B表 &#xff0c;表字段不同&#xff0c;表名也不同&#xff0c; 通过存储过程 定时任务(Jobs)&#xff0c; 定期去执行业务逻辑的增删改查 。 1、定时同步 创建一个存储过程&#xff0c;用于比较两张表中的数据&#xff0c;并根据状态决定需要同步的数据。…

java开发必备技能之Spring常用注解(重点)

参考了尚硅谷注解版&#xff0c;注解版后面的源码没看&#xff0c;雷神讲的太散了 Spring注解 AnnotationConfigApplicationContext 组件添加相关注解 1、ConfigurationBean (基础) 1-1 XML文件方式实现组件添加 public class Person { private String name;private Integ…

五个漂亮的 Arch Linux 发行版

导读本文将介绍几个漂亮的 Arch Linux 发行版&#xff0c;这些发行版将设计的优雅之美与 Arch Linux 强大的底层框架相结合。 Arch Linux 提供滚动更新模型、强大的 pacman 软件包管理器&#xff0c;以及通过其软件仓库提供的成千上万的应用程序。它非常受欢迎&#xff0c;因为…

多线程之wait()和notify()详解

1.每个Java对象都有一个监视器&#xff08;monitor&#xff09;&#xff0c;它是用来控制对该对象的访问的。一个线程要想进入某个对象的监视器区域&#xff0c;必须先获得该对象的锁。然后可以通过wait方法来释放该对象的锁并进入等待状态&#xff0c;直到其他线程调用notify或…

python读取.ann文件编码格式

encoding‘latin1.(gbk和utf-8均报错) 【还是chatpgt告诉我的呢】

oracle查看当前实例与切换实例

查看实例 select name from v$database;切换实例 sqlplus /ORCL as sysdba

【前端工程化】深入浅出vite(二)--vue3全家桶+ts构建后管系统

安装基础包 npm create vitelatest # 这里选择的是VueTypescript的组合 cd vue-admin npm install# 先安装基础包 npm install vue-router4 npm i pinia npm i axios npm install sass --save-dev npm install element-plus --save npm install element-plus/icons-vue npm in…

全志V3S嵌入式驱动开发(spi-nor image制作)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 其实&#xff0c;我们之前就讨论过怎么把image烧入到v3s的spi-nor当中去。当时使用的方法是借助于sunxi-fel工具&#xff0c;烧入的image也比计较小…

2. 计算点到平面的投影

参考 https://www.cnblogs.com/nobodyzhou/p/6145030.html 所以用各种平面提取算法后&#xff0c;得到的平面方程, 注意此处的平面方程abcd已经是归一化了。 a x b y c z d 0 ax by cz d 0 axbyczd0 此时的原点到该平面点的投影点为 C P ( − a d , − b d , − c …

渗透测试内网基础知识

点赞后看&#xff0c;养成习惯 喜欢的话 可以点个关注哟 你们的点赞支持对博主们来说很重要哦 &#xff01;&#xff01;&#xff01; 为方便您的阅读&#xff0c;可点击下方蓝色字体&#xff0c;进行跳转↓↓↓ 01 内网概述02 工作组03 域04 活动目录05 域控制器和活动目录的…

【C/C++】使用类和对象 设计点和圆的关系案例

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

误删除boot目录 修复办法

误删除boot目录 修复办法 本次演示系统为kylin-v10-sp3-20230324&#xff0c;kernel&#xff1a;4.19.90-52.22.v2207.ky10.x86_64 文章目录 误删除boot目录 修复办法1.报错现象2.正常机器boot目录结构3.误删除boot目录4.故障修复挂载光盘&#xff0c;进入救援模式 5.非正常情况…