poi导出excel文件,并生成原生图表(包括折线图,柱状图,饼状图,面积图)详解编程语言

前段时间,因为客户需要,要做一个导出excel文件功能,并能生成原生的图表的(不是把图片插入到excel文档),找了很多文档看,也看了很多别人的代码,个人也总结了一下,不足之处,请各位大牛谅解.

需要的jar包如下(直接使用maven仓库):

<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>

废话不多说,代码如下:

  1. package com.jsfund.crm.common.utils;
  2. import java.io.File;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5. import java.util.ArrayList;
  6. import java.util.HashMap;
  7. import java.util.List;
  8. import java.util.Map;
  9. import org.apache.poi.ss.usermodel.BorderStyle;
  10. import org.apache.poi.ss.usermodel.CellStyle;
  11. import org.apache.poi.ss.usermodel.Chart;
  12. import org.apache.poi.ss.usermodel.ClientAnchor;
  13. import org.apache.poi.ss.usermodel.Drawing;
  14. import org.apache.poi.ss.usermodel.FillPatternType;
  15. import org.apache.poi.ss.usermodel.HorizontalAlignment;
  16. import org.apache.poi.ss.usermodel.IndexedColors;
  17. import org.apache.poi.ss.util.CellRangeAddress;
  18. import org.apache.poi.xssf.streaming.SXSSFRow;
  19. import org.apache.poi.xssf.streaming.SXSSFSheet;
  20. import org.apache.poi.xssf.streaming.SXSSFWorkbook;
  21. import org.apache.poi.xssf.usermodel.XSSFChart;
  22. import org.openxmlformats.schemas.drawingml.x2006.chart.CTAreaChart;
  23. import org.openxmlformats.schemas.drawingml.x2006.chart.CTAreaSer;
  24. import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxDataSource;
  25. import org.openxmlformats.schemas.drawingml.x2006.chart.CTBarChart;
  26. import org.openxmlformats.schemas.drawingml.x2006.chart.CTBarSer;
  27. import org.openxmlformats.schemas.drawingml.x2006.chart.CTBoolean;
  28. import org.openxmlformats.schemas.drawingml.x2006.chart.CTCatAx;
  29. import org.openxmlformats.schemas.drawingml.x2006.chart.CTChart;
  30. import org.openxmlformats.schemas.drawingml.x2006.chart.CTDLbls;
  31. import org.openxmlformats.schemas.drawingml.x2006.chart.CTLegend;
  32. import org.openxmlformats.schemas.drawingml.x2006.chart.CTLineChart;
  33. import org.openxmlformats.schemas.drawingml.x2006.chart.CTLineSer;
  34. import org.openxmlformats.schemas.drawingml.x2006.chart.CTMarker;
  35. import org.openxmlformats.schemas.drawingml.x2006.chart.CTMarkerStyle;
  36. import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumDataSource;
  37. import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumRef;
  38. import org.openxmlformats.schemas.drawingml.x2006.chart.CTPie3DChart;
  39. import org.openxmlformats.schemas.drawingml.x2006.chart.CTPieChart;
  40. import org.openxmlformats.schemas.drawingml.x2006.chart.CTPieSer;
  41. import org.openxmlformats.schemas.drawingml.x2006.chart.CTPlotArea;
  42. import org.openxmlformats.schemas.drawingml.x2006.chart.CTScaling;
  43. import org.openxmlformats.schemas.drawingml.x2006.chart.CTSerTx;
  44. import org.openxmlformats.schemas.drawingml.x2006.chart.CTStrRef;
  45. import org.openxmlformats.schemas.drawingml.x2006.chart.CTValAx;
  46. import org.openxmlformats.schemas.drawingml.x2006.chart.STAxPos;
  47. import org.openxmlformats.schemas.drawingml.x2006.chart.STBarDir;
  48. import org.openxmlformats.schemas.drawingml.x2006.chart.STBarGrouping;
  49. import org.openxmlformats.schemas.drawingml.x2006.chart.STBarGrouping.Enum;
  50. import org.openxmlformats.schemas.drawingml.x2006.chart.STDispBlanksAs;
  51. import org.openxmlformats.schemas.drawingml.x2006.chart.STGrouping;
  52. import org.openxmlformats.schemas.drawingml.x2006.chart.STLegendPos;
  53. import org.openxmlformats.schemas.drawingml.x2006.chart.STMarkerStyle;
  54. import org.openxmlformats.schemas.drawingml.x2006.chart.STOrientation;
  55. import org.openxmlformats.schemas.drawingml.x2006.chart.STTickLblPos;
  56. /**
  57.  * java利用poi生成excel图表
  58.  *
  59.  * @author chen
  60.  *
  61.  */
  62. public class ExcelChartUtil1 {
  63.     private static SXSSFWorkbook wb = new SXSSFWorkbook();
  64.     private SXSSFSheet sheet = null;
  65.     public static void main(String[] args) {
  66.         // 字段名
  67.         List<String> fldNameArr = new ArrayList<String>();
  68.         // 标题
  69.         List<String> titleArr = new ArrayList<String>();
  70.         // 模拟数据
  71.         List<Map<String, Object>> dataList = new ArrayList<Map<String, Object>>();
  72.         Map<String, Object> dataMap1 = new HashMap<String, Object>();
  73.         dataMap1.put(“value1”, “股票”);
  74.         dataMap1.put(“value2”, Math.floor(Math.random() * 100) + “”);
  75.         dataMap1.put(“value3”, Math.floor(Math.random() * 100) + “”);
  76.         dataMap1.put(“value4”, Math.floor(Math.random() * 100) + “”);
  77.         Map<String, Object> dataMap2 = new HashMap<String, Object>();
  78.         dataMap2.put(“value1”, “货币型基金”);
  79.         dataMap2.put(“value2”, Math.floor(Math.random() * 100) + “”);
  80.         dataMap2.put(“value3”, Math.floor(Math.random() * 100) + “”);
  81.         dataMap2.put(“value4”, Math.floor(Math.random() * 100) + “”);
  82.         Map<String, Object> dataMap3 = new HashMap<String, Object>();
  83.         dataMap3.put(“value1”, “可转债”);
  84.         dataMap3.put(“value2”, Math.floor(Math.random() * 100) + “”);
  85.         dataMap3.put(“value3”, Math.floor(Math.random() * 100) + “”);
  86.         dataMap3.put(“value4”, Math.floor(Math.random() * 100) + “”);
  87.         Map<String, Object> dataMap4 = new HashMap<String, Object>();
  88.         dataMap4.put(“value1”, “买入返售”);
  89.         dataMap4.put(“value2”, Math.floor(Math.random() * 100) + “”);
  90.         dataMap4.put(“value3”, Math.floor(Math.random() * 100) + “”);
  91.         dataMap4.put(“value4”, Math.floor(Math.random() * 100) + “”);
  92.         Map<String, Object> dataMap5 = new HashMap<String, Object>();
  93.         dataMap5.put(“value1”, “通知存款”);
  94.         dataMap5.put(“value2”, Math.floor(Math.random() * 100) + “”);
  95.         dataMap5.put(“value3”, Math.floor(Math.random() * 100) + “”);
  96.         dataMap5.put(“value4”, Math.floor(Math.random() * 100) + “”);
  97.         Map<String, Object> dataMap6 = new HashMap<String, Object>();
  98.         dataMap6.put(“value1”, “当月累计”);
  99.         dataMap6.put(“value2”, Math.floor(Math.random() * 100) + “”);
  100.         dataMap6.put(“value3”, Math.floor(Math.random() * 100) + “”);
  101.         dataMap6.put(“value4”, Math.floor(Math.random() * 100) + “”);
  102.         fldNameArr.add(“value1”);
  103.         fldNameArr.add(“value2”);
  104.         fldNameArr.add(“value3”);
  105.         fldNameArr.add(“value4”);
  106.         titleArr.add(“类型”);
  107.         titleArr.add(“买入”);
  108.         titleArr.add(“卖出”);
  109.         titleArr.add(“分红”);
  110.         dataList.add(dataMap1);
  111.         dataList.add(dataMap2);
  112.         dataList.add(dataMap3);
  113.         dataList.add(dataMap4);
  114.         dataList.add(dataMap5);
  115.         dataList.add(dataMap6);
  116.         ExcelChartUtil1 ecu = new ExcelChartUtil1();
  117.         try {
  118.             // 创建柱状图
  119.             ecu.createBarChart(titleArr, fldNameArr, dataList);
  120.             // 创建饼状图
  121.             ecu.createPieChart(titleArr, fldNameArr, dataList);
  122.             // 创建折线图
  123.             ecu.createTimeXYChar(titleArr, fldNameArr, dataList);
  124.             // 创建面积图
  125.             ecu.createAreaChart(titleArr, fldNameArr, dataList);
  126.             //导出到文件
  127.             FileOutputStream out = new FileOutputStream(new File(“E:/jcdemo/” + System.currentTimeMillis() + “.xls”));
  128.             wb.write(out);
  129.             out.close();
  130.         } catch (IOException e) {
  131.             e.printStackTrace();
  132.         }
  133.     }
  134.     /**
  135.      * 创建柱状图(堆积图,多组)
  136.      *
  137.      * @throws IOException
  138.      */
  139.     public void createBarChart(List<String> titleArr, List<String> fldNameArr, List<Map<String, Object>> dataList) {
  140.         // 创建一个sheet页
  141.         sheet = wb.createSheet(“sheet0”);
  142.         // drawSheet0Table(sheet,titleArr,fldNameArr,dataList);
  143.         // 堆积=STBarGrouping.STACKED 多组=STBarGrouping.CLUSTERED
  144.         boolean result = drawSheet0Map(sheet, STBarGrouping.CLUSTERED, fldNameArr, dataList, titleArr);
  145.         System.out.println(“生成柱状图(堆积or多组)–>” + result);
  146.     }
  147.     /**
  148.      * 生成柱状图
  149.      *
  150.      * @param sheet
  151.      *            页签
  152.      * @param group
  153.      *            柱状图类型(堆积,多组)
  154.      * @param fldNameArr
  155.      *            坐标名称
  156.      * @param dataList
  157.      *            统计数据
  158.      * @return
  159.      */
  160.     private boolean drawSheet0Map(SXSSFSheet sheet, Enum group, List<String> fldNameArr,
  161.             List<Map<String, Object>> dataList, List<String> titleArr) {
  162.         boolean result = false;
  163.         // 获取sheet名称
  164.         String sheetName = sheet.getSheetName();
  165.         result = drawSheet0Table(sheet, titleArr, fldNameArr, dataList);
  166.         // 创建一个画布
  167.         Drawing<?> drawing = sheet.createDrawingPatriarch();
  168.         // 画一个图区域
  169.         // 前四个默认0,从第8行到第25行,从第0列到第6列的区域
  170.         ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 8, 6, 25);
  171.         // 创建一个chart对象
  172.         Chart chart = drawing.createChart(anchor);
  173.         CTChart ctChart = ((XSSFChart) chart).getCTChart();
  174.         CTPlotArea ctPlotArea = ctChart.getPlotArea();
  175.         // 创建柱状图模型
  176.         CTBarChart ctBarChart = ctPlotArea.addNewBarChart();
  177.         CTBoolean ctBoolean = ctBarChart.addNewVaryColors();
  178.         ctBarChart.getVaryColors().setVal(true);
  179.         // 设置图类型
  180.         ctBarChart.addNewGrouping().setVal(group);
  181.         ctBoolean.setVal(true);
  182.         ctBarChart.addNewBarDir().setVal(STBarDir.COL);
  183.         // 是否添加左侧坐标轴
  184.         ctChart.addNewDispBlanksAs().setVal(STDispBlanksAs.ZERO);
  185.         ctChart.addNewShowDLblsOverMax().setVal(true);
  186.         // 设置这两个参数是为了在STACKED模式下生成堆积模式;(standard)标准模式时需要将这两行去掉
  187.         if (“stacked”.equals(group.toString()) || “percentStacked”.equals(group.toString())) {
  188.             ctBarChart.addNewGapWidth().setVal(150);
  189.             ctBarChart.addNewOverlap().setVal((byte) 100);
  190.         }
  191.         // 创建序列,并且设置选中区域
  192.         for (int i = 0; i < fldNameArr.size() – 1; i++) {
  193.             CTBarSer ctBarSer = ctBarChart.addNewSer();
  194.             CTSerTx ctSerTx = ctBarSer.addNewTx();
  195.             // 图例区
  196.             CTStrRef ctStrRef = ctSerTx.addNewStrRef();
  197.             // 选定区域第0行,第1,2,3列标题作为图例 //1 2 3
  198.             String legendDataRange = new CellRangeAddress(0, 0, i + 1, i + 1).formatAsString(sheetName, true);
  199.             ctStrRef.setF(legendDataRange);
  200.             ctBarSer.addNewIdx().setVal(i);
  201.             // 横坐标区
  202.             CTAxDataSource cttAxDataSource = ctBarSer.addNewCat();
  203.             ctStrRef = cttAxDataSource.addNewStrRef();
  204.             // 选第0列,第1-6行作为横坐标区域
  205.             String axisDataRange = new CellRangeAddress(1, dataList.size(), 0, 0).formatAsString(sheetName, true);
  206.             ctStrRef.setF(axisDataRange);
  207.             // 数据区域
  208.             CTNumDataSource ctNumDataSource = ctBarSer.addNewVal();
  209.             CTNumRef ctNumRef = ctNumDataSource.addNewNumRef();
  210.             // 选第1-6行,第1-3列作为数据区域 //1 2 3
  211.             String numDataRange = new CellRangeAddress(1, dataList.size(), i + 1, i + 1).formatAsString(sheetName,
  212.                     true);
  213.             System.out.println(numDataRange);
  214.             ctNumRef.setF(numDataRange);
  215.             // 添加柱状边框线
  216.             ctBarSer.addNewSpPr().addNewLn().addNewSolidFill().addNewSrgbClr().setVal(new byte[] { 0, 0, 0 });
  217.             // 设置负轴颜色不是白色
  218.             ctBarSer.addNewInvertIfNegative().setVal(false);
  219.             // 设置标签格式
  220.             ctBoolean.setVal(false);
  221.             CTDLbls newDLbls = ctBarSer.addNewDLbls();
  222.             newDLbls.setShowLegendKey(ctBoolean);
  223.             ctBoolean.setVal(true);
  224.             newDLbls.setShowVal(ctBoolean);
  225.             ctBoolean.setVal(false);
  226.             newDLbls.setShowCatName(ctBoolean);
  227.             newDLbls.setShowSerName(ctBoolean);
  228.             newDLbls.setShowPercent(ctBoolean);
  229.             newDLbls.setShowBubbleSize(ctBoolean);
  230.             newDLbls.setShowLeaderLines(ctBoolean);
  231.         }
  232.         // 告诉BarChart它有坐标轴,并给它们id
  233.         ctBarChart.addNewAxId().setVal(123456);
  234.         ctBarChart.addNewAxId().setVal(123457);
  235.         // 横坐标
  236.         CTCatAx ctCatAx = ctPlotArea.addNewCatAx();
  237.         ctCatAx.addNewAxId().setVal(123456); // id of the cat axis
  238.         CTScaling ctScaling = ctCatAx.addNewScaling();
  239.         ctScaling.addNewOrientation().setVal(STOrientation.MIN_MAX);
  240.         ctCatAx.addNewAxPos().setVal(STAxPos.B);
  241.         ctCatAx.addNewCrossAx().setVal(123457); // id of the val axis
  242.         ctCatAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);
  243.         // 纵坐标
  244.         CTValAx ctValAx = ctPlotArea.addNewValAx();
  245.         ctValAx.addNewAxId().setVal(123457); // id of the val axis
  246.         ctScaling = ctValAx.addNewScaling();
  247.         ctScaling.addNewOrientation().setVal(STOrientation.MIN_MAX);
  248.         // 设置位置
  249.         ctValAx.addNewAxPos().setVal(STAxPos.L);
  250.         ctValAx.addNewCrossAx().setVal(123456); // id of the cat axis
  251.         ctValAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);
  252.         // 是否删除主左边轴
  253.         ctValAx.addNewDelete().setVal(false);
  254.         // 是否删除横坐标
  255.         ctCatAx.addNewDelete().setVal(false);
  256.         // legend图注
  257.         // if(true){
  258.         CTLegend ctLegend = ctChart.addNewLegend();
  259.         ctLegend.addNewLegendPos().setVal(STLegendPos.B);
  260.         ctLegend.addNewOverlay().setVal(false);
  261.         // }
  262.         return result;
  263.     }
  264.     /**
  265.      * 创建横向柱状图
  266.      *
  267.      * @throws IOException
  268.      */
  269.     public void createAreaChart(List<String> titleArr, List<String> fldNameArr,
  270.             List<Map<String, Object>> dataList) {
  271.         // 创建一个sheet页
  272.         sheet = wb.createSheet(“sheet1”);
  273.         boolean result = drawSheet1Map(sheet, “is3D”, fldNameArr, dataList, titleArr);
  274.         System.out.println(“生成面积图–>” + result);
  275.     }
  276.     /**
  277.      * 生成面积图
  278.      * @param sheet
  279.      * @param type
  280.      * @param fldNameArr
  281.      * @param dataList
  282.      * @param titleArr
  283.      * @return
  284.      */
  285.     private boolean drawSheet1Map(SXSSFSheet sheet, String type, List<String> fldNameArr,
  286.             List<Map<String, Object>> dataList, List<String> titleArr) {
  287.         boolean result = false;
  288.         // 获取sheet名称
  289.         String sheetName = sheet.getSheetName();
  290.         result = drawSheet0Table(sheet, titleArr, fldNameArr, dataList);
  291.         // 创建一个画布
  292.         Drawing<?> drawing = sheet.createDrawingPatriarch();
  293.         // 画一个图区域
  294.         // 前四个默认0,从第8行到第25行,从第0列到第6列的区域
  295.         ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 8, 6, 25);
  296.         // 创建一个chart对象
  297.         Chart chart = drawing.createChart(anchor);
  298.         CTChart ctChart = ((XSSFChart) chart).getCTChart();
  299.         CTPlotArea ctPlotArea = ctChart.getPlotArea();
  300.         CTAreaChart ctAreaChart = ctPlotArea.addNewAreaChart();
  301.         CTBoolean ctBoolean = ctAreaChart.addNewVaryColors();
  302.         ctAreaChart.addNewGrouping().setVal(STGrouping.STANDARD);
  303.         // 创建序列,并且设置选中区域
  304.         for (int i = 2; i < fldNameArr.size() – 1; i++) {
  305.             CTAreaSer ctAreaSer = ctAreaChart.addNewSer();
  306.             CTSerTx ctSerTx = ctAreaSer.addNewTx();
  307.             // 图例区
  308.             CTStrRef ctStrRef = ctSerTx.addNewStrRef();
  309.             // 选定区域第0行,第1,2,3列标题作为图例 //1 2 3
  310.             String legendDataRange = new CellRangeAddress(0, 0, i + 1, i + 1).formatAsString(sheetName, true);
  311.             ctStrRef.setF(legendDataRange);
  312.             ctAreaSer.addNewIdx().setVal(i);
  313.             // 横坐标区
  314.             CTAxDataSource cttAxDataSource = ctAreaSer.addNewCat();
  315.             ctStrRef = cttAxDataSource.addNewStrRef();
  316.             // 选第0列,第1-6行作为横坐标区域
  317.             String axisDataRange = new CellRangeAddress(1, dataList.size(), 0, 0).formatAsString(sheetName, true);
  318.             ctStrRef.setF(axisDataRange);
  319.             // 数据区域
  320.             CTNumDataSource ctNumDataSource = ctAreaSer.addNewVal();
  321.             CTNumRef ctNumRef = ctNumDataSource.addNewNumRef();
  322.             // 选第1-6行,第1-3列作为数据区域 //1 2 3
  323.             String numDataRange = new CellRangeAddress(1, dataList.size(), i + 1, i + 1).formatAsString(sheetName,
  324.                     true);
  325.             System.out.println(numDataRange);
  326.             ctNumRef.setF(numDataRange);
  327.             // 设置标签格式
  328.             ctBoolean.setVal(false);
  329.             CTDLbls newDLbls = ctAreaSer.addNewDLbls();
  330.             newDLbls.setShowLegendKey(ctBoolean);
  331.             ctBoolean.setVal(true);
  332.             newDLbls.setShowVal(ctBoolean);
  333.             ctBoolean.setVal(false);
  334.             newDLbls.setShowCatName(ctBoolean);
  335.             newDLbls.setShowSerName(ctBoolean);
  336.             newDLbls.setShowPercent(ctBoolean);
  337.             newDLbls.setShowBubbleSize(ctBoolean);
  338.             newDLbls.setShowLeaderLines(ctBoolean);
  339.             /*
  340.              * //是否是平滑曲线 CTBoolean addNewSmooth = ctAreaSer.addNewSmooth();
  341.              * addNewSmooth.setVal(false); //是否是堆积曲线 CTMarker addNewMarker =
  342.              * ctAreaSer.addNewMarker(); CTMarkerStyle addNewSymbol =
  343.              * addNewMarker.addNewSymbol();
  344.              * addNewSymbol.setVal(STMarkerStyle.NONE);
  345.              */
  346.         }
  347.         // telling the BarChart that it has axes and giving them Ids
  348.         ctAreaChart.addNewAxId().setVal(123456);
  349.         ctAreaChart.addNewAxId().setVal(123457);
  350.         // cat axis
  351.         CTCatAx ctCatAx = ctPlotArea.addNewCatAx();
  352.         ctCatAx.addNewAxId().setVal(123456); // id of the cat axis
  353.         CTScaling ctScaling = ctCatAx.addNewScaling();
  354.         ctScaling.addNewOrientation().setVal(STOrientation.MIN_MAX);
  355.         ctCatAx.addNewAxPos().setVal(STAxPos.B);
  356.         ctCatAx.addNewCrossAx().setVal(123457); // id of the val axis
  357.         ctCatAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);
  358.         // val axis
  359.         CTValAx ctValAx = ctPlotArea.addNewValAx();
  360.         ctValAx.addNewAxId().setVal(123457); // id of the val axis
  361.         ctScaling = ctValAx.addNewScaling();
  362.         ctScaling.addNewOrientation().setVal(STOrientation.MIN_MAX);
  363.         ctValAx.addNewAxPos().setVal(STAxPos.L);
  364.         ctValAx.addNewCrossAx().setVal(123456); // id of the cat axis
  365.         ctValAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);
  366.         // 是否删除主左边轴
  367.         ctValAx.addNewDelete().setVal(false);
  368.         // 是否删除横坐标
  369.         ctCatAx.addNewDelete().setVal(false);
  370.         // legend图注
  371.         CTLegend ctLegend = ctChart.addNewLegend();
  372.         ctLegend.addNewLegendPos().setVal(STLegendPos.B);
  373.         ctLegend.addNewOverlay().setVal(false);
  374.         return result;
  375.     }
  376.     /**
  377.      * 创建饼状图
  378.      *
  379.      * @throws IOException
  380.      */
  381.     public void createPieChart(List<String> titleArr, List<String> fldNameArr, List<Map<String, Object>> dataList) {
  382.         // 创建一个sheet页
  383.         sheet = wb.createSheet(“sheet2”);
  384.         boolean result = drawSheet2Map(sheet, “is3D”, fldNameArr, dataList, titleArr);
  385.         System.out.println(“生成饼状图(普通or3D)–>” + result);
  386.     }
  387.     /**
  388.      * 创建饼状图
  389.      *
  390.      * @param sheet
  391.      *            页签
  392.      * @param type
  393.      *            图类型(3D或者普通)
  394.      * @param fldNameArr
  395.      *            (类标题)
  396.      * @param dataList
  397.      *            (填充数据)
  398.      * @param titleArr
  399.      *            (标题)
  400.      * @return
  401.      */
  402.     private boolean drawSheet2Map(SXSSFSheet sheet, String type, List<String> fldNameArr,
  403.             List<Map<String, Object>> dataList, List<String> titleArr) {
  404.         boolean result = false;
  405.         // 获取sheet名称
  406.         String sheetName = sheet.getSheetName();
  407.         result = drawSheet0Table(sheet, titleArr, fldNameArr, dataList);
  408.         // 创建一个画布
  409.         Drawing<?> drawing = sheet.createDrawingPatriarch();
  410.         // 画一个图区域
  411.         // 前四个默认0,从第8行到第25行,从第0列到第6列的区域
  412.         ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 8, 6, 25);
  413.         // 创建一个chart对象
  414.         Chart chart = drawing.createChart(anchor);
  415.         CTChart ctChart = ((XSSFChart) chart).getCTChart();
  416.         CTPlotArea ctPlotArea = ctChart.getPlotArea();
  417.         CTBoolean ctBoolean = null;
  418.         CTPie3DChart ctPie3DChart = null;
  419.         CTPieChart ctPieChart = null;
  420.         // 创建饼状图模型
  421.         if (type.equals(“is3D”)) {
  422.             ctPie3DChart = ctPlotArea.addNewPie3DChart();
  423.             ctBoolean = ctPie3DChart.addNewVaryColors();
  424.         } else {
  425.             ctPieChart = ctPlotArea.addNewPieChart();
  426.             ctBoolean = ctPieChart.addNewVaryColors();
  427.         }
  428.         // 创建序列,并且设置选中区域
  429.         for (int i = 0; i < fldNameArr.size() – 1; i++) {
  430.             CTPieSer ctPieSer = null;
  431.             if (type.equals(“is3D”)) {
  432.                 ctPieSer = ctPie3DChart.addNewSer();
  433.             } else {
  434.                 ctPieSer = ctPieChart.addNewSer();
  435.             }
  436.             CTSerTx ctSerTx = ctPieSer.addNewTx();
  437.             // 图例区
  438.             CTStrRef ctStrRef = ctSerTx.addNewStrRef();
  439.             // 选定区域第0行,第1,2,3列标题作为图例 //1 2 3
  440.             String legendDataRange = new CellRangeAddress(0, 0, i + 1, i + 1).formatAsString(sheetName, true);
  441.             ctStrRef.setF(legendDataRange);
  442.             ctPieSer.addNewIdx().setVal(i);
  443.             // 横坐标区
  444.             CTAxDataSource cttAxDataSource = ctPieSer.addNewCat();
  445.             ctStrRef = cttAxDataSource.addNewStrRef();
  446.             // 选第0列,第1-6行作为横坐标区域
  447.             String axisDataRange = new CellRangeAddress(1, dataList.size(), 0, 0).formatAsString(sheetName, true);
  448.             ctStrRef.setF(axisDataRange);
  449.             // 数据区域
  450.             CTNumDataSource ctNumDataSource = ctPieSer.addNewVal();
  451.             CTNumRef ctNumRef = ctNumDataSource.addNewNumRef();
  452.             // 选第1-6行,第1-3列作为数据区域 //1 2 3
  453.             String numDataRange = new CellRangeAddress(1, dataList.size(), i + 1, i + 1).formatAsString(sheetName,
  454.                     true);
  455.             System.out.println(numDataRange);
  456.             ctNumRef.setF(numDataRange);
  457.             // 显示边框线
  458.             ctPieSer.addNewSpPr().addNewLn().addNewSolidFill().addNewSrgbClr().setVal(new byte[] { 0, 0, 0 });
  459.             // 设置标签格式
  460.             ctBoolean.setVal(true);
  461.         }
  462.         // legend图注
  463.         CTLegend ctLegend = ctChart.addNewLegend();
  464.         ctLegend.addNewLegendPos().setVal(STLegendPos.B);
  465.         ctLegend.addNewOverlay().setVal(true);
  466.         return result;
  467.     }
  468.     /**
  469.      * 创建折线图
  470.      *
  471.      * @throws IOException
  472.      */
  473.     public void createTimeXYChar(List<String> titleArr, List<String> fldNameArr, List<Map<String, Object>> dataList) {
  474.         // 创建一个sheet页
  475.         sheet = wb.createSheet(“sheet3”);
  476.         // 第二个参数折线图类型:line=普通折线图,line-bar=折线+柱状图
  477.         boolean result = drawSheet3Map(sheet, “line”, fldNameArr, dataList, titleArr);
  478.         System.out.println(“生成折线图(折线图or折线图-柱状图)–>” + result);
  479.     }
  480.     /**
  481.      * 生成折线图
  482.      *
  483.      * @param sheet
  484.      *            页签
  485.      * @param type
  486.      *            类型
  487.      * @param fldNameArr
  488.      *            X轴标题
  489.      * @param dataList
  490.      *            填充数据
  491.      * @param titleArr
  492.      *            图例标题
  493.      * @return
  494.      */
  495.     private boolean drawSheet3Map(SXSSFSheet sheet, String type, List<String> fldNameArr,
  496.             List<Map<String, Object>> dataList, List<String> titleArr) {
  497.         boolean result = false;
  498.         // 获取sheet名称
  499.         String sheetName = sheet.getSheetName();
  500.         result = drawSheet0Table(sheet, titleArr, fldNameArr, dataList);
  501.         // 创建一个画布
  502.         Drawing<?> drawing = sheet.createDrawingPatriarch();
  503.         // 画一个图区域
  504.         // 前四个默认0,从第8行到第25行,从第0列到第6列的区域
  505.         ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 8, 6, 25);
  506.         // 创建一个chart对象
  507.         Chart chart = drawing.createChart(anchor);
  508.         CTChart ctChart = ((XSSFChart) chart).getCTChart();
  509.         CTPlotArea ctPlotArea = ctChart.getPlotArea();
  510.         if (type.equals(“line-bar”)) {
  511.             CTBarChart ctBarChart = ctPlotArea.addNewBarChart();
  512.             CTBoolean ctBoolean = ctBarChart.addNewVaryColors();
  513.             ctBarChart.getVaryColors().setVal(true);
  514.             // 设置类型
  515.             ctBarChart.addNewGrouping().setVal(STBarGrouping.CLUSTERED);
  516.             ctBoolean.setVal(true);
  517.             ctBarChart.addNewBarDir().setVal(STBarDir.COL);
  518.             // 是否添加左侧坐标轴
  519.             ctChart.addNewDispBlanksAs().setVal(STDispBlanksAs.ZERO);
  520.             ctChart.addNewShowDLblsOverMax().setVal(true);
  521.             // 创建序列,并且设置选中区域
  522.             for (int i = 0; i < fldNameArr.size() – 1; i++) {
  523.                 CTBarSer ctBarSer = ctBarChart.addNewSer();
  524.                 CTSerTx ctSerTx = ctBarSer.addNewTx();
  525.                 // 图例区
  526.                 CTStrRef ctStrRef = ctSerTx.addNewStrRef();
  527.                 // 选定区域第0行,第1,2,3列标题作为图例 //1 2 3
  528.                 String legendDataRange = new CellRangeAddress(0, 0, i + 1, i + 1).formatAsString(sheetName, true);
  529.                 ctStrRef.setF(legendDataRange);
  530.                 ctBarSer.addNewIdx().setVal(i);
  531.                 // 横坐标区
  532.                 CTAxDataSource cttAxDataSource = ctBarSer.addNewCat();
  533.                 ctStrRef = cttAxDataSource.addNewStrRef();
  534.                 // 选第0列,第1-6行作为横坐标区域
  535.                 String axisDataRange = new CellRangeAddress(1, dataList.size(), 0, 0).formatAsString(sheetName, true);
  536.                 ctStrRef.setF(axisDataRange);
  537.                 // 数据区域
  538.                 CTNumDataSource ctNumDataSource = ctBarSer.addNewVal();
  539.                 CTNumRef ctNumRef = ctNumDataSource.addNewNumRef();
  540.                 // 选第1-6行,第1-3列作为数据区域 //1 2 3
  541.                 String numDataRange = new CellRangeAddress(1, dataList.size(), i + 1, i + 1).formatAsString(sheetName,
  542.                         true);
  543.                 System.out.println(numDataRange);
  544.                 ctNumRef.setF(numDataRange);
  545.                 ctBarSer.addNewSpPr().addNewLn().addNewSolidFill().addNewSrgbClr().setVal(new byte[] { 0, 0, 0 });
  546.                 // 设置负轴颜色不是白色
  547.                 ctBarSer.addNewInvertIfNegative().setVal(false);
  548.                 // 设置标签格式
  549.                 ctBoolean.setVal(false);
  550.                 CTDLbls newDLbls = ctBarSer.addNewDLbls();
  551.                 newDLbls.setShowLegendKey(ctBoolean);
  552.                 ctBoolean.setVal(true);
  553.                 newDLbls.setShowVal(ctBoolean);
  554.                 ctBoolean.setVal(false);
  555.                 newDLbls.setShowCatName(ctBoolean);
  556.                 newDLbls.setShowSerName(ctBoolean);
  557.                 newDLbls.setShowPercent(ctBoolean);
  558.                 newDLbls.setShowBubbleSize(ctBoolean);
  559.                 newDLbls.setShowLeaderLines(ctBoolean);
  560.             }
  561.             // telling the BarChart that it has axes and giving them Ids
  562.             ctBarChart.addNewAxId().setVal(123456);
  563.             ctBarChart.addNewAxId().setVal(123457);
  564.             // cat axis
  565.             CTCatAx ctCatAx = ctPlotArea.addNewCatAx();
  566.             ctCatAx.addNewAxId().setVal(123456); // id of the cat axis
  567.             CTScaling ctScaling = ctCatAx.addNewScaling();
  568.             ctScaling.addNewOrientation().setVal(STOrientation.MIN_MAX);
  569.             ctCatAx.addNewAxPos().setVal(STAxPos.B);
  570.             ctCatAx.addNewCrossAx().setVal(123457); // id of the val axis
  571.             ctCatAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);
  572.             // val axis
  573.             CTValAx ctValAx = ctPlotArea.addNewValAx();
  574.             ctValAx.addNewAxId().setVal(123457); // id of the val axis
  575.             ctScaling = ctValAx.addNewScaling();
  576.             ctScaling.addNewOrientation().setVal(STOrientation.MIN_MAX);
  577.             ctValAx.addNewAxPos().setVal(STAxPos.L);
  578.             ctValAx.addNewCrossAx().setVal(123456); // id of the cat axis
  579.             ctValAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);
  580.         }
  581.         // 折线图
  582.         CTLineChart ctLineChart = ctPlotArea.addNewLineChart();
  583.         CTBoolean ctBoolean = ctLineChart.addNewVaryColors();
  584.         ctLineChart.addNewGrouping().setVal(STGrouping.STANDARD);
  585.         // 创建序列,并且设置选中区域
  586.         for (int i = 0; i < fldNameArr.size() – 1; i++) {
  587.             CTLineSer ctLineSer = ctLineChart.addNewSer();
  588.             CTSerTx ctSerTx = ctLineSer.addNewTx();
  589.             // 图例区
  590.             CTStrRef ctStrRef = ctSerTx.addNewStrRef();
  591.             // 选定区域第0行,第1,2,3列标题作为图例 //1 2 3
  592.             String legendDataRange = new CellRangeAddress(0, 0, i + 1, i + 1).formatAsString(sheetName, true);
  593.             ctStrRef.setF(legendDataRange);
  594.             ctLineSer.addNewIdx().setVal(i);
  595.             // 横坐标区
  596.             CTAxDataSource cttAxDataSource = ctLineSer.addNewCat();
  597.             ctStrRef = cttAxDataSource.addNewStrRef();
  598.             // 选第0列,第1-6行作为横坐标区域
  599.             String axisDataRange = new CellRangeAddress(1, dataList.size(), 0, 0).formatAsString(sheetName, true);
  600.             ctStrRef.setF(axisDataRange);
  601.             // 数据区域
  602.             CTNumDataSource ctNumDataSource = ctLineSer.addNewVal();
  603.             CTNumRef ctNumRef = ctNumDataSource.addNewNumRef();
  604.             // 选第1-6行,第1-3列作为数据区域 //1 2 3
  605.             String numDataRange = new CellRangeAddress(1, dataList.size(), i + 1, i + 1).formatAsString(sheetName,
  606.                     true);
  607.             System.out.println(numDataRange);
  608.             ctNumRef.setF(numDataRange);
  609.             // 设置标签格式
  610.             ctBoolean.setVal(false);
  611.             CTDLbls newDLbls = ctLineSer.addNewDLbls();
  612.             newDLbls.setShowLegendKey(ctBoolean);
  613.             ctBoolean.setVal(true);
  614.             newDLbls.setShowVal(ctBoolean);
  615.             ctBoolean.setVal(false);
  616.             newDLbls.setShowCatName(ctBoolean);
  617.             newDLbls.setShowSerName(ctBoolean);
  618.             newDLbls.setShowPercent(ctBoolean);
  619.             newDLbls.setShowBubbleSize(ctBoolean);
  620.             newDLbls.setShowLeaderLines(ctBoolean);
  621.             // 是否是平滑曲线
  622.             CTBoolean addNewSmooth = ctLineSer.addNewSmooth();
  623.             addNewSmooth.setVal(false);
  624.             // 是否是堆积曲线
  625.             CTMarker addNewMarker = ctLineSer.addNewMarker();
  626.             CTMarkerStyle addNewSymbol = addNewMarker.addNewSymbol();
  627.             addNewSymbol.setVal(STMarkerStyle.NONE);
  628.         }
  629.         // telling the BarChart that it has axes and giving them Ids
  630.         ctLineChart.addNewAxId().setVal(123456);
  631.         ctLineChart.addNewAxId().setVal(123457);
  632.         // cat axis
  633.         CTCatAx ctCatAx = ctPlotArea.addNewCatAx();
  634.         ctCatAx.addNewAxId().setVal(123456); // id of the cat axis
  635.         CTScaling ctScaling = ctCatAx.addNewScaling();
  636.         ctScaling.addNewOrientation().setVal(STOrientation.MIN_MAX);
  637.         ctCatAx.addNewAxPos().setVal(STAxPos.B);
  638.         ctCatAx.addNewCrossAx().setVal(123457); // id of the val axis
  639.         ctCatAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);
  640.         // val axis
  641.         CTValAx ctValAx = ctPlotArea.addNewValAx();
  642.         ctValAx.addNewAxId().setVal(123457); // id of the val axis
  643.         ctScaling = ctValAx.addNewScaling();
  644.         ctScaling.addNewOrientation().setVal(STOrientation.MIN_MAX);
  645.         ctValAx.addNewAxPos().setVal(STAxPos.L);
  646.         ctValAx.addNewCrossAx().setVal(123456); // id of the cat axis
  647.         ctValAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);
  648.         // 是否删除主左边轴
  649.         ctValAx.addNewDelete().setVal(false);
  650.         // 是否删除横坐标
  651.         if (type.equals(“line-bar”)) {
  652.             ctCatAx.addNewDelete().setVal(true);
  653.         }
  654.         CTLegend ctLegend = ctChart.addNewLegend();
  655.         ctLegend.addNewLegendPos().setVal(STLegendPos.B);
  656.         ctLegend.addNewOverlay().setVal(false);
  657.         return result;
  658.     }
  659.     /**
  660.      * 生成数据表
  661.      *
  662.      * @param sheet
  663.      *            sheet页对象
  664.      * @param titleArr
  665.      *            表头字段
  666.      * @param fldNameArr
  667.      *            左边标题字段
  668.      * @param dataList
  669.      *            数据
  670.      * @return 是否生成成功
  671.      */
  672.     private boolean drawSheet0Table(SXSSFSheet sheet, List<String> titleArr, List<String> fldNameArr,
  673.             List<Map<String, Object>> dataList) {
  674.         // 测试时返回值
  675.         boolean result = true;
  676.         // 初始化表格样式
  677.         List<CellStyle> styleList = tableStyle();
  678.         // 根据数据创建excel第一行标题行
  679.         SXSSFRow row0 = sheet.createRow(0);
  680.         for (int i = 0; i < titleArr.size(); i++) {
  681.             // 设置标题
  682.             row0.createCell(i).setCellValue(titleArr.get(i));
  683.             // 设置标题行样式
  684.             row0.getCell(i).setCellStyle(styleList.get(0));
  685.         }
  686.         // 填充数据
  687.         for (int i = 0; i < dataList.size(); i++) {
  688.             // 获取每一项的数据
  689.             Map<String, Object> data = dataList.get(i);
  690.             // 设置每一行的字段标题和数据
  691.             SXSSFRow rowi = sheet.createRow(i + 1);
  692.             for (int j = 0; j < data.size(); j++) {
  693.                 // 判断是否是标题字段列
  694.                 if (j == 0) {
  695.                     rowi.createCell(j).setCellValue((String) data.get(“value” + (j + 1)));
  696.                     // 设置左边字段样式
  697.                     sheet.getRow(i + 1).getCell(j).setCellStyle(styleList.get(0));
  698.                 } else {
  699.                     rowi.createCell(j).setCellValue(Double.valueOf((String) data.get(“value” + (j + 1))));
  700.                     // 设置数据样式
  701.                     sheet.getRow(i + 1).getCell(j).setCellStyle(styleList.get(2));
  702.                 }
  703.             }
  704.         }
  705.         return result;
  706.     }
  707.     /**
  708.      * 生成表格样式
  709.      *
  710.      * @return
  711.      */
  712.     private static List<CellStyle> tableStyle() {
  713.         List<CellStyle> cellStyleList = new ArrayList<CellStyle>();
  714.         // 样式准备
  715.         // 标题样式
  716.         CellStyle style = wb.createCellStyle();
  717.         style.setFillForegroundColor(IndexedColors.ROYAL_BLUE.getIndex());
  718.         style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
  719.         style.setBorderBottom(BorderStyle.THIN); // 下边框
  720.         style.setBorderLeft(BorderStyle.THIN);// 左边框
  721.         style.setBorderTop(BorderStyle.THIN);// 上边框
  722.         style.setBorderRight(BorderStyle.THIN);// 右边框
  723.         style.setAlignment(HorizontalAlignment.CENTER);
  724.         cellStyleList.add(style);
  725.         CellStyle style1 = wb.createCellStyle();
  726.         style1.setBorderBottom(BorderStyle.THIN); // 下边框
  727.         style1.setBorderLeft(BorderStyle.THIN);// 左边框
  728.         style1.setBorderTop(BorderStyle.THIN);// 上边框
  729.         style1.setBorderRight(BorderStyle.THIN);// 右边框
  730.         style1.setAlignment(HorizontalAlignment.CENTER);
  731.         cellStyleList.add(style1);
  732.         CellStyle cellStyle = wb.createCellStyle();
  733.         cellStyle.setBorderTop(BorderStyle.THIN);// 上边框
  734.         cellStyle.setBorderBottom(BorderStyle.THIN); // 下边框
  735.         cellStyle.setBorderLeft(BorderStyle.THIN);// 左边框
  736.         cellStyle.setBorderRight(BorderStyle.THIN);// 右边框
  737.         cellStyle.setAlignment(HorizontalAlignment.CENTER);// 水平对齐方式
  738.         // cellStyle.setVerticalAlignment(VerticalAlignment.TOP);//垂直对齐方式
  739.         cellStyleList.add(cellStyle);
  740.         return cellStyleList;
  741.     }
  742. }
  743.  

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/17408.html

(0)
上一篇 2021年7月19日 20:10
下一篇 2021年7月19日 20:10

相关推荐

发表回复

登录后才能评论