最近通过poi实现了一整套由 07版excel生成折线图、柱状图及混合双轴图形,本文将记录折线图中的关于图例、标题、坐标轴的各种样式。其中包括颜色、字体、粗细、虚实等。直接上代码吧
package com.ai.util.excel.chart.export; import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xssf.streaming.SXSSFRow; import org.apache.poi.xssf.streaming.SXSSFSheet; import org.apache.poi.xssf.streaming.SXSSFWorkbook; import org.apache.poi.xssf.usermodel.XSSFChart; import java.awt.Color; import org.apache.poi.xssf.usermodel.XSSFColor; import org.apache.xmlbeans.XmlBoolean; import org.openxmlformats.schemas.drawingml.x2006.chart.*; import org.openxmlformats.schemas.drawingml.x2006.main.*; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Created by LCK-XM on 2020/9/16. * 自动生成折线图,支持样式自定义 */ public class ExcelLineChartDemo { private static SXSSFWorkbook wb = new SXSSFWorkbook(); private SXSSFSheet sheet = null; public static void main(String[] args) { // 字段名 // 标题 List<String> titleArr = new ArrayList<String>(); //行别 2013年 2014年 2015年 2016年 2017上半年 2017年 2018上半年 2018年 2019上半年 2019年 2020上半年 titleArr.add("行别"); titleArr.add("2013年"); titleArr.add("2014年"); titleArr.add("2015年"); titleArr.add("2016年"); titleArr.add("2017上半年"); titleArr.add("2017年"); titleArr.add("2018上半年"); titleArr.add("2018年"); titleArr.add("2019上半年"); titleArr.add("2019年"); titleArr.add("2020上半年"); // 模拟数据 List<Map<String, Object>> dataList = intData(); String fileName = "模拟数据"; ExcelLineChartDemo demo = new ExcelLineChartDemo() ; try { // 创建折线图 demo.createTimeXYChar(titleArr, dataList,fileName); //导出到文件 String savePath ="D:/excel/chart/"+fileName+"_" + System.currentTimeMillis() + ".xlsx" ; FileOutputStream out = new FileOutputStream(new File(savePath)); wb.write(out); out.close(); System.out.println(savePath); // Runtime.getRuntime().exec("cmd /c start "+savePath); // Runtime.getRuntime().exec("rundll32 url.dll FileProtocolHandler "+savePath); } catch (IOException e) { e.printStackTrace(); } } /** * 创建折线图 * * @throws IOException */ public void createTimeXYChar(List<String> titleArr, List<Map<String, Object>> dataList,String fileName) { sheet = wb.createSheet(fileName); boolean result = drawSheetMap(sheet, dataList, titleArr); System.out.println("生成折线图-->" + result); } /** * 生成折线图 * * @param sheet * 页签 * @param dataList * 填充数据 * @param titleArr * 图例标题 * @return */ private boolean drawSheetMap(SXSSFSheet sheet, List<Map<String, Object>> dataList, List<String> titleArr) { boolean result = false; // 获取sheet名称 String sheetName = sheet.getSheetName(); result = drawSheet0Table(sheet, titleArr, dataList); // 创建一个画布 Drawing<?> drawing = sheet.createDrawingPatriarch(); // 画一个图区域 // 前四个默认0,开始列 开始行 结束列 结束行 ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 1, dataList.size()+3, 15,dataList.size()+25); // 创建一个chart对象 XSSFChart chart =(XSSFChart) drawing.createChart(anchor); CTChart ctChart =chart.getCTChart(); CTPlotArea ctPlotArea = ctChart.getPlotArea(); //设置画布边框样式 CTChartSpace space = chart.getCTChartSpace(); space.addNewRoundedCorners().setVal(false);//去掉圆角 //设置图表位置 //CTManualLayout manualLayout = chart.getManualLayout().getCTManualLayout(); /*// 设置图表标题 setting chart title ((XSSFChart) chart).setTitleText("图表Demo"); // 标题的位置(于图表上方或居中覆盖) ctChart.getTitle().addNewOverlay().setVal(false); ctChart.addNewShowDLblsOverMax().setVal(true); CTTitle tt = ctChart.addNewTitle(); ctChart.setTitle(tt);*/ //设置标题方法2 CTTitle ctTitle = ctChart.addNewTitle(); ctTitle.addNewOverlay().setVal(false);// true时与饼图重叠 ctTitle.addNewTx().addNewRich().addNewBodyPr(); CTTextBody rich = ctTitle.getTx().getRich(); rich.addNewLstStyle(); CTRegularTextRun newR = rich.addNewP().addNewR(); newR.setT(sheetName); //标题名称 newR.addNewRPr().s