改造升级autoPOI以满足poi5.0.0及以上版本

简介: 改造升级autoPOI以满足poi5.0.0及以上版本

  因为nbcio-boot项目用到了poi5.0.0,但本身我看autoPOI现在只能支持poi4.12,所以需要改造这个jar,以便使用,随便也上传一下到maven中央库里去。

      主要如下:

1、POM父文件修改成自己的版本,同时根据上传maven库要求进行修改;

2、修改cell.getCellTypeEnum()为cell.getCellType(),这个很多文件都要用到;都需要修改;

3、getNumberOfFonts类型变了,由short变成int了,需要修改;

4、ExcelChartBuildService这个文件需要修改,这里修改的地方比较多,所以放在后面了,这样就可以试用poi5.0.0了

/**
 * 
 */
package org.jeecgframework.poi.excel.graph.builder;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
//import org.apache.poi.ss.usermodel.Chart;
import org.apache.poi.ss.usermodel.ClientAnchor;
import org.apache.poi.ss.usermodel.Drawing;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xddf.usermodel.chart.*;
import org.apache.poi.xssf.usermodel.XSSFSheet;
/*import org.apache.poi.ss.usermodel.charts.AxisCrosses;
import org.apache.poi.ss.usermodel.charts.AxisPosition;
import org.apache.poi.ss.usermodel.charts.ChartAxis;
import org.apache.poi.ss.usermodel.charts.ChartDataSource;
import org.apache.poi.ss.usermodel.charts.ChartLegend;
import org.apache.poi.ss.usermodel.charts.DataSources;
import org.apache.poi.ss.usermodel.charts.LegendPosition;
import org.apache.poi.ss.usermodel.charts.LineChartData;
import org.apache.poi.ss.usermodel.charts.ScatterChartData;
import org.apache.poi.ss.usermodel.charts.ValueAxis;*/
import org.apache.poi.ss.util.CellRangeAddress;
import org.jeecgframework.poi.excel.graph.constant.ExcelGraphElementType;
import org.jeecgframework.poi.excel.graph.constant.ExcelGraphType;
import org.jeecgframework.poi.excel.graph.entity.ExcelGraph;
import org.jeecgframework.poi.excel.graph.entity.ExcelGraphElement;
import org.jeecgframework.poi.excel.graph.entity.ExcelTitleCell;
import org.jeecgframework.poi.util.PoiCellUtil;
import org.jeecgframework.poi.util.PoiExcelGraphDataUtil;
/**
 * @Description
 * @author liusq
 * @data 2022年1月4号
 */
public class ExcelChartBuildService
{
  /**
   * 
   * @param workbook
   * @param graphList
   * @param build 通过实时数据行来重新计算图形定义
   * @param append
   */
  public static void createExcelChart(Workbook workbook, List<ExcelGraph> graphList, Boolean build, Boolean append)
  {
    if(workbook!=null&&graphList!=null){
      //设定默认第一个sheet为数据项
      Sheet dataSouce=workbook.getSheetAt(0);
      if(dataSouce!=null){
        buildTitle(dataSouce,graphList);
        
        if(build){
          PoiExcelGraphDataUtil.buildGraphData(dataSouce, graphList);
        }
        if(append){
          buildExcelChart(dataSouce, dataSouce, graphList);
        }else{
          Sheet sheet=workbook.createSheet("图形界面");
          buildExcelChart(dataSouce, sheet, graphList);
        }
      }
      
    }
  }
  
  /**
   * 构建基础图形
   * @param drawing 
   * @param anchor
   * @param dataSouce
   * @param graph
   */
  private static void buildExcelChart(Drawing drawing,ClientAnchor anchor,Sheet dataSouce,ExcelGraph graph){
    XDDFChart chart = null;
    // TODO  图表没有成功
    //drawing.createChart(anchor);
    XDDFChartLegend legend = chart.getOrAddLegend();
    legend.setPosition(LegendPosition.TOP_RIGHT);
    
    XDDFChartAxis bottomAxis = chart.createCategoryAxis(AxisPosition.BOTTOM);
        XDDFValueAxis leftAxis = chart.createValueAxis(AxisPosition.LEFT);
        leftAxis.setCrosses(AxisCrosses.AUTO_ZERO);
        ExcelGraphElement categoryElement=graph.getCategory();
        
        XDDFDataSource categoryChart;
        if(categoryElement!=null&& categoryElement.getElementType().equals(ExcelGraphElementType.STRING_TYPE)){
          categoryChart=XDDFDataSourcesFactory.fromStringCellRange((XSSFSheet) dataSouce, new CellRangeAddress(categoryElement.getStartRowNum(),categoryElement.getEndRowNum(),categoryElement.getStartColNum(),categoryElement.getEndColNum()));
        }else{
          categoryChart=XDDFDataSourcesFactory.fromNumericCellRange((XSSFSheet) dataSouce, new CellRangeAddress(categoryElement.getStartRowNum(),categoryElement.getEndRowNum(),categoryElement.getStartColNum(),categoryElement.getEndColNum()));
        }
        
        List<ExcelGraphElement> valueList=graph.getValueList();
        List<XDDFDataSource<Double>> chartValueList= new ArrayList<>();
        if(valueList!=null&&valueList.size()>0){
          for(ExcelGraphElement ele:valueList){
            XDDFDataSource<Double> source=XDDFDataSourcesFactory.fromNumericCellRange((XSSFSheet) dataSouce, new CellRangeAddress(ele.getStartRowNum(),ele.getEndRowNum(),ele.getStartColNum(),ele.getEndColNum()));
            chartValueList.add(source);
          }
        }
        
    if(graph.getGraphType().equals(ExcelGraphType.LINE_CHART)){   
      //buildLineChartData(data, categoryChart, chartValueList, graph.getTitle());
      XDDFLineChartData data = (XDDFLineChartData) chart.createData(ChartTypes.LINE, bottomAxis, leftAxis);
      chart.plot(data);
    }
    else
    {
      XDDFScatterChartData data= (XDDFScatterChartData) chart.createData(ChartTypes.SCATTER, bottomAxis, leftAxis);
      buildScatterChartData(data, categoryChart, chartValueList,graph.getTitle());
      chart.plot(data);
    } 
  }
  
  
  
  
  /**
   * 构建多个图形对象
   * @param dataSouce
   * @param dataSouce2
   * @param graphList
   */
  private static void buildExcelChart(Sheet dataSouce,Sheet dataSouce2,List<ExcelGraph> graphList){
    int len=graphList.size();
    if(len==1)
    {
      buildExcelChart(dataSouce, dataSouce2, (List<ExcelGraph>) graphList.get(0));
    }
    else
    {
      int drawStart=0;
      int drawEnd=20;
      Drawing drawing = PoiExcelGraphDataUtil.getDrawingPatriarch(dataSouce2);
      for(int i=0;i<len;i++){
        ExcelGraph graph=graphList.get(i);
        ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, drawStart, 15, drawEnd);
        buildExcelChart(drawing, anchor, dataSouce, graph);
        drawStart=drawStart+drawEnd;
        drawEnd=drawEnd+drawEnd;
      }
    }
  }
  
  
  
  
  /**
   * 构建图形对象
   * @param dataSourceSheet
   * @param tragetSheet
   * @param graph
   */
  private static void buildExcelChart(XSSFSheet dataSourceSheet,Sheet tragetSheet,ExcelGraph graph){
    Drawing drawing = PoiExcelGraphDataUtil.getDrawingPatriarch(tragetSheet);
    ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 0, 15, 20);
    buildExcelChart(drawing, anchor, dataSourceSheet, graph);
  }
  
  
  
  
  /**
   * 构建Title
   * @param sheet
   * @param graph
   */
  private static void buildTitle(Sheet sheet,ExcelGraph graph){
    int cellTitleLen=graph.getTitleCell().size();
    int titleLen=graph.getTitle().size();
    if(titleLen>0){
      
    }else{
      for(int i=0;i<cellTitleLen;i++){
        ExcelTitleCell titleCell=graph.getTitleCell().get(i);
        if(titleCell!=null){
          graph.getTitle().add(PoiCellUtil.getCellValue(sheet,titleCell.getRow(),titleCell.getCol()));
        }
      }
    }
  }
  
  /**
   * 构建Title
   * @param sheet
   * @param graphList
   */
  private static void buildTitle(Sheet sheet,List<ExcelGraph> graphList){
    if(graphList!=null&&graphList.size()>0){
      for(ExcelGraph graph:graphList){
        if(graph!=null)
        {
          buildTitle(sheet, graph);
        }
      }
    }
  }
  
  /**
   * 
   * @param data
   * @param categoryChart
   * @param chartValueList
   * @param title
   */
  private static void buildLineChartData(XDDFLineChartData data,XDDFDataSource categoryChart,List<XDDFDataSource<Number>> chartValueList,List<String> title){
    if(chartValueList.size()==title.size())
    {
      int len=title.size();
      for(int i=0;i<len;i++){
          //TODO 更新版本
        //data.addSerie(categoryChart, chartValueList.get(i)).setTitle(title.get(i));
      }
    } 
    else
    {
      int i=0;
      for(XDDFDataSource<Number> source:chartValueList){
        String temp_title=title.get(i);
        if(StringUtils.isNotBlank(temp_title)){
          //data.addSerie(categoryChart, source).setTitle(_title);
        }else{
          //data.addSerie(categoryChart, source);
        }
      }
    }
  }
  
  /**
   * 
   * @param data
   * @param categoryChart
   * @param chartValueList
   * @param title
   */
  private static void buildScatterChartData(XDDFScatterChartData data,XDDFDataSource categoryChart,List<XDDFDataSource<Double>> chartValueList,List<String> title){
    if(chartValueList.size()==title.size())
    {
      int len=title.size();
      for(int i=0;i<len;i++){
        data.addSeries(categoryChart, (XDDFNumericalDataSource<? extends Number>) chartValueList.get(i)).setTitle(title.get(i).toString(), null);
      }
    } 
    else
    {
      int i=0;
      for(XDDFDataSource<Double> source:chartValueList){
        String temp_title=title.get(i);
        if(StringUtils.isNotBlank(temp_title)){
          data.addSeries(categoryChart, (XDDFNumericalDataSource<? extends Number>) source).setTitle(temp_title,null);
        }else{
          data.addSeries(categoryChart, (XDDFNumericalDataSource<? extends Number>) source);
        }
      }
    }
  }
  
  
}



相关文章
|
前端开发 Java 数据库连接
Spring Boot 3 整合 Mybatis-Plus 动态数据源实现多数据源切换
Spring Boot 3 整合 Mybatis-Plus 动态数据源实现多数据源切换
|
缓存 前端开发 JavaScript
终极 Nginx 配置指南(全网最详细)
本文详细介绍了Nginx配置文件`nginx.conf`的基本结构及其优化方法。首先通过删除注释简化了原始配置,使其更易理解。接着,文章将`nginx.conf`分为全局块、events块和http块三部分进行详细解析,帮助读者更好地掌握其功能与配置。此外,还介绍了如何通过简单修改实现网站上线,并提供了Nginx的优化技巧,包括解决前端History模式下的404问题、配置反向代理、开启gzip压缩、设置维护页面、在同一IP上部署多个网站以及实现动静分离等。最后,附上了Nginx的基础命令,如安装、启动、重启和关闭等操作,方便读者实践应用。
5241 85
终极 Nginx 配置指南(全网最详细)
|
9月前
|
JSON 搜索推荐 API
京东店铺所有商品接口系列(京东 API)
本文介绍如何使用Python调用京东API获取店铺商品信息。前期需搭建Python环境,安装`requests`库并熟悉`json`库的使用。接口采用POST请求,参数包括`app_key`、`method`、`timestamp`、`v`、`sign`和业务参数`360buy_param_json`。通过示例代码展示如何生成签名并发送请求。应用场景涵盖店铺管理、竞品分析、数据统计及商品推荐系统,帮助商家优化运营和提升竞争力。
347 23
|
负载均衡 监控 Java
SpringCloud常见面试题(一):SpringCloud 5大组件,服务注册和发现,nacos与eureka区别,服务雪崩、服务熔断、服务降级,微服务监控
SpringCloud常见面试题(一):SpringCloud 5大组件,服务注册和发现,nacos与eureka区别,服务雪崩、服务熔断、服务降级,微服务监控
23722 7
SpringCloud常见面试题(一):SpringCloud 5大组件,服务注册和发现,nacos与eureka区别,服务雪崩、服务熔断、服务降级,微服务监控
|
存储 前端开发 Java
基于springboot的java读取文档内容(超简单)
基于springboot的java读取文档内容(超简单)
843 0
|
Java Apache Maven
Java中使用poi+poi-tl实现根据模板导出word文档
这个过程不仅简化了文档生成的工作,而且保证了生成文档的一致性与准确性,特别适合于那些需要生成大量文档的自动化场景。通过以上步骤,Java开发人员可以实现高效、可靠的Word文档导出功能。
3017 0
|
JavaScript
cnpm 的安装与使用
本文介绍了npm和cnpm的概念、安装nodejs的步骤,以及cnpm的安装和使用方法,提供了通过配置npm使用中国镜像源来加速包下载的替代方案,并说明了如何恢复npm默认仓库地址。
cnpm 的安装与使用
|
JavaScript 前端开发 安全
【Vue3 + Vite】6个非常强大的后台管理项目!开源且免费!
【Vue3 + Vite】6个非常强大的后台管理项目!开源且免费!
|
Java Shell 开发者
都2024年了!你还不知道在Docker中安装jdk?
都2024年了!你还不知道在Docker中安装jdk?
2719 0
|
XML Java 关系型数据库
Action:Consider the following: If you want an embedde ,springBoot配置数据库,补全springBoot的xml和mysql配置信息就好了
Action:Consider the following: If you want an embedde ,springBoot配置数据库,补全springBoot的xml和mysql配置信息就好了