JFreeChart生成混合圖(柱狀圖折線圖)並插入excel中
阿新 • • 發佈:2019-01-04
效果如下
java code
maven pom 依賴package com.springapp.mvc; import org.apache.poi.util.IOUtils; import org.apache.poi.xssf.usermodel.XSSFClientAnchor; import org.apache.poi.xssf.usermodel.XSSFDrawing; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartUtilities; import org.jfree.chart.JFreeChart; import org.jfree.chart.axis.NumberAxis; import org.jfree.chart.axis.NumberTickUnit; import org.jfree.chart.labels.ItemLabelAnchor; import org.jfree.chart.labels.ItemLabelPosition; import org.jfree.chart.labels.StandardCategoryItemLabelGenerator; import org.jfree.chart.plot.CategoryPlot; import org.jfree.chart.plot.DatasetRenderingOrder; import org.jfree.chart.plot.PlotOrientation; import org.jfree.chart.renderer.category.LineAndShapeRenderer; import org.jfree.chart.renderer.category.StackedBarRenderer; import org.jfree.chart.renderer.category.StandardBarPainter; import org.jfree.data.category.CategoryDataset; import org.jfree.data.category.DefaultCategoryDataset; import org.jfree.data.general.DatasetUtilities; import org.jfree.ui.TextAnchor; import java.awt.*; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.text.NumberFormat; import java.util.Random; /** * Created by acer on 2017/9/3. */ public class MyJFreeChart { public static final String[] ITMES = {"JAN","Feb","Mar"}; //Stacked Bar Chart data private static CategoryDataset categoryDataset(String[] items){ String[] series = new String[]{"Green","Amber","Red"}; double[] greenItems = new double[items.length]; double[] amberItems = new double[items.length]; double[] redItems = new double[items.length]; Random rd = null; for (int i = 0; i < items.length; i++) { rd = new Random(); greenItems[i] = 700 + rd.nextInt(100); amberItems[i] = 150 + rd.nextInt(100); redItems[i] = 10 + rd.nextInt(100); } double[][] data = new double[][]{greenItems,amberItems,redItems}; return DatasetUtilities.createCategoryDataset(series,ITMES,data); } //line Chart data private static CategoryDataset categoryLineDataset(String[] items){ DefaultCategoryDataset dataset = new DefaultCategoryDataset(); String s = "%Reds"; Random rd = null; for (int i = 0; i < items.length; i++) { rd = new Random(); dataset.addValue(rd.nextDouble()/10,s,items[i]); } return dataset; } private static JFreeChart createChart(CategoryDataset categoryBarDataset,CategoryDataset categoryLineDataset){ JFreeChart chart = ChartFactory.createBarChart("Title","","",categoryBarDataset, PlotOrientation.VERTICAL,true,true,false); CategoryPlot plot = (CategoryPlot)chart.getPlot(); //set right margin plot.getDomainAxis().setUpperMargin(0.1); //set X axis Label lines plot.getDomainAxis().setMaximumCategoryLabelLines(2); NumberAxis na = (NumberAxis)plot.getRangeAxis(); //stack bar chart StackedBarRenderer rederer = new StackedBarRenderer(); plot.setRenderer(0,rederer); rederer.setBaseItemLabelsVisible(true); rederer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator()); rederer.setBaseItemLabelFont(new Font("Calibri",Font.ITALIC,15)); rederer.setMaximumBarWidth(0.07); rederer.setMinimumBarLength(0.1); rederer.setBarPainter(new StandardBarPainter()); rederer.setSeriesPaint(0,Color.green); rederer.setSeriesPaint(1,Color.yellow); rederer.setSeriesPaint(2,Color.red); //line chart LineAndShapeRenderer lineRenderer = new LineAndShapeRenderer(); plot.setRenderer(1,lineRenderer); //set data display as x.x% NumberFormat nf = NumberFormat.getPercentInstance(); nf.setMinimumFractionDigits(1); lineRenderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator("{2}",nf)); lineRenderer.setBaseItemLabelFont(new Font("Calibri",Font.ITALIC,15)); lineRenderer.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.INSIDE12, TextAnchor.BASELINE_LEFT)); lineRenderer.setBaseItemLabelsVisible(true); lineRenderer.setBaseShapesVisible(true); //point style lineRenderer.setSeriesShape(0,new Rectangle(5,5)); lineRenderer.setBaseShapesVisible(true); NumberAxis rightYAxis = new NumberAxis(""); //set axis display as x.x% rightYAxis.setNumberFormatOverride(nf); rightYAxis.setTickUnit(new NumberTickUnit(0.01)); //point axis, point dataset, mapping axis and dataset plot.setRangeAxis(1,rightYAxis); plot.setDataset(1,categoryLineDataset); plot.mapDatasetToRangeAxis(1,1); //set render order plot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD); return chart; } //generate jpg and insert into excel public static void main(String[] args) { int rowsNum = 5; JFreeChart chart = createChart(categoryDataset(ITMES),categoryLineDataset(ITMES)); FileOutputStream excelFos = null; FileInputStream excelFis = null; ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(128); try { ChartUtilities.writeChartAsJPEG(byteArrayOutputStream,1.0f,chart,1200,900); excelFis = new FileInputStream("D://testFreeChart.xlsx"); XSSFWorkbook wb = new XSSFWorkbook(excelFis); XSSFSheet sheet = wb.getSheetAt(0); XSSFDrawing patriarch = sheet.createDrawingPatriarch(); // begin column,begin row; end column,end row; //1,0 + rowsNum,15,42+rowsNum; insert from cell(1,0 + rowsNum) to cell(15,42 + rowsNum) XSSFClientAnchor anchor = new XSSFClientAnchor(0,0,0,0,1,0 + rowsNum,15,42+rowsNum); patriarch.createPicture(anchor,wb.addPicture(byteArrayOutputStream.toByteArray(),XSSFWorkbook.PICTURE_TYPE_JPEG)); excelFos = new FileOutputStream("D://result.xlsx"); wb.write(excelFos); } catch (IOException e) { e.printStackTrace(); }finally { IOUtils.closeQuietly(byteArrayOutputStream); IOUtils.closeQuietly(excelFos); IOUtils.closeQuietly(excelFis); } } }
<dependency> <groupId>org.jfree</groupId> <artifactId>jfreechart</artifactId> <version>1.0.19</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.15</version> </dependency>