Excel通过poi设置折线图样式
最近通过poi实现了⼀整套由 07版excel⽣成折线图、柱状图及混合双轴图形,本⽂将记录折线图中的关于图例、标题、坐标轴的各种样式。其中包括颜⾊、字体、粗细、虚实等。直接上代码吧
package com.port;
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 lbeans.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;getsavefilename
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 {
// 创建折线图
//导出到⽂件
String savePath ="D:/excel/chart/"+fileName+"_" + System.currentTimeMillis() + ".xlsx" ;
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().exec("cmd /c start "+savePath);
// Runtime().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 = SheetName();
result = drawSheet0Table(sheet, titleArr, dataList);
// 创建⼀个画布
Drawing<?> drawing = ateDrawingPatriarch();
// 画⼀个图区域
// 前四个默认0,开始列开始⾏结束列结束⾏
ClientAnchor anchor = ateAnchor(0, 0, 0, 0, 1, dataList.size()+3, 15,dataList.size()+25);
// 创建⼀个chart对象
XSSFChart chart =(XSSFChart) ateChart(anchor);
CTChart ctChart =CTChart();
CTPlotArea ctPlotArea = PlotArea();
//设置画布边框样式
CTChartSpace space = CTChartSpace();
space.addNewRoundedCorners().setVal(false);//去掉圆⾓
//设置图表位置
//CTManualLayout manualLayout = ManualLayout().getCTManualLayout();
/*// 设置图表标题 setting chart title
((XSSFChart) chart).setTitleText("图表Demo");
// 标题的位置(于图表上⽅或居中覆盖)
ctChart.addNewShowDLblsOverMax().setVal(true);
CTTitle tt = ctChart.addNewTitle();
CTTitle tt = ctChart.addNewTitle();
ctChart.setTitle(tt);*/
//设置标题⽅法2
CTTitle ctTitle = ctChart.addNewTitle();
ctTitle.addNewOverlay().setVal(false);// true时与饼图重叠
ctTitle.addNewTx().addNewRich().addNewBodyPr();
CTTextBody rich = Tx().getRich();
rich.addNewLstStyle();
CTRegularTextRun newR = rich.addNewP().addNewR();
newR.setT(sheetName); //标题名称
newR.addNewRPr().setB(false);
XmlBoolean xmlBoolean = wInstance();
xmlBoolean.setBooleanValue(false);
/
/ 单元格没有数据时,该点在图表上为0或不显⽰或跳过直接连接
ctChart.addNewDispBlanksAs().setVal(STDispBlanksAs.SPAN);
//是否添加左侧坐标轴
ctChart.addNewShowDLblsOverMax().setVal(true);
// 折线图
CTLineChart ctLineChart = ctPlotArea.addNewLineChart();
// CTLineChart ctLineChart2 = ctPlotArea.addNewLineChart();
CTBoolean ctBoolean = ctLineChart.addNewVaryColors();
ctLineChart.addNewGrouping().setVal(STGrouping.STANDARD);
// 创建序列,并且设置选中区域
for (int i = 1; i < dataList.size() ; i++) {
CTLineSer ctLineSer = ctLineChart.addNewSer();
CTSerTx ctSerTx = ctLineSer.addNewTx();
// 图例区
CTStrRef ctStrRef = ctSerTx.addNewStrRef();
String legendDataRange = new CellRangeAddress( i, i, 0, 0).formatAsString(sheetName, true);
ctStrRef.setF(legendDataRange);
ctLineSer.addNewIdx().setVal(i);
// 横坐标区
CTAxDataSource cttAxDataSource = ctLineSer.addNewCat();
ctStrRef = cttAxDataSource.addNewStrRef();
String axisDataRange = new CellRangeAddress(0, 0, 1, titleArr.size()).formatAsString(sheetName, true); ctStrRef.setF(axisDataRange);
// 数据区域
CTNumDataSource ctNumDataSource = ctLineSer.addNewVal();
CTNumRef ctNumRef = ctNumDataSource.addNewNumRef();
// 选第1-6⾏,第1-3列作为数据区域 //1 2 3
//23456
String numDataRange = new CellRangeAddress(i,i , 2,6).formatAsString(sheetName, true);
System.out.println(numDataRange);
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.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 markerStyle = addNewMarker.addNewSymbol();
//NONE-⽆ CIRCLE-实⼼圆圈 STAR-星号 DASH-实线 DIAMOND-⽅块(菱形) DOT-点 PLUS-加号 SQUARE-正⽅形 TRIANGLE-三⾓形 X-X
markerStyle.setVal(STMarkerStyle.CIRCLE);
//设置线条颜⾊
STHexBinary3 hex = wInstance();
hex.setStringValue("5555FF");
CTShapeProperties ctShapeProperties = ctLineSer.addNewSpPr();
CTLineProperties lineProperties = ctShapeProperties.addNewLn();
CTSolidColorFillProperties properties = lineProperties.addNewSolidFill();
CTSRgbColor rgbColor = properties.addNewSrgbClr();
rgbColor .xsetVal(hex);
//设置线条粗细
lineProperties.setW(20000);
//设置线条类型虚线实线
CTPresetLineDashProperties ctPresetLineDashProperties = lineProperties.addNewPrstDash();
ctPresetLineDashProperties.setVal(STPresetLineDashVal.LG_DASH);
}
//告诉条形图它有轴并给它们ID
int xAxisId = dataList.size() + 1 + 10000;
int yAxisId = dataList.size() + 2 + 10000;
ctLineChart.addNewAxId().setVal(xAxisId);
ctLineChart.addNewAxId().setVal(yAxisId);
//==========================================
// 设置x轴属性
Boolean isXAxisDelete =false ;
CTCatAx ctCatAx = ctPlotArea.addNewCatAx();
ctCatAx.addNewAxId().setVal(xAxisId);
ctCatAx.addNewCrossAx().setVal(yAxisId);
CTScaling ctScaling = ctCatAx.addNewScaling();
ctScaling.addNewOrientation().setVal(STOrientation.MIN_MAX); //X轴排列⽅向
ctCatAx.addNewDelete().setVal(isXAxisDelete);// 是否隐藏x轴
ctCatAx.addNewAxPos().setVal(STAxPos.B);// x轴位置(左右上下)
ctCatAx.addNewMajorTickMark().setVal(STTickMark.OUT);// 主刻度线在轴上的位置(内、外、交叉、⽆)
ctCatAx.addNewMinorTickMark().setVal(STTickMark.NONE);// 次刻度线在轴上的位置(内、外、交叉、⽆)
ctCatAx.addNewAuto().setVal(true);
ctCatAx.addNewLblAlgn().setVal(STLblAlgn.CTR);
ctCatAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);// 标签(即刻度⽂字)的位置(轴旁、⾼、低、⽆)
ctCatAx.addNewSpPr().addNewLn().addNewSolidFill().addNewSrgbClr().setVal( new XSSFColor(new Color(58, 76, 78)).getRGB());// x轴颜⾊,有两种⽅式设置颜⾊
// STHexBinary3 hex_x = wInstance();
// hex_x.setStringValue("5555FF");
// ctCatAx.addNewSpPr().addNewLn().addNewSolidFill().addNewSrgbClr().xsetVal(hex_x);
// ctCatAx.addNewCrosses().setVal(STCrosses.MIN); //X轴以Y轴的最⼩值或最⼤值穿过Y轴
//设置X轴字体
/*<c:txPr>
<a:bodyPr/>
<a:lstStyle/>
<a:p>
<a:pPr>
<a:defRPr baseline="0" sz="800">
<a:ea charset="-122" pitchFamily="49" typeface="楷体"/>
<a:ea charset="-122" pitchFamily="49" typeface="楷体"/>
</a:defRPr>
</a:pPr>
<a:endParaRPr lang="zh-CN"/>
</a:p>
</c:txPr>*/
ctCatAx.addNewTxPr().addNewBodyPr();
CTTextCharacterProperties properties = TxPr().addNewP().addNewPPr().addNewDefRPr();
properties.setBaseline(0);
properties.setSz(800);//字体⼤⼩
properties.addNewEa().setTypeface("楷体");
// Ea().setCharset((byte) -122);
// Ea().setPitchFamily((byte)49);
//===========================================
// 设置y轴属性
CTValAx ctValAx = ctPlotArea.addNewValAx();
ctValAx.addNewAxId().setVal(yAxisId);
ctValAx.addNewCrossAx().setVal(xAxisId);
ctScaling = ctValAx.addNewScaling();
ctScaling.addNewOrientation().setVal(STOrientation.MIN_MAX); //Y轴排列⽅向
ctValAx.addNewDelete().setVal(false);// 是否隐藏y轴
char yAxisPosition = 'L';
switch (yAxisPosition) {// y轴位置(左右上下)
case 'L' :
ctValAx.addNewAxPos().setVal(STAxPos.L);
ctValAx.addNewCrosses().setVal(STCrosses.MIN);// 纵坐标交叉位置(最⼤、最⼩、0、指定某⼀刻度),也可不⽤设置,此处如果设置为MAX,则上⾯设置的左侧失效
break;
case 'R' :
ctValAx.addNewAxPos().setVal(STAxPos.R);
ctValAx.addNewCrosses().setVal(STCrosses.MAX);
break;
case 'T' :
ctValAx.addNewAxPos().setVal(STAxPos.T);
break;
case 'B' :
ctValAx.addNewAxPos().setVal(STAxPos.B);
break;
default :
ctValAx.addNewAxPos().setVal(STAxPos.L);
ctValAx.addNewCrosses().setVal(STCrosses.MIN);
break;
}
ctValAx.addNewMajorTickMark().setVal(STTickMark.OUT);// 主刻度线在轴上的位置(内、外、交叉、⽆)
ctValAx.addNewMinorTickMark().setVal(STTickMark.NONE);// 次刻度线在轴上的位置(内、外、交叉、⽆)
ctValAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);// 标签(即刻度⽂字)的位置(轴旁、⾼、低、⽆)
// ctValAx.addNewSpPr().addNewLn().addNewSolidFill().addNewSrgbClr().setVal( new XSSFColor(new Color(255, 76, 105)).getRGB());// x轴颜⾊,有两种⽅式设置颜⾊
STHexBinary3 hex_y = wInstance();
hex_y.setStringValue("5555FF");
ctValAx.addNewSpPr().addNewLn().addNewSolidFill().addNewSrgbClr().xsetVal(hex_y);
/
/ ctValAx.addNewMajorGridlines().addNewSpPr().addNewLn().addNewSolidFill().addNewSrgbClr().setVal(new XSSFColor(new Color(134, 134, 134)).getRGB());// 显⽰主要⽹格线,并设置颜⾊
ctScaling = ctValAx.addNewScaling() ;
ctScaling.addNewMin().setVal(10);// 设置纵坐标最⼩值
ctScaling.addNewMax().setVal(100);// 设置纵坐标最⼤值
//设置纵坐标标题
// ctValAx.addNewTitle().addNewTx().addNewStrRef()
// .setF(new CellRangeAddress(0, 0, 0, 0).SheetName(), true));
//图例
/* <c:legend>
<c:legendPos val="b"/>
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论