java实现将数据生成图表至excel导出

注意导出Execl表格用Get请求 如:

function aa(){

       location.href = 'workList/exportListExport.action?start_date='+参数的值+'&end_date='+参数的值;

}

比如:经过查询展示到前端页面数据如下图:

 我们如果想把“饼状图”导入到我们EXCEL表格中如下图:

 思想打开就是使用jfree图表绘制类库绘制图表,并生成到本地或读取至输出流用于在excel中生成,使用POI操作EXECL:

首先导入需要的pom

<properties>
        <poi-version>3.11</poi-version> </properties> <dependencies> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>${poi-version}</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>${poi-version}</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml-schemas</artifactId> <version>${poi-version}</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>ooxml-schemas</artifactId> <version>1.1</version> </dependency> <!-- 以上是操作excel的pom-->
<!-- https://mvnrepository.com/artifact/jfree/jcommon --> <dependency> <groupId>jfree</groupId> <artifactId>jcommon</artifactId> <version>1.0.16</version> </dependency> <!-- https://mvnrepository.com/artifact/jfree/jfreechart --> <dependency> <groupId>jfree</groupId> <artifactId>jfreechart</artifactId> <version>1.0.13</version> </dependency> </dependencies>

代码如下:

生成饼图:

import org.apache.poi.hssf.usermodel.HSSFClientAnchor; import org.apache.poi.hssf.usermodel.HSSFPatriarch; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartUtilities; import org.jfree.chart.JFreeChart; import org.jfree.chart.labels.StandardPieSectionLabelGenerator; import org.jfree.chart.plot.PiePlot; import org.jfree.data.general.DefaultPieDataset; import java.awt.*; import java.io.ByteArrayOutputStream; import java.io.FileOutputStream; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; public class TestPoiAndJfreeChart { public static void main(String[] args) throws Exception { // excel2003工作表 HSSFWorkbook wb = new HSSFWorkbook(); // 创建工作表 HSSFSheet sheet = wb.createSheet("Sheet 1"); // 创建字节输出流 ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream(); //如 果不使用Font,中文将显示不出来 Font font = new Font("新宋体", Font.BOLD, 15); // 创建数据:饼状图就是名称和值(比例) Map<String, Double> map=new HashMap<String, Double>(); map.put("录播主机", (double) 1000);//名称,值 map.put("编码器", (double) 700); map.put("摄像机", (double) 600); map.put("流转码服务器", (double) 400);//这里参数写死了用的时候换成你自己参数就行了 // 创建JFreeChart JFreeChart chart = createPort("故障分析图表", map, font); // 读取chart信息至字节输出流 ChartUtilities.writeChartAsPNG(byteArrayOut, chart, 600, 300); // 画图的顶级管理器,一个sheet只能获取一个(一定要注意这点) HSSFPatriarch patriarch = sheet.createDrawingPatriarch(); // anchor主要用于设置图片的属性 HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0, (short) 2, (short) 1, (short) 12, (short) 15); anchor.setAnchorType(3); // 插入图片 patriarch.createPicture(anchor, wb.addPicture(byteArrayOut.toByteArray(), HSSFWorkbook.PICTURE_TYPE_PNG)); // excel2003后缀 // FileOutputStream fileOut = new FileOutputStream("h://myExcel4.xls");
// HttpServletResponse httpResponse
下载相应到浏览器
String file_name = System.currentTimeMillis ()+"";
httpResponse.setContentType("application/force-download");
httpResponse.addHeader("Content-Disposition", "attachment;fileName=" + file_name);
httpResponse.setContentType("application/octet-stream;charset=UTF-8");
httpResponse.setHeader("Content-Disposition", "attachment;filename="+ file_name+".xls");
httpResponse.addHeader("Pargam", "no-cache");
httpResponse.addHeader("Cache-Control", "no-cache");
//输出
OutputStream outputStream = httpResponse.getOutputStream();
wb.write(outputStream);

wb.write(fileOut); fileOut.close(); } // title 标题 datas //数据 font 字体 public static JFreeChart createPort(String title, Map<String, Double> datas, Font font) { try { Set<Map.Entry<String, Double>> set = datas.entrySet(); DefaultPieDataset pds = new DefaultPieDataset(); Iterator iterator = set.iterator(); Map.Entry entry; while (iterator.hasNext()) { entry = (Map.Entry) iterator.next(); pds.setValue(entry.getKey().toString(), Double.parseDouble(entry.getValue().toString())); } // 生成一个饼图的图表:显示图表的标题、组装的数据、是否显示图例、是否生成贴士以及是否生成URL链接 JFreeChart chart = ChartFactory.createPieChart(title, pds, true, false, true); // 设置图片标题的字体 chart.getTitle().setFont(font); // 得到图块,准备设置标签的字体 PiePlot plot = (PiePlot) chart.getPlot(); //设置分裂效果,需要指定分裂出去的key // plot.setExplodePercent("摄像机", 0.1); 分裂效果,可选 // 设置标签字体 plot.setLabelFont(font); // 设置图例项目字体 chart.getLegend().setItemFont(font); // 设置开始角度 // plot.setStartAngle(new Float(3.14f / 2f)); 开始角度,意义不大 //设置plot的前景色透明度 plot.setForegroundAlpha(0.7f); //设置plot的背景色透明度 plot.setBackgroundAlpha(0.0f); //设置标签生成器(默认{0}) //{0}:key {1}:value {2}:百分比 {3}:sum plot.setLabelGenerator(new StandardPieSectionLabelGenerator("{0}({1})/{2}")); // 一般在{1}后面加单位,如:{0}({1}次)/{2} //将内存中的图片写到本地硬盘 // ChartUtilities.saveChartAsJPEG(new File("H:/a.png"), chart, 600, 300); return chart; } catch (Exception e) { e.printStackTrace(); return null; } } }

4.2 生成折线图

import org.apache.poi.hssf.usermodel.HSSFClientAnchor; import org.apache.poi.hssf.usermodel.HSSFPatriarch; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartUtilities; import org.jfree.chart.JFreeChart; import org.jfree.chart.plot.CategoryPlot; import org.jfree.chart.plot.PlotOrientation; import org.jfree.data.category.DefaultCategoryDataset; import java.awt.*; import java.io.ByteArrayOutputStream; import java.io.FileOutputStream; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; public class TestPoiAndJfreeChart1 { public static void main(String[] args) throws Exception { // excel2003工作表 HSSFWorkbook wb = new HSSFWorkbook(); // 创建工作表 HSSFSheet sheet = wb.createSheet("Sheet 1"); // 创建字节输出流 ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream(); //如 果不使用Font,中文将显示不出来 Font font = new Font("新宋体", Font.BOLD, 15); // 创建数据 Map<String, Map<String, Double>> datas =new HashMap<String, Map<String,Double>>(); Map<String, Double> map1=new HashMap<String, Double>(); Map<String, Double> map2=new HashMap<String, Double>(); Map<String, Double> map3=new HashMap<String, Double>(); Map<String, Double> map4=new HashMap<String, Double>(); Map<String, Double> map5=new HashMap<String, Double>(); map1.put("故障数量", (double) 20); map2.put("故障数量", (double) 30); map3.put("故障数量", (double) 25); map4.put("故障数量", (double) 50); map5.put("故障数量", (double) 40); //压入数据 datas.put("一月", map1); datas.put("二月", map2); datas.put("三月", map3); datas.put("四月", map4); datas.put("五月", map5); JFreeChart chart = createPort("故障数量-时间曲线", datas, "月份", "故障次数(次)", font); // 读取chart信息至字节输出流 ChartUtilities.writeChartAsPNG(byteArrayOut, chart, 600, 300); // 画图的顶级管理器,一个sheet只能获取一个(一定要注意这点) HSSFPatriarch patriarch = sheet.createDrawingPatriarch(); // anchor主要用于设置图片的属性 HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0, (short) 2, (short) 1, (short) 12, (short) 15); anchor.setAnchorType(3); // 插入图片 patriarch.createPicture(anchor, wb.addPicture(byteArrayOut.toByteArray(), HSSFWorkbook.PICTURE_TYPE_PNG)); // excel2003后缀 FileOutputStream fileOut = new FileOutputStream("h://myExcel5.xls"); wb.write(fileOut); fileOut.close(); } public static JFreeChart createPort(String title, Map<String, Map<String, Double>> datas, String type, String unit, Font font) { try { DefaultCategoryDataset ds = new DefaultCategoryDataset(); Set<Map.Entry<String, Map<String, Double>>> set1 = datas.entrySet(); Iterator iterator1 = set1.iterator(); Iterator iterator2; HashMap<String, Double> map; Set<Map.Entry<String, Double>> set2; Map.Entry entry1; Map.Entry entry2; while (iterator1.hasNext()) { entry1 = (Map.Entry) iterator1.next(); map = (HashMap<String, Double>) entry1.getValue(); set2 = map.entrySet(); iterator2 = set2.iterator(); while (iterator2.hasNext()) { entry2 = (Map.Entry) iterator2.next(); ds.setValue(Double.parseDouble(entry2.getValue().toString()), entry2.getKey().toString(), entry1.getKey().toString()); } } //创建折线图,折线图分水平显示和垂直显示两种 // //2D折线图 JFreeChart chart = ChartFactory.createLineChart(title, type, unit, ds, PlotOrientation.VERTICAL, true, true, true); // //3D折线图 // JFreeChart chart2 = ChartFactory.createLineChart3D(title, type, unit, ds, PlotOrientation.VERTICAL, true, true, false); //设置整个图片的标题字体 chart.getTitle().setFont(font); //设置提示条字体 font = new Font("宋体", Font.BOLD, 15); chart.getLegend().setItemFont(font); //得到绘图区 CategoryPlot plot = (CategoryPlot) chart.getPlot(); //得到绘图区的域轴(横轴),设置标签的字体 plot.getDomainAxis().setLabelFont(font); //设置横轴标签项字体 plot.getDomainAxis().setTickLabelFont(font); //设置范围轴(纵轴)字体 font = new Font("宋体", Font.BOLD, 18); plot.getRangeAxis().setLabelFont(font); // plot.setForegroundAlpha(1.0f); return chart; } catch (Exception e) { e.printStackTrace(); return null; } } } 

 4.3 生成柱状图

import org.apache.poi.hssf.usermodel.HSSFClientAnchor; import org.apache.poi.hssf.usermodel.HSSFPatriarch; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartUtilities; import org.jfree.chart.JFreeChart; import org.jfree.chart.labels.StandardPieSectionLabelGenerator; import org.jfree.chart.plot.CategoryPlot; import org.jfree.chart.plot.PiePlot; import org.jfree.chart.plot.PlotOrientation; import org.jfree.data.category.DefaultCategoryDataset; import org.jfree.data.general.DefaultPieDataset; import java.awt.*; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; public class TestPoiAndJfreeChart2 { public static void main(String[] args) throws Exception { // excel2003工作表 HSSFWorkbook wb = new HSSFWorkbook(); // 创建工作表 HSSFSheet sheet = wb.createSheet("Sheet 1"); // 创建字节输出流 ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream(); //如 果不使用Font,中文将显示不出来 Font font = new Font("新宋体", Font.BOLD, 15); // 创建数据 Map<String, Map<String, Double>> datas =new HashMap<String, Map<String,Double>>(); Map<String, Double> map1=new HashMap<String, Double>(); Map<String, Double> map2=new HashMap<String, Double>(); Map<String, Double> map3=new HashMap<String, Double>(); map1.put("故障数", (double) 1000); map2.put("故障数", (double) 1300); map3.put("故障数", (double) 1000); //压入数据 datas.put("设备网络掉线", map1); datas.put("CPU利用率高", map2); datas.put("磁盘占用高", map3); JFreeChart chart = createPort("故障类型比例",datas,"故障类型","数量单位(个)",font); // 读取chart信息至字节输出流 ChartUtilities.writeChartAsPNG(byteArrayOut, chart, 600, 300); // 画图的顶级管理器,一个sheet只能获取一个(一定要注意这点) HSSFPatriarch patriarch = sheet.createDrawingPatriarch(); // anchor主要用于设置图片的属性 HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0, (short) 2, (short) 1, (short) 12, (short) 15); anchor.setAnchorType(3); // 插入图片 patriarch.createPicture(anchor, wb.addPicture(byteArrayOut.toByteArray(), HSSFWorkbook.PICTURE_TYPE_PNG)); // excel2003后缀 FileOutputStream fileOut = new FileOutputStream("h://myExcel6.xls"); wb.write(fileOut); fileOut.close(); } public static JFreeChart createPort(String title,Map<String,Map<String,Double>> datas,String type,String danwei,Font font){ try { //种类数据集 DefaultCategoryDataset ds = new DefaultCategoryDataset(); //获取迭代器: Set<Map.Entry<String, Map<String, Double>>> set1 = datas.entrySet(); Iterator iterator1= set1.iterator(); Iterator iterator2; HashMap<String, Double> map; Set<Map.Entry<String,Double>> set2; Map.Entry entry1; Map.Entry entry2; while(iterator1.hasNext()){ entry1=(Map.Entry) iterator1.next(); map=(HashMap<String, Double>) entry1.getValue(); set2=map.entrySet(); iterator2=set2.iterator(); while (iterator2.hasNext()) { entry2= (Map.Entry) iterator2.next(); ds.setValue(Double.parseDouble(entry2.getValue().toString()), entry2.getKey().toString(), entry1.getKey().toString()); } } //创建柱状图,柱状图分水平显示和垂直显示两种 JFreeChart chart = ChartFactory.createBarChart(title, type, danwei, ds, PlotOrientation.VERTICAL, true, true, true); //设置整个图片的标题字体 chart.getTitle().setFont(font); //设置提示条字体 font = new Font("宋体", Font.BOLD, 15); chart.getLegend().setItemFont(font); //得到绘图区 CategoryPlot plot = (CategoryPlot) chart.getPlot(); //得到绘图区的域轴(横轴),设置标签的字体 plot.getDomainAxis().setLabelFont(font); //设置横轴标签项字体 plot.getDomainAxis().setTickLabelFont(font); //设置范围轴(纵轴)字体 plot.getRangeAxis().setLabelFont(font); plot.setForegroundAlpha(1.0f); return chart; } catch (Exception e) { e.printStackTrace(); return null; } } }





 方法二:

public class JFreeChartUtil {
    public static void main(String[] args) {
        DefaultPieDataset pds = new DefaultPieDataset();
        pds.setValue("00点-04点", 100);
        pds.setValue("04点-08点", 200);
        pds.setValue("08点-12点", 300);
        pds.setValue("12点-16点", 400);
        pds.setValue("16点-20点", 500);
        pds.setValue("20点-24点", 600);
    String filePath = "d:/pie.jpg";
    createPieChart(pds,filePath);
   }
    
    public static void createPieChart(DefaultPieDataset pds, String filePath) {
        try {
            // 分别是:显示图表的标题、需要提供对应图表的DateSet对象、是否显示图例、是否生成贴士以及是否生成URL链接
            JFreeChart chart = ChartFactory.createPieChart("今日放屁次数:时间段分布图", pds, false, false, true);
            // 如果不使用Font,中文将显示不出来
            Font font = new Font("宋体", Font.BOLD, 12);
            // 设置图片标题的字体
            chart.getTitle().setFont(font);
            // 得到图块,准备设置标签的字体
            PiePlot plot = (PiePlot) chart.getPlot();
            // 设置标签字体
            plot.setLabelFont(font);
            plot.setStartAngle(new Float(3.14f / 2f));
            // 设置plot的前景色透明度
            plot.setForegroundAlpha(0.7f);
            // 设置plot的背景色透明度
            plot.setBackgroundAlpha(0.0f);
            // 设置标签生成器(默认{0})
            // {0}:key {1}:value {2}:百分比 {3}:sum
            plot.setLabelGenerator(new StandardPieSectionLabelGenerator("{0}({1}占{2})"));
            // 将内存中的图片写到本地硬盘
            ChartUtilities.saveChartAsJPEG(new File(filePath), chart, 600, 300);
        } catch (Exception e) {
            e.printStackTrace();
        }  
    }
}

 生成折线图的代码:

public class JFreeChartUtil {
    public static void main(String[] args) {
        DefaultCategoryDataset ds = new DefaultCategoryDataset();
        ds.setValue(10, "ibm", "2018-05-21");
        ds.setValue(20, "ibm", "2018-05-22");
        ds.setValue(32, "ibm", "2018-05-23");
        ds.setValue(25, "ibm", "2018-05-24");
        ds.setValue(0, "ibm", "2018-05-25");
        ds.setValue(4, "ibm", "2018-05-26");
        ds.setValue(32, "ibm", "2018-05-27");
        ds.setValue(0, "ibm", "2018-05-28");
        ds.setValue(358, "ibm", "2018-05-29");
        ds.setValue(4, "ibm", "2018-05-30");
    String filePath = "d:/lgg.jpg";
    createPieChart(pds,filePath);
   }
    
   public static void createLineChart(DefaultCategoryDataset ds, String filePath) {
        try {
            // 创建柱状图.标题,X坐标,Y坐标,数据集合,orientation,是否显示legend,是否显示tooltip,是否使用url链接
            JFreeChart chart = ChartFactory.createLineChart("近30天每日放屁次数趋势图", "", "次数", ds, PlotOrientation.VERTICAL,false, true, true);
            chart.setBackgroundPaint(Color.WHITE);
            Font font = new Font("宋体", Font.BOLD, 12);
            chart.getTitle().setFont(font);
            chart.setBackgroundPaint(Color.WHITE);
            // 配置字体(解决中文乱码的通用方法)
            Font xfont = new Font("仿宋", Font.BOLD, 12); // X轴
            Font yfont = new Font("宋体", Font.BOLD, 12); // Y轴
            Font titleFont = new Font("宋体", Font.BOLD, 12); // 图片标题
            CategoryPlot categoryPlot = chart.getCategoryPlot();
            categoryPlot.getDomainAxis().setLabelFont(xfont);
            categoryPlot.getDomainAxis().setLabelFont(xfont);
            categoryPlot.getRangeAxis().setLabelFont(yfont);
            chart.getTitle().setFont(titleFont);
            categoryPlot.setBackgroundPaint(Color.WHITE);
            // x轴 // 分类轴网格是否可见
            categoryPlot.setDomainGridlinesVisible(true);
            // y轴 //数据轴网格是否可见
            categoryPlot.setRangeGridlinesVisible(true);
            // 设置网格竖线颜色
            categoryPlot.setDomainGridlinePaint(Color.LIGHT_GRAY);
            // 设置网格横线颜色
            categoryPlot.setRangeGridlinePaint(Color.LIGHT_GRAY);
            // 没有数据时显示的文字说明
            categoryPlot.setNoDataMessage("没有数据显示");
            // 设置曲线图与xy轴的距离
            categoryPlot.setAxisOffset(new RectangleInsets(0d, 0d, 0d, 0d));
            // 设置面板字体
            Font labelFont = new Font("SansSerif", Font.TRUETYPE_FONT, 12);
            // 取得Y轴
            NumberAxis rangeAxis = (NumberAxis) categoryPlot.getRangeAxis();
            rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
            rangeAxis.setAutoRangeIncludesZero(true);
            rangeAxis.setUpperMargin(0.20);
            rangeAxis.setLabelAngle(Math.PI / 2.0);
            // 取得X轴
            CategoryAxis categoryAxis = (CategoryAxis) categoryPlot.getDomainAxis();
            // 设置X轴坐标上的文字
            categoryAxis.setTickLabelFont(labelFont);
            // 设置X轴的标题文字
            categoryAxis.setLabelFont(labelFont);
            // 横轴上的 Lable 45度倾斜
            categoryAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);
            // 设置距离图片左端距离
            categoryAxis.setLowerMargin(0.0);
            // 设置距离图片右端距离
            categoryAxis.setUpperMargin(0.0);
            // 获得renderer 注意这里是下嗍造型到lineandshaperenderer!!
            LineAndShapeRenderer lineandshaperenderer = (LineAndShapeRenderer) categoryPlot.getRenderer();
            // 是否显示折点
            lineandshaperenderer.setBaseShapesVisible(true);
            // 是否显示折线
            lineandshaperenderer.setBaseLinesVisible(true);
            // series 点(即数据点)间有连线可见 显示折点数据
            lineandshaperenderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
            lineandshaperenderer.setBaseItemLabelsVisible(true);
            ChartUtilities.saveChartAsJPEG(new File(filePath), chart, 1207, 500);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
效果:

如果想多条折线需要改:

       ds.setValue(10, "ibm", "2018-05-21");
        ds.setValue(20, "ibm", "2018-05-22");
        ds.setValue(32, "ibm", "2018-05-23");
        ds.setValue(25, "ibm", "2018-05-24");
        ds.setValue(0, "ibm", "2018-05-25");
        ds.setValue(4, "ibm", "2018-05-26");
        ds.setValue(32, "ibm", "2018-05-27");
        ds.setValue(0, "ibm", "2018-05-28");
        ds.setValue(358, "ibm", "2018-05-29");
        ds.setValue(4, "ibm", "2018-05-30");

改成:

        ds.setValue(10, "ibm", "2018-05-21");
        ds.setValue(20, "google", "2018-05-22");
        ds.setValue(32, "google", "2018-05-23");
        ds.setValue(25, "ibm", "2018-05-24")

使用POI在Excel中动态生成图表工具类

<dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi</artifactId>
      <version>3.17</version>
    </dependency>
    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi-scratchpad</artifactId>
      <version>3.17</version>
    </dependency>
    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi-ooxml</artifactId>
      <version>3.17</version>
    </dependency>
    <dependency>
      <groupId>fr.opensagres.xdocreport</groupId>
      <artifactId>xdocreport</artifactId>
      <version>1.0.6</version>
    </dependency>
    <dependency>  
        <groupId> fr.opensagres.xdocreport</groupId>  
        <artifactId> org.apache.poi.xwpf.converter.core</artifactId>  
        <version> 1.0.6</version>  
    </dependency>  
    <dependency>
        <groupId>fr.opensagres.xdocreport</groupId>
        <artifactId>org.apache.poi.xwpf.converter.xhtml</artifactId>
        <version>1.0.6</version>
        </dependency>
    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi-ooxml-schemas</artifactId>
      <version>3.17</version>
    </dependency>
    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>ooxml-schemas</artifactId>
      <version>1.3</version>
    </dependency>

工具类:

public class ExcelChartUtil {

public static void main(String[] args) throws Exception {
    boolean result=false;
    List<BaseFormMap> dataList=new ArrayList<BaseFormMap>();//数据
    List<String> fldNameArr = new ArrayList<String>();// 字段名
    List<String> titleArr = new ArrayList<String>();// 标题
    BaseFormMap baseFormMap=new BaseFormMap();
    List<String> showtailArr=new ArrayList<String>();
    List<String> ispercentArr=new ArrayList<String>();
    baseFormMap.put("value1", "股票");
    baseFormMap.put("value2", new BigDecimal(new java.util.Random().nextDouble()));
    baseFormMap.put("value3", new BigDecimal(new java.util.Random().nextDouble()));
    baseFormMap.put("value4", new BigDecimal(new java.util.Random().nextDouble()));
    
    BaseFormMap baseFormMap1=new BaseFormMap();
    baseFormMap1.put("value1", "货币型基金");
    baseFormMap1.put("value2", new BigDecimal(new java.util.Random().nextDouble()));
    baseFormMap1.put("value3", new BigDecimal(new java.util.Random().nextDouble()));
    baseFormMap1.put("value4", new BigDecimal(new java.util.Random().nextDouble()));
    
    BaseFormMap baseFormMap2=new BaseFormMap();
    baseFormMap2.put("value1", "可转债");
    baseFormMap2.put("value2", new BigDecimal(new java.util.Random().nextDouble()));
    baseFormMap2.put("value3", new BigDecimal(new java.util.Random().nextDouble()));
    baseFormMap2.put("value4", new BigDecimal(new java.util.Random().nextDouble()));
    
    BaseFormMap baseFormMap3=new BaseFormMap();
    baseFormMap3.put("value1", "买入返售");
    baseFormMap3.put("value2", new BigDecimal(new java.util.Random().nextDouble()));
    baseFormMap3.put("value3", new BigDecimal(new java.util.Random().nextDouble()));
    baseFormMap3.put("value4", new BigDecimal(new java.util.Random().nextDouble()));
    
    BaseFormMap baseFormMap4=new BaseFormMap();
    baseFormMap4.put("value1", "通知存款");
    baseFormMap4.put("value2", new BigDecimal(new java.util.Random().nextDouble()));
    baseFormMap4.put("value3", new BigDecimal(new java.util.Random().nextDouble()));
    baseFormMap4.put("value4", new BigDecimal(new java.util.Random().nextDouble()));
    
    BaseFormMap baseFormMap5=new BaseFormMap();
    baseFormMap5.put("value1", "当月累计");
    baseFormMap5.put("value2", new BigDecimal(new java.util.Random().nextDouble()));
    baseFormMap5.put("value3", new BigDecimal(new java.util.Random().nextDouble()));
    baseFormMap5.put("value4", new BigDecimal(new java.util.Random().nextDouble()));
    
    fldNameArr.add("value1");
    fldNameArr.add("value2");
    fldNameArr.add("value3");
    fldNameArr.add("value4");
    
    titleArr.add("类型");
    titleArr.add("买入");
    titleArr.add("卖出");
    titleArr.add("分红");
    
    showtailArr.add("0");
    showtailArr.add("2");
    showtailArr.add("2");
    showtailArr.add("2");
    
    ispercentArr.add("0");
    ispercentArr.add("1");
    ispercentArr.add("1");
    ispercentArr.add("1");
    
    dataList.add(baseFormMap);
    dataList.add(baseFormMap1);
    dataList.add(baseFormMap2);
    dataList.add(baseFormMap3);
    dataList.add(baseFormMap4);
    dataList.add(baseFormMap5);
    
    
    SXSSFWorkbook wb = new SXSSFWorkbook();
    SXSSFSheet sheet = wb.createSheet("Sheet1");
    
    result=createChart(wb,sheet,10,"bar",STBarGrouping.STACKED,false,false,dataList, fldNameArr, titleArr,showtailArr,ispercentArr);
    
    result=createChart(wb,sheet,10+dataList.size()+12,"bar",STBarGrouping.CLUSTERED,true,true,dataList, fldNameArr, titleArr,showtailArr,ispercentArr);
    
    
    
    
    //System.out.println(ctChart);
    System.out.println(result);

    FileOutputStream fileOut = new FileOutputStream("D://BarChart.xlsx");
    wb.write(fileOut);
    fileOut.close();
}

/**
 * @Description: 创建Excel数据
 * @param wb:工作薄
 * @param sheet:wb.createSheet();
 * @param sheetName:sheet名称
 * @param dataList
 * @param fldNameArr
 * @param titleArr
 * @param showtailArr
 * @param ispercentArr
 * @param position:从第几行开始(0:就是第一行)
 * @return boolean
 */
public static boolean refreshChartExcel(SXSSFWorkbook wb,SXSSFSheet sheet,
        List<BaseFormMap> dataList,List<String> fldNameArr,List<String> titleArr,
        List<String> showtailArr,List<String> ispercentArr,int position) {
    boolean result = true;
    //样式准备
    CellStyle style = wb.createCellStyle();
    style.setFillForegroundColor(IndexedColors.ROYAL_BLUE.getIndex());
    style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
    style.setBorderBottom(BorderStyle.THIN); //下边框
    style.setBorderLeft(BorderStyle.THIN);//左边框
    style.setBorderTop(BorderStyle.THIN);//上边框
    style.setBorderRight(BorderStyle.THIN);//右边框
    style.setAlignment(HorizontalAlignment.CENTER);
    
    CellStyle style1 = wb.createCellStyle();
    style1.setBorderBottom(BorderStyle.THIN); //下边框
    style1.setBorderLeft(BorderStyle.THIN);//左边框
    style1.setBorderTop(BorderStyle.THIN);//上边框
    style1.setBorderRight(BorderStyle.THIN);//右边框
    style1.setAlignment(HorizontalAlignment.CENTER);
   
    CellStyle cellStyle = wb.createCellStyle();
    cellStyle.setBorderTop(BorderStyle.THIN);//上边框
    cellStyle.setBorderBottom(BorderStyle.THIN); //下边框
    cellStyle.setBorderLeft(BorderStyle.THIN);//左边框
    cellStyle.setBorderRight(BorderStyle.THIN);//右边框
    cellStyle.setAlignment(HorizontalAlignment.CENTER);//水平对齐方式
    //cellStyle.setVerticalAlignment(VerticalAlignment.TOP);//垂直对齐方式
    
    //根据数据创建excel第一行标题行
    for (int i = 0; i < titleArr.size(); i++) {
        if(sheet.getRow(position)==null){
            sheet.createRow(position).createCell(i).setCellValue(titleArr.get(i)==null?"":titleArr.get(i));
            
        }else{
            sheet.getRow(position).createCell(i).setCellValue(titleArr.get(i)==null?"":titleArr.get(i));
        }
        //标题行创建背景颜色
        sheet.getRow(position).getCell(i).setCellStyle(style);
    }
    
    //遍历数据行
    for (int i = 0; i < dataList.size(); i++) {
        BaseFormMap baseFormMap = dataList.get(i);//数据行
        //fldNameArr字段属性
        for (int j = 0; j < fldNameArr.size(); j++) {
            if(sheet.getRow(position+i+1)==null){
                if(j==0){
                    try {
                        sheet.createRow(position+i+1).createCell(j).setCellValue(baseFormMap.getStr(fldNameArr.get(j))==null?"":baseFormMap.getStr(fldNameArr.get(j)));
                    } catch (Exception e) {
                        if(baseFormMap.getStr(fldNameArr.get(j))==null){
                            sheet.createRow(position+i+1).createCell(j).setCellValue("");
                        }else{
                            sheet.createRow(position+i+1).createCell(j).setCellValue(baseFormMap.getDate(fldNameArr.get(j)));
                        }
                    }
                }
                //标题行创建背景颜色
                sheet.getRow(position+i+1).getCell(j).setCellStyle(style1);
            }else{
                BigDecimal b=baseFormMap.getBigDecimal(fldNameArr.get(j));
                double value=0d;
                if(b!=null){
                    value=b.doubleValue();
                }
                if(value==0){
                    sheet.getRow(position+i+1).createCell(j);
                }else{
                    sheet.getRow(position+i+1).createCell(j).setCellValue(baseFormMap.getBigDecimal(fldNameArr.get(j)).doubleValue());
                }
                if("1".equals(ispercentArr.get(j))){//是否设置百分比
                    // 设置Y轴的数字为百分比样式显示
                    StringBuilder sb=new StringBuilder();
                    
                    if("0".equals(showtailArr.get(j))){//保留几位小数
                        sb.append("0");
                        if("1".equals(ispercentArr.get(j))){//是否百分比
                            sb.append("%");
                        }
                    }else{
                        sb.append("0.");
                        for(int k=0;k<Integer.parseInt(showtailArr.get(j));k++){
                            sb.append("0");
                        }
                        if("1".equals(ispercentArr.get(j))){//是否百分比
                            sb.append("%");
                        }
                    }
                    cellStyle.setDataFormat(wb.createDataFormat().getFormat(sb.toString()));
                    sheet.getRow(position+i+1).getCell(j).setCellStyle(cellStyle);
                }else{
                    //是否设置百分比
                    // 设置Y轴的数字为百分比样式显示
                    StringBuilder sb=new StringBuilder();
                    
                    if("0".equals(showtailArr.get(j))){//保留几位小数
                        sb.append("0");
                    }else{
                        sb.append("0.");
                        for(int k=0;k<Integer.parseInt(showtailArr.get(j));k++){
                            sb.append("0");
                        }
                    }
                    cellStyle.setDataFormat(wb.createDataFormat().getFormat(sb.toString()));
                    sheet.getRow(position+i+1).getCell(j).setCellStyle(cellStyle);
                }
            }
        }
        
    }
    return result;
}

/**
 * @Description:创建动态图
 * @param wb
 * @param sheet
 * @param sheetName
 * @param curRow:当前行号
 * @param type:图类型
 * @param group:柱状图类型 @see STBarGrouping
 * @param isLegend:是否添加图注
 * @param isvalAxis:是否添加Y左轴
 * @param dataList:数据
 * @param fldNameArr:属性
 * @param titleArr:标题
 * @param showtailArr:保留几位小数
 * @param ispercentArr:是否百分比
 * @return
 */
public static boolean createChart(SXSSFWorkbook wb,SXSSFSheet sheet, int curRow,String type, Enum group,boolean isLegend,boolean isvalAxis, List<BaseFormMap> dataList, List<String> fldNameArr, List<String> titleArr,List<String> showtailArr,List<String> ispercentArr) {
    boolean result=false;
    String sheetName=sheet.getSheetName();
    //动态表sheet刷新
    result=refreshChartExcel(wb, sheet,dataList, fldNameArr, titleArr, showtailArr, ispercentArr, curRow);
    
    //创建一个画布
    SXSSFDrawing drawing = sheet.createDrawingPatriarch();
    
    //前四个默认0,[0,5]:从0列5行开始;[6,20]:宽度6,20向下扩展到20行
    //默认宽度(14-8)*12
    ClientAnchor anchor =null;
    if(dataList.size()<10){
        anchor=drawing.createAnchor(0, 0, 0, 0, 0, curRow+dataList.size()+1, 6, curRow+dataList.size()+12);
    }else{
        anchor=drawing.createAnchor(0, 0, 0, 0, 0, curRow+dataList.size()+1, (int)Math.round(dataList.size()*0.5), curRow+dataList.size()+12);
    }
    

    //创建一个chart对象
    Chart chart = drawing.createChart(anchor);
    CTChart ctChart = ((XSSFChart)chart).getCTChart();
    CTPlotArea ctPlotArea = ctChart.getPlotArea();
    if("bar".equals(type)){
         CTBarChart ctBarChart = ctPlotArea.addNewBarChart();
         CTBoolean ctBoolean=ctBarChart.addNewVaryColors();
         ctBarChart.getVaryColors().setVal(true);
         
         //设置类型
         ctBarChart.addNewGrouping().setVal(group);
         ctBoolean.setVal(true);
         ctBarChart.addNewBarDir().setVal(STBarDir.COL);
        
         //是否添加左侧坐标轴
         ctChart.addNewDispBlanksAs().setVal(STDispBlanksAs.ZERO);
         ctChart.addNewShowDLblsOverMax().setVal(true);
         
         //设置这两个参数是为了在STACKED模式下生成堆积模式;(standard)标准模式时需要将这两行去掉
         if("stacked".equals(group.toString())||"percentStacked".equals(group.toString())){
              ctBarChart.addNewGapWidth().setVal(150);
              ctBarChart.addNewOverlap().setVal((byte)100);
         }
        
         //创建序列,并且设置选中区域
         for (int i = 0; i < fldNameArr.size()-1; i++) {
             CTBarSer ctBarSer = ctBarChart.addNewSer();
             CTSerTx ctSerTx = ctBarSer.addNewTx();
             //图例区
             CTStrRef ctStrRef = ctSerTx.addNewStrRef();
             String legendDataRange = new CellRangeAddress(curRow,curRow, i+1, i+1).formatAsString(sheetName, true);
             ctStrRef.setF(legendDataRange);
             ctBarSer.addNewIdx().setVal(i);  
            
             //横坐标区
             CTAxDataSource cttAxDataSource = ctBarSer.addNewCat();
             ctStrRef = cttAxDataSource.addNewStrRef();
                String axisDataRange = new CellRangeAddress(curRow+1, curRow+dataList.size(), 0, 0)
             .formatAsString(sheetName, true);
             ctStrRef.setF(axisDataRange);
            
             //数据区域
             CTNumDataSource ctNumDataSource = ctBarSer.addNewVal();
             CTNumRef ctNumRef = ctNumDataSource.addNewNumRef();
             String numDataRange = new CellRangeAddress(curRow+1, curRow+dataList.size(), i+1, i+1)
             .formatAsString(sheetName, true);
             ctNumRef.setF(numDataRange);
        
             ctBarSer.addNewSpPr().addNewLn().addNewSolidFill().addNewSrgbClr().setVal(new byte[] {0,0,0});   
             
             //设置负轴颜色不是白色
             ctBarSer.addNewInvertIfNegative().setVal(false);
             //设置标签格式
             ctBoolean.setVal(false);
             CTDLbls newDLbls = ctBarSer.addNewDLbls();
             newDLbls.setShowLegendKey(ctBoolean);
             ctBoolean.setVal(true);
             newDLbls.setShowVal(ctBoolean);
             ctBoolean.setVal(false);
             newDLbls.setShowCatName(ctBoolean);
             newDLbls.setShowSerName(ctBoolean);
             newDLbls.setShowPercent(ctBoolean);
             newDLbls.setShowBubbleSize(ctBoolean);
             newDLbls.setShowLeaderLines(ctBoolean);
         }

         //telling the BarChart that it has axes and giving them Ids
         ctBarChart.addNewAxId().setVal(123456);
         ctBarChart.addNewAxId().setVal(123457);

         //cat axis
         CTCatAx ctCatAx = ctPlotArea.addNewCatAx();
         ctCatAx.addNewAxId().setVal(123456); //id of the cat axis
         CTScaling ctScaling = ctCatAx.addNewScaling();
         ctScaling.addNewOrientation().setVal(STOrientation.MIN_MAX);
         ctCatAx.addNewAxPos().setVal(STAxPos.B);
         ctCatAx.addNewCrossAx().setVal(123457); //id of the val axis
         ctCatAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);

         //val axis
         CTValAx ctValAx = ctPlotArea.addNewValAx();
         ctValAx.addNewAxId().setVal(123457); //id of the val axis
         ctScaling = ctValAx.addNewScaling();
         ctScaling.addNewOrientation().setVal(STOrientation.MIN_MAX);
         //设置位置
         ctValAx.addNewAxPos().setVal(STAxPos.L);
         ctValAx.addNewCrossAx().setVal(123456); //id of the cat axis
         ctValAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);

         //是否删除主左边轴
         if(isvalAxis){
             ctValAx.addNewDelete().setVal(false);
         }else{
             ctValAx.addNewDelete().setVal(true);
         }
         
         //是否删除横坐标
         ctCatAx.addNewDelete().setVal(false);
         
         //legend图注
         if(isLegend){
             CTLegend ctLegend = ctChart.addNewLegend();
             ctLegend.addNewLegendPos().setVal(STLegendPos.B);
             ctLegend.addNewOverlay().setVal(false);
         }
    }else if("line".equals(type)){
        CTLineChart ctLineChart = ctPlotArea.addNewLineChart();
        CTBoolean ctBoolean = ctLineChart.addNewVaryColors();
        ctLineChart.addNewGrouping().setVal(STGrouping.STANDARD);
        
        //创建序列,并且设置选中区域
        for (int i = 0; i < fldNameArr.size()-1; i++) {
            CTLineSer ctLineSer = ctLineChart.addNewSer();
            CTSerTx ctSerTx = ctLineSer.addNewTx();
            //图例区
            CTStrRef ctStrRef = ctSerTx.addNewStrRef();
            String legendDataRange = new CellRangeAddress(curRow,curRow, i+1, i+1).formatAsString(sheetName, true);
             ctStrRef.setF(legendDataRange);
            ctStrRef.setF(legendDataRange);
            ctLineSer.addNewIdx().setVal(i);  
           
            //横坐标区
            CTAxDataSource cttAxDataSource = ctLineSer.addNewCat();
            ctStrRef = cttAxDataSource.addNewStrRef();
            String axisDataRange = new CellRangeAddress(curRow+1, curRow+dataList.size(), 0, 0)
             .formatAsString(sheetName, true);
            ctStrRef.setF(axisDataRange);
           
            //数据区域
            CTNumDataSource ctNumDataSource = ctLineSer.addNewVal();
            CTNumRef ctNumRef = ctNumDataSource.addNewNumRef();
            String numDataRange = new CellRangeAddress(curRow+1, curRow+dataList.size(), i+1, i+1)
             .formatAsString(sheetName, true);
            ctNumRef.setF(numDataRange);
       
            //设置标签格式
            ctBoolean.setVal(false);
            CTDLbls newDLbls = ctLineSer.addNewDLbls();
            newDLbls.setShowLegendKey(ctBoolean);
            ctBoolean.setVal(true);
            newDLbls.setShowVal(ctBoolean);
            ctBoolean.setVal(false);
            newDLbls.setShowCatName(ctBoolean);
            newDLbls.setShowSerName(ctBoolean);
            newDLbls.setShowPercent(ctBoolean);
            newDLbls.setShowBubbleSize(ctBoolean);
            newDLbls.setShowLeaderLines(ctBoolean);
            
            //是否是平滑曲线
            CTBoolean addNewSmooth = ctLineSer.addNewSmooth();
            addNewSmooth.setVal(false);
            
            //是否是堆积曲线
            CTMarker addNewMarker = ctLineSer.addNewMarker();
            CTMarkerStyle addNewSymbol = addNewMarker.addNewSymbol();
            addNewSymbol.setVal(STMarkerStyle.NONE);
        }
        //telling the BarChart that it has axes and giving them Ids
        ctLineChart.addNewAxId().setVal(123456);
        ctLineChart.addNewAxId().setVal(123457);

        //cat axis
        CTCatAx ctCatAx = ctPlotArea.addNewCatAx();
        ctCatAx.addNewAxId().setVal(123456); //id of the cat axis
        CTScaling ctScaling = ctCatAx.addNewScaling();
        ctScaling.addNewOrientation().setVal(STOrientation.MIN_MAX);
        ctCatAx.addNewAxPos().setVal(STAxPos.B);
        ctCatAx.addNewCrossAx().setVal(123457); //id of the val axis
        ctCatAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);

        //val axis
        CTValAx ctValAx = ctPlotArea.addNewValAx();
        ctValAx.addNewAxId().setVal(123457); //id of the val axis
        ctScaling = ctValAx.addNewScaling();
        ctScaling.addNewOrientation().setVal(STOrientation.MIN_MAX);
        ctValAx.addNewAxPos().setVal(STAxPos.L);
        ctValAx.addNewCrossAx().setVal(123456); //id of the cat axis
        ctValAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);

        //是否删除主左边轴
        if(isvalAxis){
            ctValAx.addNewDelete().setVal(false);
        }else{
            ctValAx.addNewDelete().setVal(true);
        }
        
        //是否删除横坐标
        ctCatAx.addNewDelete().setVal(false);
        
        //legend图注
        if(isLegend){
            CTLegend ctLegend = ctChart.addNewLegend();
            ctLegend.addNewLegendPos().setVal(STLegendPos.B);
            ctLegend.addNewOverlay().setVal(false);
        }
    }else if("bar-line-2".equals(type)){
        CTBarChart ctBarChart = ctPlotArea.addNewBarChart();
        CTBoolean ctBoolean=ctBarChart.addNewVaryColors();
        ctBarChart.getVaryColors().setVal(true);
        
        //设置类型
        ctBarChart.addNewGrouping().setVal(STBarGrouping.CLUSTERED);
        ctBoolean.setVal(true);
        ctBarChart.addNewBarDir().setVal(STBarDir.COL);
       
        //是否添加左侧坐标轴
        ctChart.addNewDispBlanksAs().setVal(STDispBlanksAs.ZERO);
        ctChart.addNewShowDLblsOverMax().setVal(true);
       
        //创建序列,并且设置选中区域
        for (int i = 0; i < fldNameArr.size()-2; i++) {
            CTBarSer ctBarSer = ctBarChart.addNewSer();
            CTSerTx ctSerTx = ctBarSer.addNewTx();
            //图例区
            CTStrRef ctStrRef = ctSerTx.addNewStrRef();
            String legendDataRange = new CellRangeAddress(curRow,curRow, i+1, i+1).formatAsString(sheetName, true);
            ctStrRef.setF(legendDataRange);
            ctBarSer.addNewIdx().setVal(i);  
           
            //横坐标区
            CTAxDataSource cttAxDataSource = ctBarSer.addNewCat();
            ctStrRef = cttAxDataSource.addNewStrRef();
               String axisDataRange = new CellRangeAddress(curRow+1, curRow+dataList.size(), 0, 0)
            .formatAsString(sheetName, true);
            ctStrRef.setF(axisDataRange);
           
            //数据区域
            CTNumDataSource ctNumDataSource = ctBarSer.addNewVal();
            CTNumRef ctNumRef = ctNumDataSource.addNewNumRef();
            String numDataRange = new CellRangeAddress(curRow+1, curRow+dataList.size(), i+1, i+1)
            .formatAsString(sheetName, true);
            ctNumRef.setF(numDataRange);
       
            ctBarSer.addNewSpPr().addNewLn().addNewSolidFill().addNewSrgbClr().setVal(new byte[] {0,0,0});   
            //设置负轴颜色不是白色
            ctBarSer.addNewInvertIfNegative().setVal(false);
            //设置标签格式
            ctBoolean.setVal(false);
            CTDLbls newDLbls = ctBarSer.addNewDLbls();
            newDLbls.setShowLegendKey(ctBoolean);
            ctBoolean.setVal(true);
            newDLbls.setShowVal(ctBoolean);
            ctBoolean.setVal(false);
            newDLbls.setShowCatName(ctBoolean);
            newDLbls.setShowSerName(ctBoolean);
            newDLbls.setShowPercent(ctBoolean);
            newDLbls.setShowBubbleSize(ctBoolean);
            newDLbls.setShowLeaderLines(ctBoolean);
        }

        //telling the BarChart that it has axes and giving them Ids
        ctBarChart.addNewAxId().setVal(123456);
        ctBarChart.addNewAxId().setVal(123457);

        //telling the BarChart that it has axes and giving them Ids
        ctBarChart.addNewAxId().setVal(123456);
        ctBarChart.addNewAxId().setVal(123457);

        //cat axis
        CTCatAx ctCatAx = ctPlotArea.addNewCatAx();
        ctCatAx.addNewAxId().setVal(123456); //id of the cat axis
        CTScaling ctScaling = ctCatAx.addNewScaling();
        ctScaling.addNewOrientation().setVal(STOrientation.MIN_MAX);
        ctCatAx.addNewAxPos().setVal(STAxPos.B);
        ctCatAx.addNewCrossAx().setVal(123457); //id of the val axis
        ctCatAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);

        //val axis
        CTValAx ctValAx = ctPlotArea.addNewValAx();
        ctValAx.addNewAxId().setVal(123457); //id of the val axis
        ctScaling = ctValAx.addNewScaling();
        ctScaling.addNewOrientation().setVal(STOrientation.MIN_MAX);
        ctValAx.addNewAxPos().setVal(STAxPos.L);
        ctValAx.addNewCrossAx().setVal(123456); //id of the cat axis
        ctValAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);

        //是否删除主左边轴
        if(isvalAxis){
            ctValAx.addNewDelete().setVal(false);
        }else{
            ctValAx.addNewDelete().setVal(true);
        }
        
        //是否删除横坐标
        ctCatAx.addNewDelete().setVal(false);
        
        //legend图注
        if(isLegend){
            CTLegend ctLegend = ctChart.addNewLegend();
            ctLegend.addNewLegendPos().setVal(STLegendPos.B);
            ctLegend.addNewOverlay().setVal(false);
        }
        
        
        CTLineChart ctLineChart = ctPlotArea.addNewLineChart();
        ctLineChart.addNewGrouping().setVal(STGrouping.STANDARD);
       
        //创建序列,并且设置选中区域
        for (int i =1; i < fldNameArr.size()-1; i++) {
            CTLineSer ctLineSer = ctLineChart.addNewSer();
            CTSerTx ctSerTx = ctLineSer.addNewTx();
            //图例区
            CTStrRef ctStrRef = ctSerTx.addNewStrRef();
            String legendDataRange = new CellRangeAddress(curRow,curRow, i+1, i+1).formatAsString(sheetName, true);
             ctStrRef.setF(legendDataRange);
            ctStrRef.setF(legendDataRange);
            ctLineSer.addNewIdx().setVal(i);  
           
            //横坐标区
            CTAxDataSource cttAxDataSource = ctLineSer.addNewCat();
            ctStrRef = cttAxDataSource.addNewStrRef();
            String axisDataRange = new CellRangeAddress(curRow+1, curRow+dataList.size(), 0, 0)
             .formatAsString(sheetName, true);
            ctStrRef.setF(axisDataRange);
           
            //数据区域
            CTNumDataSource ctNumDataSource = ctLineSer.addNewVal();
            CTNumRef ctNumRef = ctNumDataSource.addNewNumRef();
            String numDataRange = new CellRangeAddress(curRow+1, curRow+dataList.size(), i+1, i+1)
             .formatAsString(sheetName, true);
            ctNumRef.setF(numDataRange);
       
            //是否是平滑曲线
            CTBoolean addNewSmooth = ctLineSer.addNewSmooth();
            addNewSmooth.setVal(false);
            
            //是否是堆积曲线
            CTMarker addNewMarker = ctLineSer.addNewMarker();
            CTMarkerStyle addNewSymbol = addNewMarker.addNewSymbol();
            addNewSymbol.setVal(STMarkerStyle.NONE);
        }
        
        //telling the BarChart that it has axes and giving them Ids
        //TODO:写死是否有影响?
        ctLineChart.addNewAxId().setVal(1234567);
        ctLineChart.addNewAxId().setVal(1234578);
           
        //cat axis
        CTCatAx ctCatAxline = ctPlotArea.addNewCatAx();
        ctCatAxline.addNewAxId().setVal(1234567); //id of the cat axis
        CTScaling ctScalingline = ctCatAxline.addNewScaling();
        ctScalingline.addNewOrientation().setVal(STOrientation.MIN_MAX);
        ctCatAxline.addNewDelete().setVal(true);
        ctCatAxline.addNewAxPos().setVal(STAxPos.B);
        ctCatAxline.addNewMajorTickMark().setVal(STTickMark.OUT);
        ctCatAxline.addNewMinorTickMark().setVal(STTickMark.NONE);
        ctCatAxline.addNewAuto().setVal(true);
        ctCatAxline.addNewLblAlgn().setVal(STLblAlgn.CTR);
        ctCatAxline.addNewLblOffset().setVal(100);
        ctCatAxline.addNewNoMultiLvlLbl().setVal(false);
        ctCatAxline.addNewCrossAx().setVal(1234578); //id of the val axis
        ctCatAxline.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);

        //val axis
        CTValAx ctValAxline = ctPlotArea.addNewValAx();
        ctValAxline.addNewAxId().setVal(1234578); //id of the val axis
        ctScalingline = ctValAxline.addNewScaling();
        ctScalingline.addNewOrientation().setVal(STOrientation.MIN_MAX);
        //Y轴右侧坐标true删除,false保留
        ctValAxline.addNewDelete().setVal(false);
        ctValAxline.addNewAxPos().setVal(STAxPos.R);
        ctValAxline.addNewMajorTickMark().setVal(STTickMark.OUT);
        ctValAxline.addNewMinorTickMark().setVal(STTickMark.NONE);
        ctValAxline.addNewCrosses().setVal(STCrosses.MAX);
        ctValAxline.addNewCrossBetween().setVal(STCrossBetween.BETWEEN);
        ctValAxline.addNewCrossAx().setVal(1234567); //id of the cat axis
        ctValAxline.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);
   }else if("bar-line-4".equals(type)){
        CTBarChart ctBarChart = ctPlotArea.addNewBarChart();
        CTBoolean ctBoolean=ctBarChart.addNewVaryColors();
        ctBarChart.getVaryColors().setVal(true);
        
        //设置类型
        ctBarChart.addNewGrouping().setVal(STBarGrouping.CLUSTERED);
        ctBoolean.setVal(true);
        ctBarChart.addNewBarDir().setVal(STBarDir.COL);
       
        //是否添加左侧坐标轴
        ctChart.addNewDispBlanksAs().setVal(STDispBlanksAs.ZERO);
        ctChart.addNewShowDLblsOverMax().setVal(true);
       
        //创建序列,并且设置选中区域
        for (int i = 0; i < fldNameArr.size()-1-2; i++) {
            CTBarSer ctBarSer = ctBarChart.addNewSer();
            CTSerTx ctSerTx = ctBarSer.addNewTx();
            //图例区
            CTStrRef ctStrRef = ctSerTx.addNewStrRef();
            String legendDataRange = new CellRangeAddress(curRow,curRow, i+1, i+1).formatAsString(sheetName, true);
            ctStrRef.setF(legendDataRange);
            ctBarSer.addNewIdx().setVal(i);  
           
            //横坐标区
            CTAxDataSource cttAxDataSource = ctBarSer.addNewCat();
            ctStrRef = cttAxDataSource.addNewStrRef();
               String axisDataRange = new CellRangeAddress(curRow+1, curRow+dataList.size(), 0, 0)
            .formatAsString(sheetName, true);
            ctStrRef.setF(axisDataRange);
           
            //数据区域
            CTNumDataSource ctNumDataSource = ctBarSer.addNewVal();
            CTNumRef ctNumRef = ctNumDataSource.addNewNumRef();
            String numDataRange = new CellRangeAddress(curRow+1, curRow+dataList.size(), i+1, i+1)
            .formatAsString(sheetName, true);
            ctNumRef.setF(numDataRange);
       
            ctBarSer.addNewSpPr().addNewLn().addNewSolidFill().addNewSrgbClr().setVal(new byte[] {0,0,0});   
            //设置负轴颜色不是白色
            ctBarSer.addNewInvertIfNegative().setVal(false);
            //设置标签格式
            ctBoolean.setVal(false);
            CTDLbls newDLbls = ctBarSer.addNewDLbls();
            newDLbls.setShowLegendKey(ctBoolean);
            ctBoolean.setVal(true);
            newDLbls.setShowVal(ctBoolean);
            ctBoolean.setVal(false);
            newDLbls.setShowCatName(ctBoolean);
            newDLbls.setShowSerName(ctBoolean);
            newDLbls.setShowPercent(ctBoolean);
            newDLbls.setShowBubbleSize(ctBoolean);
            newDLbls.setShowLeaderLines(ctBoolean);
        }

        //telling the BarChart that it has axes and giving them Ids
        ctBarChart.addNewAxId().setVal(123456);
        ctBarChart.addNewAxId().setVal(123457);

        //telling the BarChart that it has axes and giving them Ids
        ctBarChart.addNewAxId().setVal(123456);
        ctBarChart.addNewAxId().setVal(123457);

        //cat axis
        CTCatAx ctCatAx = ctPlotArea.addNewCatAx();
        ctCatAx.addNewAxId().setVal(123456); //id of the cat axis
        CTScaling ctScaling = ctCatAx.addNewScaling();
        ctScaling.addNewOrientation().setVal(STOrientation.MIN_MAX);
        ctCatAx.addNewAxPos().setVal(STAxPos.B);
        ctCatAx.addNewCrossAx().setVal(123457); //id of the val axis
        ctCatAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);

        //val axis
        CTValAx ctValAx = ctPlotArea.addNewValAx();
        ctValAx.addNewAxId().setVal(123457); //id of the val axis
        ctScaling = ctValAx.addNewScaling();
        ctScaling.addNewOrientation().setVal(STOrientation.MIN_MAX);
        ctValAx.addNewAxPos().setVal(STAxPos.L);
        ctValAx.addNewCrossAx().setVal(123456); //id of the cat axis
        ctValAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);

        //是否删除主左边轴
        if(isvalAxis){
            ctValAx.addNewDelete().setVal(false);
        }else{
            ctValAx.addNewDelete().setVal(true);
        }
        
        //是否删除横坐标
        ctCatAx.addNewDelete().setVal(false);
        
        //legend图注
        if(isLegend){
            CTLegend ctLegend = ctChart.addNewLegend();
            ctLegend.addNewLegendPos().setVal(STLegendPos.B);
            ctLegend.addNewOverlay().setVal(false);
        }
        
        
        CTLineChart ctLineChart = ctPlotArea.addNewLineChart();
        ctLineChart.addNewGrouping().setVal(STGrouping.STANDARD);
       
        //创建序列,并且设置选中区域
        for (int i = 2; i < fldNameArr.size()-1; i++) {
            CTLineSer ctLineSer = ctLineChart.addNewSer();
            CTSerTx ctSerTx = ctLineSer.addNewTx();
            //图例区
            CTStrRef ctStrRef = ctSerTx.addNewStrRef();
            String legendDataRange = new CellRangeAddress(curRow,curRow, i+1, i+1).formatAsString(sheetName, true);
             ctStrRef.setF(legendDataRange);
            ctStrRef.setF(legendDataRange);
            ctLineSer.addNewIdx().setVal(i);  
           
            //横坐标区
            CTAxDataSource cttAxDataSource = ctLineSer.addNewCat();
            ctStrRef = cttAxDataSource.addNewStrRef();
            String axisDataRange = new CellRangeAddress(curRow+1, curRow+dataList.size(), 0, 0)
             .formatAsString(sheetName, true);
            ctStrRef.setF(axisDataRange);
           
            //数据区域
            CTNumDataSource ctNumDataSource = ctLineSer.addNewVal();
            CTNumRef ctNumRef = ctNumDataSource.addNewNumRef();
            String numDataRange = new CellRangeAddress(curRow+1, curRow+dataList.size(), i+1, i+1)
             .formatAsString(sheetName, true);
            ctNumRef.setF(numDataRange);
       
            //是否是平滑曲线
            CTBoolean addNewSmooth = ctLineSer.addNewSmooth();
            addNewSmooth.setVal(false);
            
            //是否是堆积曲线
            CTMarker addNewMarker = ctLineSer.addNewMarker();
            CTMarkerStyle addNewSymbol = addNewMarker.addNewSymbol();
            addNewSymbol.setVal(STMarkerStyle.NONE);
        }
        
        //telling the BarChart that it has axes and giving them Ids
        //TODO:写死是否有影响?
        ctLineChart.addNewAxId().setVal(1234567);
        ctLineChart.addNewAxId().setVal(1234578);
           
        //cat axis
        CTCatAx ctCatAxline = ctPlotArea.addNewCatAx();
        ctCatAxline.addNewAxId().setVal(1234567); //id of the cat axis
        CTScaling ctScalingline = ctCatAxline.addNewScaling();
        ctScalingline.addNewOrientation().setVal(STOrientation.MIN_MAX);
        ctCatAxline.addNewDelete().setVal(true);
        ctCatAxline.addNewAxPos().setVal(STAxPos.B);
        ctCatAxline.addNewMajorTickMark().setVal(STTickMark.OUT);
        ctCatAxline.addNewMinorTickMark().setVal(STTickMark.NONE);
        ctCatAxline.addNewAuto().setVal(true);
        ctCatAxline.addNewLblAlgn().setVal(STLblAlgn.CTR);
        ctCatAxline.addNewLblOffset().setVal(100);
        ctCatAxline.addNewNoMultiLvlLbl().setVal(false);
        ctCatAxline.addNewCrossAx().setVal(1234578); //id of the val axis
        ctCatAxline.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);

        //val axis
        CTValAx ctValAxline = ctPlotArea.addNewValAx();
        ctValAxline.addNewAxId().setVal(1234578); //id of the val axis
        ctScalingline = ctValAxline.addNewScaling();
        ctScalingline.addNewOrientation().setVal(STOrientation.MIN_MAX);
        ctValAxline.addNewDelete().setVal(false);
        ctValAxline.addNewAxPos().setVal(STAxPos.R);
        ctValAxline.addNewMajorTickMark().setVal(STTickMark.OUT);
        ctValAxline.addNewMinorTickMark().setVal(STTickMark.NONE);
        ctValAxline.addNewCrosses().setVal(STCrosses.MAX);
        ctValAxline.addNewCrossBetween().setVal(STCrossBetween.BETWEEN);
        ctValAxline.addNewCrossAx().setVal(1234567); //id of the cat axis
        ctValAxline.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);
   }else if("pie".equals(type)){//pie
       CTPieChart ctPieChart = ctPlotArea.addNewPieChart();
       CTBoolean ctBoolean = ctPieChart.addNewVaryColors();
       
       //创建序列,并且设置选中区域
       for (int i = 0; i < fldNameArr.size()-1; i++) {
           CTPieSer ctPieSer = ctPieChart.addNewSer();
           CTSerTx ctSerTx = ctPieSer.addNewTx();
           //图例区
           CTStrRef ctStrRef = ctSerTx.addNewStrRef();
           String legendDataRange = new CellRangeAddress(curRow,curRow, i+1, i+1).formatAsString(sheetName, true);
           ctStrRef.setF(legendDataRange);
           ctPieSer.addNewIdx().setVal(i);  
          
           //横坐标区
           CTAxDataSource cttAxDataSource = ctPieSer.addNewCat();
           ctStrRef = cttAxDataSource.addNewStrRef();
           String axisDataRange = new CellRangeAddress(curRow+1, curRow+dataList.size(), 0, 0)
        .formatAsString(sheetName, true);
           ctStrRef.setF(axisDataRange);
          
           //数据区域
           CTNumDataSource ctNumDataSource = ctPieSer.addNewVal();
           CTNumRef ctNumRef = ctNumDataSource.addNewNumRef();
           String numDataRange = new CellRangeAddress(curRow+1, curRow+dataList.size(), i+1, i+1)
        .formatAsString(sheetName, true);
           ctNumRef.setF(numDataRange);
      
           ctPieSer.addNewSpPr().addNewLn().addNewSolidFill().addNewSrgbClr().setVal(new byte[] {0,0,0});   
           
           //设置标签格式
           ctBoolean.setVal(true);
       }
       //legend图注
       CTLegend ctLegend = ctChart.addNewLegend();
       ctLegend.addNewLegendPos().setVal(STLegendPos.B);
       ctLegend.addNewOverlay().setVal(true);
   }else if("pie3D".equals(type)){//pie3D
       CTPie3DChart ctPie3DChart = ctPlotArea.addNewPie3DChart();
       CTBoolean ctBoolean = ctPie3DChart.addNewVaryColors();
       
       //创建序列,并且设置选中区域
       for (int i = 0; i < fldNameArr.size()-1; i++) {
           CTPieSer ctPieSer = ctPie3DChart.addNewSer();
           CTSerTx ctSerTx = ctPieSer.addNewTx();
           //图例区
           CTStrRef ctStrRef = ctSerTx.addNewStrRef();
           String legendDataRange = new CellRangeAddress(curRow,curRow, i+1, i+1).formatAsString(sheetName, true);
           ctStrRef.setF(legendDataRange);
           ctPieSer.addNewIdx().setVal(i);  
          
           //横坐标区
           CTAxDataSource cttAxDataSource = ctPieSer.addNewCat();
           ctStrRef = cttAxDataSource.addNewStrRef();
           String axisDataRange = new CellRangeAddress(curRow+1, curRow+dataList.size(), 0, 0)
        .formatAsString(sheetName, true);
           ctStrRef.setF(axisDataRange);
          
           //数据区域
           CTNumDataSource ctNumDataSource = ctPieSer.addNewVal();
           CTNumRef ctNumRef = ctNumDataSource.addNewNumRef();
           String numDataRange = new CellRangeAddress(curRow+1, curRow+dataList.size(), i+1, i+1)
        .formatAsString(sheetName, true);
           ctNumRef.setF(numDataRange);
      
           ctPieSer.addNewSpPr().addNewLn().addNewSolidFill().addNewSrgbClr().setVal(new byte[] {0,0,0});   
           
           //设置标签格式
           ctBoolean.setVal(true);
       }
       //legend图注
       CTLegend ctLegend = ctChart.addNewLegend();
       ctLegend.addNewLegendPos().setVal(STLegendPos.B);
       ctLegend.addNewOverlay().setVal(true);
   }else{//area
       CTAreaChart ctAreaChart = ctPlotArea.addNewAreaChart();
       CTBoolean ctBoolean = ctAreaChart.addNewVaryColors();
       ctAreaChart.addNewGrouping().setVal(STGrouping.STANDARD);
       
       //创建序列,并且设置选中区域
       for (int i = 0; i < fldNameArr.size()-1; i++) {
           CTAreaSer ctAreaSer = ctAreaChart.addNewSer();
           CTSerTx ctSerTx = ctAreaSer.addNewTx();
           //图例区
           CTStrRef ctStrRef = ctSerTx.addNewStrRef();
           String legendDataRange = new CellRangeAddress(curRow,curRow, i+1, i+1).formatAsString(sheetName, true);
            ctStrRef.setF(legendDataRange);
           ctStrRef.setF(legendDataRange);
           ctAreaSer.addNewIdx().setVal(i);  
          
           //横坐标区
           CTAxDataSource cttAxDataSource = ctAreaSer.addNewCat();
           ctStrRef = cttAxDataSource.addNewStrRef();
           String axisDataRange = new CellRangeAddress(curRow+1, curRow+dataList.size(), 0, 0)
            .formatAsString(sheetName, true);
           ctStrRef.setF(axisDataRange);
          
           //数据区域
           CTNumDataSource ctNumDataSource = ctAreaSer.addNewVal();
           CTNumRef ctNumRef = ctNumDataSource.addNewNumRef();
           String numDataRange = new CellRangeAddress(curRow+1, curRow+dataList.size(), i+1, i+1)
            .formatAsString(sheetName, true);
           ctNumRef.setF(numDataRange);
      
           //设置标签格式
           ctBoolean.setVal(false);
           CTDLbls newDLbls = ctAreaSer.addNewDLbls();
           newDLbls.setShowLegendKey(ctBoolean);
           ctBoolean.setVal(true);
           newDLbls.setShowVal(ctBoolean);
           ctBoolean.setVal(false);
           newDLbls.setShowCatName(ctBoolean);
           newDLbls.setShowSerName(ctBoolean);
           newDLbls.setShowPercent(ctBoolean);
           newDLbls.setShowBubbleSize(ctBoolean);
           newDLbls.setShowLeaderLines(ctBoolean);
           
      /*     //是否是平滑曲线
           CTBoolean addNewSmooth = ctAreaSer.addNewSmooth();
           addNewSmooth.setVal(false);
           
           //是否是堆积曲线
           CTMarker addNewMarker = ctAreaSer.addNewMarker();
           CTMarkerStyle addNewSymbol = addNewMarker.addNewSymbol();
           addNewSymbol.setVal(STMarkerStyle.NONE);*/
       }
       //telling the BarChart that it has axes and giving them Ids
       ctAreaChart.addNewAxId().setVal(123456);
       ctAreaChart.addNewAxId().setVal(123457);

       //cat axis
       CTCatAx ctCatAx = ctPlotArea.addNewCatAx();
       ctCatAx.addNewAxId().setVal(123456); //id of the cat axis
       CTScaling ctScaling = ctCatAx.addNewScaling();
       ctScaling.addNewOrientation().setVal(STOrientation.MIN_MAX);
       ctCatAx.addNewAxPos().setVal(STAxPos.B);
       ctCatAx.addNewCrossAx().setVal(123457); //id of the val axis
       ctCatAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);

       //val axis
       CTValAx ctValAx = ctPlotArea.addNewValAx();
       ctValAx.addNewAxId().setVal(123457); //id of the val axis
       ctScaling = ctValAx.addNewScaling();
       ctScaling.addNewOrientation().setVal(STOrientation.MIN_MAX);
       ctValAx.addNewAxPos().setVal(STAxPos.L);
       ctValAx.addNewCrossAx().setVal(123456); //id of the cat axis
       ctValAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);

       //是否删除主左边轴
       if(isvalAxis){
           ctValAx.addNewDelete().setVal(false);
       }else{
           ctValAx.addNewDelete().setVal(true);
       }
       
       //是否删除横坐标
       ctCatAx.addNewDelete().setVal(false);
       
       //legend图注
       if(isLegend){
           CTLegend ctLegend = ctChart.addNewLegend();
           ctLegend.addNewLegendPos().setVal(STLegendPos.B);
           ctLegend.addNewOverlay().setVal(false);
       }
   
   
   }
    return result;
}

}

 

猜你喜欢

转载自www.cnblogs.com/ysySelf/p/11549383.html