使用Apache poi生成excel并绘制折线统计图,扇形统计图
1.Gradle dependencies
// https://mvnrepository.com/artifact/org.apache.poi/poi
compile group: 'org.apache.poi', name: 'poi', version: '4.0.1'
// https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml
compile group: 'org.apache.poi', name: 'poi-ooxml', version: '4.0.1'
// https://mvnrepository.com/artifact/org.projectlombok/lombok
compile group: 'org.projectlombok', name: 'lombok', version: '1.18.4'
2.import
import java.awt.Color;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xddf.usermodel.chart.AxisCrosses;
import org.apache.poi.xddf.usermodel.chart.AxisPosition;
import org.apache.poi.xddf.usermodel.chart.ChartTypes;
import org.apache.poi.xddf.usermodel.chart.LegendPosition;
import org.apache.poi.xddf.usermodel.chart.MarkerStyle;
import org.apache.poi.xddf.usermodel.chart.XDDFCategoryAxis;
import org.apache.poi.xddf.usermodel.chart.XDDFChartLegend;
import org.apache.poi.xddf.usermodel.chart.XDDFDataSource;
import org.apache.poi.xddf.usermodel.chart.XDDFDataSourcesFactory;
import org.apache.poi.xddf.usermodel.chart.XDDFLineChartData;
import org.apache.poi.xddf.usermodel.chart.XDDFNumericalDataSource;
import org.apache.poi.xddf.usermodel.chart.XDDFValueAxis;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFChart;
import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
import org.apache.poi.xssf.usermodel.XSSFColor;
import org.apache.poi.xssf.usermodel.XSSFDrawing;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxDataSource;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTBoolean;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTLegend;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumDataSource;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumRef;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPieChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPieSer;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPlotArea;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTSerTx;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTStrRef;
import org.openxmlformats.schemas.drawingml.x2006.chart.STLegendPos;
import org.openxmlformats.schemas.drawingml.x2006.main.CTShapeProperties;
import org.springframework.stereotype.Service;
import lombok.extern.slf4j.Slf4j;
3.class
public class MyExcleChart2{
private static Color titleBackColor = new Color(155,194,230); //表头背景色
public static void doWork(List<String> title,List<String> styleList, Map<String, List<Object>> day2ColValueList, File file,
String sheetName,XSSFWorkbook wb,int dateNum) throws IOException {
OutputStream out = null;
try{
int sheetIndex = wb.getSheetIndex(sheetName);
if(sheetIndex >= 0){
wb.removeSheetAt(sheetIndex);
}
int sheetNum = wb.getNumberOfSheets();
XSSFSheet sheet = wb.createSheet();
wb.setSheetName(sheetNum, sheetName);
out = new FileOutputStream(file);
//设置内容样式
XSSFCellStyle style = setBorder(wb);
//设置表头字体
XSSFFont font = wb.createFont();
font.setBold(true); //加粗
//设置表头样式
XSSFCellStyle headStyle = setBorder(wb);
headStyle.setFillForegroundColor(new XSSFColor(titleBackColor));
headStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
headStyle.setFont(font);
//隐藏列
hiddenColumn(sheet,sheetName);
Row row;
Cell cell = null;
row = sheet.createRow(0);
//写入表头
int titleColIndex=0;
for(String t:title) {
cell = row.createCell((short) titleColIndex);
cell.setCellValue(t);
cell.setCellStyle(headStyle);
titleColIndex++;
}
//写入数据
int rowIndex = 1;
for(String key:day2ColValueList.keySet()){
row = sheet.createRow(rowIndex);
List<Object> dataList = day2ColValueList.get(key);
cell = row.createCell(0);
cell.setCellStyle(style);
cell.setCellValue(rowIndex);
int cellIndex = 1;
for(Object s : dataList){
//填充单元格
String cellstyle = styleList.get(dataList.indexOf(s)+1);
cell = row.createCell(cellIndex);
cell.setCellStyle(style);
//此处可以对特殊的行进行处理
if("speciaRowName".equals(key)&&cellIndex>9){
cell = row.createCell(0); cell.setCellStyle(style); cell.setCellValue("speciaRowName");
cell = row.createCell(1); cell.setCellStyle(style); cell.setCellValue("");
cell = row.createCell(2); cell.setCellStyle(style); cell.setCellValue("");
cell = row.createCell(3); cell.setCellStyle(style); cell.setCellValue("");
cell = row.createCell(4); cell.setCellStyle(style); cell.setCellValue("");
cell = row.createCell(cellIndex); cell.setCellStyle(style); double dble = (double)s; cell.setCellValue(dble);
}else if("int".equals(cellstyle)&&null!=s){
int num = (int) s;
cell.setCellValue(num);
}else if("double".equals(cellstyle)&&null!=s){
double dble = (double)s;
cell.setCellValue(dble);
}else{
cell.setCellValue(null==s?"":(String)s);
}
cellIndex ++;
}
rowIndex ++;
}
//绘制图表
if(day2ColValueList.size()>0){
drawChart(sheet, sheetName, day2ColValueList, titleColIndex,dateNum);
}
wb.write(out);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private static void drawChart(XSSFSheet sheet, String sheetName, Map<String, List<Object>> day2ColValueList,
int titleSize,int dateNum) {
Map<String, Integer> paramMap = new HashMap<String, Integer>();// 折线图入参
Map<String, Object> pieParamMap = new HashMap<String, Object>();// 扇形图入参
//此处可以分sheet处理数据
if ("sheetname1".equals(sheetName)) {//sheetname1,需要显示折线图和扇形图
paramMap.put("numstartcol", 5);
paramMap.put("numendcol", 5+dateNum-1);
paramMap.put("prostartcol", 5+dateNum);
paramMap.put("proendcol", 5+dateNum+dateNum-1);
// 业务汇总表,需要统计身份核查、高清人像、银行卡、手机实名四个业务的折线图
for (String key : day2ColValueList.keySet()) {
if ("类型1业务1".equals(key)) {// 人像比对认证走势折线图
// 折线图x轴单位起止列(numstartcol,numendcol),以及计费笔数数据所在行列
paramMap.put("col1", 0);
paramMap.put("col2", 7);
paramMap.put("row1", day2ColValueList.size()+2);
paramMap.put("row2", day2ColValueList.size()+19);
paramMap.put("numstartrow", 1);
paramMap.put("numendrow", 1);
paramMap.put("numstartrow2", 2);
paramMap.put("numendrow2", 2);
// 折线图净收入所在行列
paramMap.put("prostartrow", 1);
paramMap.put("proendrow", 1);
paramMap.put("prostartrow2", 2);
paramMap.put("proendrow2", 2);
drawLineChart(sheet, "业务1", paramMap);
} else if ("类型1业务2".equals(key)) {// 银行卡认证走势折线图
paramMap.put("col1", 8);
paramMap.put("col2", 15);
paramMap.put("row1", day2ColValueList.size()+2);
paramMap.put("row2", day2ColValueList.size()+19);
paramMap.put("numstartrow", 3);
paramMap.put("numendrow", 3);
paramMap.put("numstartrow2", 4);
paramMap.put("numendrow2", 4);
paramMap.put("prostartrow", 3);
paramMap.put("proendrow", 3);
paramMap.put("prostartrow2", 4);
paramMap.put("proendrow2", 4);
drawLineChart(sheet, "业务2", paramMap);
}
}
//柱状图
paramMap.put("col1", 15);
paramMap.put("col2", 23);
paramMap.put("row1", day2ColValueList.size()+2);
paramMap.put("row2", day2ColValueList.size()+19);
paramMap.put("numstartrow", 1);
paramMap.put("numendrow", 1);
paramMap.put("prostartrow", 1);
paramMap.put("proendrow", 1);
// drawBarChart(sheet, "业务1", paramMap);
// 扇形图
pieParamMap.put("col1", 0);
pieParamMap.put("col2", 7);
pieParamMap.put("row1", day2ColValueList.size()+20);
pieParamMap.put("row2", day2ColValueList.size()+39);
pieParamMap.put("data1", "sheetname1!$C$1");
pieParamMap.put("data2", "sheetname1!$C$2:$C$3");
pieParamMap.put("data3", "sheetname1!$D$2:$D$3");
drawPieChart(sheet, "类型1各业务交易量占比", pieParamMap);
pieParamMap.put("col1", 8);
pieParamMap.put("col2", 15);
pieParamMap.put("data3", "sheetname1!$E$2:$E$3");
drawPieChart(sheet, "类型1各业务净收入占比", pieParamMap);
pieParamMap.put("col1", 0);
pieParamMap.put("col2", 7);
pieParamMap.put("row1", day2ColValueList.size()+40);
pieParamMap.put("row2", day2ColValueList.size()+59);
pieParamMap.put("data2", "sheetname1!$C$4:$C$5");
pieParamMap.put("data3", "sheetname1!$D$4:$D$5");
drawPieChart(sheet, "类型2各业务交易量占比", pieParamMap);
pieParamMap.put("col1", 8);
pieParamMap.put("col2", 15);
pieParamMap.put("data3", "sheetname1!$e$4:$e$5");
drawPieChart(sheet, "类型2各业务净收入占比", pieParamMap);
}
}
/**
* 绘制扇形图
* @param sheet sheet
* @param string 标题
* @param paramMap 各种起始截止行列
* col1 col2 row1 row2 图片坐标
* data1 种类划分标志所在列
* data2 各分类名
* data3 各分类数值
*/
private static void drawPieChart(XSSFSheet sheet, String title, Map<String, Object> pieParamMap) {
int col1 = (int) pieParamMap.get("col1");int col2 = (int) pieParamMap.get("col2");
int row1 = (int) pieParamMap.get("row1");int row2 = (int) pieParamMap.get("row2");
String data1 = (String) pieParamMap.get("data1");
String data2 = (String) pieParamMap.get("data2");
String data3 = (String) pieParamMap.get("data3");
XSSFDrawing drawing = sheet.createDrawingPatriarch();
XSSFClientAnchor anchor = (XSSFClientAnchor) drawing.createAnchor(0, 0, 0, 0, col1, row1, col2, row2);
XSSFChart chart = drawing.createChart(anchor);
chart.setTitleText(title);
chart.setTitleOverlay(false);
CTChart ctChart = ((XSSFChart) chart).getCTChart();
CTPlotArea ctPlotArea = ctChart.getPlotArea();
CTPieChart ctPieChart = ctPlotArea.addNewPieChart();
CTBoolean ctBoolean = ctPieChart.addNewVaryColors();
ctBoolean.setVal(true);
CTPieSer ctPieSer = ctPieChart.addNewSer();
CTSerTx ctSerTx = ctPieSer.addNewTx();
CTStrRef ctStrRefTx = ctSerTx.addNewStrRef();
ctStrRefTx.setF(data1);
ctPieSer.addNewIdx().setVal(0);
CTAxDataSource cttAxDataSource = ctPieSer.addNewCat();
CTStrRef ctStrRef = cttAxDataSource.addNewStrRef();
ctStrRef.setF(data2); // 第一行为标题
CTNumDataSource ctNumDataSource = ctPieSer.addNewVal();
CTNumRef ctNumRef = ctNumDataSource.addNewNumRef();
ctNumRef.setF(data3); // 第一行为标题
ctPieSer.addNewDLbls().addNewShowLeaderLines();// 有无此行代码,图上是否显示文字
// legend图注
CTLegend ctLegend = ctChart.addNewLegend();
ctLegend.addNewLegendPos().setVal(STLegendPos.TR);
ctLegend.addNewOverlay().setVal(true);
ctPieSer.addNewExplosion().setVal(1);// 各块之间间隙大小
ctPieSer.addNewOrder().setVal(0);//
CTShapeProperties cTShapeProperties = CTShapeProperties.Factory.newInstance();
ctPieSer.addNewSpPr().set(cTShapeProperties);
}
/**
* 绘制折线图
* @param sheet sheet
* @param desc 横轴描述
* @param 各种起始截止行列,包含如下内容:
* int numstartrow,int numendrow,int numstartcol,int numendcol,//需要绘图的计费笔数起始截止行列
int prostartrow,int proendrow,int prostartcol,int proendcol,//需要绘图的业务净收入起始截止行列
int col1,int row1,int row2 //绘图的起始行列
*/
private static void drawLineChart(XSSFSheet sheet,String desc,Map<String,Integer> paramMap) {
int col1 = paramMap.get("col1"),col2 = paramMap.get("col2"), row1=paramMap.get("row1"),row2 = paramMap.get("row2"),//绘图所在坐标,默认宽度为12列
//双折线图x轴单位起止列(numstartcol,numendcol),以及第一类数据所在行列
numstartrow = paramMap.get("numstartrow"),numendrow = paramMap.get("numendrow"),numstartcol = paramMap.get("numstartcol"),numendcol = paramMap.get("numendcol"),
//双折线图数据2所在行列
prostartrow = paramMap.get("prostartrow"),proendrow = paramMap.get("proendrow"),prostartcol = paramMap.get("prostartcol"),proendcol = paramMap.get("proendcol");
int dx1=0;
int dy1=0;
int dx2=0;
int dy2=0;
XSSFDrawing drawing = sheet.createDrawingPatriarch();
XSSFClientAnchor anchor = drawing.createAnchor(dx1, dy1, dx2, dy2, col1, row1, col2, row2);
XSSFChart chart = drawing.createChart(anchor);
XDDFChartLegend legend = chart.getOrAddLegend();
legend.setPosition(LegendPosition.TOP_RIGHT);
// Use a category axis for the bottom axis.
XDDFCategoryAxis bottomAxis = chart.createCategoryAxis(AxisPosition.TOP);//底部X轴
bottomAxis.setTitle(desc+"交易情况汇总"); // https://stackoverflow.com/questions/32010765
XDDFValueAxis leftAxis = chart.createValueAxis(AxisPosition.LEFT);//左侧Y轴
leftAxis.setTitle("交易量/金额");
leftAxis.setCrosses(AxisCrosses.AUTO_ZERO);
XDDFLineChartData leftdata = (XDDFLineChartData) chart.createData(ChartTypes.LINE, bottomAxis, leftAxis);
/////填充数据
CellRangeAddress cellRangeAddress=new CellRangeAddress(0, 0, numstartcol, numendcol);
XDDFDataSource<String> xs = XDDFDataSourcesFactory.fromStringCellRange(sheet, cellRangeAddress);//日期
CellRangeAddress dataCellRangeAddress=new CellRangeAddress(numstartrow, numendrow, numstartcol, numendcol);
XDDFNumericalDataSource<Double> ys1 = XDDFDataSourcesFactory.fromNumericCellRange(sheet,dataCellRangeAddress);//纵轴为各个数据
XDDFLineChartData.Series series1 = (XDDFLineChartData.Series) leftdata.addSeries(xs, ys1);
series1.setTitle("交易量总计(笔)", null); // https://stackoverflow.com/questions/21855842
series1.setSmooth(false); // https://stackoverflow.com/questions/29014848
series1.setMarkerStyle(MarkerStyle.DASH); // https://stackoverflow.com/questions/39636138
CellRangeAddress dataCellRangeAddress2=new CellRangeAddress(prostartrow, proendrow,prostartcol,proendcol);
XDDFNumericalDataSource<Double> ys2 = XDDFDataSourcesFactory.fromNumericCellRange(sheet,dataCellRangeAddress2);//纵轴为各个数据
XDDFLineChartData.Series series2 = (XDDFLineChartData.Series) leftdata.addSeries(xs, ys2);
series2.setTitle("收入总计(元)", null); // https://stackoverflow.com/questions/21855842
series2.setSmooth(false); // https://stackoverflow.com/questions/29014848
series2.setMarkerStyle(MarkerStyle.DASH); // https://stackoverflow.com/questions/39636138
if(null!=paramMap.get("numstartrow2")&&null!=paramMap.get("numendrow2")&&null!=paramMap.get("prostartrow2")&&null!=paramMap.get("proendrow2")){
int numstartrow2 = paramMap.get("numstartrow2"), numendrow2 = paramMap.get("numendrow2"),
prostartrow2 = paramMap.get("prostartrow2"), proendrow2 = paramMap.get("proendrow2");
series1.setTitle("类型1交易量总计(笔)", null); // https://stackoverflow.com/questions/21855842
series2.setTitle("类型1收入总计(元)", null); // https://stackoverflow.com/questions/21855842
CellRangeAddress dataCellRangeAddress3=new CellRangeAddress(numstartrow2, numendrow2, numstartcol, numendcol);
XDDFNumericalDataSource<Double> ys3 = XDDFDataSourcesFactory.fromNumericCellRange(sheet,dataCellRangeAddress3);//纵轴为各个数据
XDDFLineChartData.Series series3 = (XDDFLineChartData.Series) leftdata.addSeries(xs, ys3);
series3.setTitle("类型2交易量总计(笔)", null); // https://stackoverflow.com/questions/21855842
series3.setSmooth(false); // https://stackoverflow.com/questions/29014848
series3.setMarkerStyle(MarkerStyle.DASH); // https://stackoverflow.com/questions/39636138
CellRangeAddress dataCellRangeAddress4=new CellRangeAddress(prostartrow2, proendrow2,prostartcol,proendcol);
XDDFNumericalDataSource<Double> ys4 = XDDFDataSourcesFactory.fromNumericCellRange(sheet,dataCellRangeAddress4);//纵轴为各个数据
XDDFLineChartData.Series series4 = (XDDFLineChartData.Series) leftdata.addSeries(xs, ys4);
series4.setTitle("类型2收入总计(元)", null); // https://stackoverflow.com/questions/21855842
series4.setSmooth(false); // https://stackoverflow.com/questions/29014848
series4.setMarkerStyle(MarkerStyle.DASH); // https://stackoverflow.com/questions/39636138
chart.plot(leftdata);
chart.plot(leftdata);
}
chart.plot(leftdata);
chart.plot(leftdata);
}
/**
* 柱状图
* @param sheet
* @param desc
* @param paramMap
*/
private static void drawBarChart(XSSFSheet sheet,String desc,Map<String,Integer> paramMap) {
int col1 = paramMap.get("col1"),col2 = paramMap.get("col2"), row1=paramMap.get("row1"),row2 = paramMap.get("row2"),//绘图所在坐标,默认宽度为12列
numstartrow = paramMap.get("numstartrow"),numendrow = paramMap.get("numendrow"),numstartcol = paramMap.get("numstartcol"),numendcol = paramMap.get("numendcol"),
prostartrow = paramMap.get("prostartrow"),proendrow = paramMap.get("proendrow"),prostartcol = paramMap.get("prostartcol"),proendcol = paramMap.get("proendcol");
int dx1=0;
int dy1=0;
int dx2=0;
int dy2=0;
XSSFDrawing drawing = sheet.createDrawingPatriarch();
XSSFClientAnchor anchor = drawing.createAnchor(dx1, dy1, dx2, dy2, col1, row1, col2, row2);
XSSFChart chart = drawing.createChart(anchor);
XDDFChartLegend legend = chart.getOrAddLegend();
legend.setPosition(LegendPosition.TOP_RIGHT);
// Use a category axis for the bottom axis.
XDDFCategoryAxis bottomAxis = chart.createCategoryAxis(AxisPosition.TOP);//底部X轴
bottomAxis.setTitle(desc+"交易情况汇总"); // https://stackoverflow.com/questions/32010765
XDDFValueAxis leftAxis = chart.createValueAxis(AxisPosition.LEFT);//左侧Y轴
leftAxis.setTitle("交易量/金额");
leftAxis.setCrosses(AxisCrosses.AUTO_ZERO);
XDDFBarChartData data = (XDDFBarChartData) chart.createData(ChartTypes.BAR, bottomAxis, leftAxis);
CellRangeAddress cellRangeAddress=new CellRangeAddress(numstartrow, numendrow, numstartcol, numendcol);
XDDFDataSource<String> xs = XDDFDataSourcesFactory.fromStringCellRange(sheet, cellRangeAddress);//横轴为第一列日期
CellRangeAddress dataCellRangeAddress=new CellRangeAddress(numstartrow, numendrow, numstartcol, numendcol);
XDDFNumericalDataSource<Double> ys1 = XDDFDataSourcesFactory.fromNumericCellRange(sheet,dataCellRangeAddress);//纵轴为各个数据
XDDFBarChartData.Series series1 = (XDDFBarChartData.Series) data.addSeries(xs, ys1);
series1.setTitle("交易量总计(笔)", null); // https://stackoverflow.com/questions/21855842
CellRangeAddress dataCellRangeAddress2=new CellRangeAddress(prostartrow, proendrow,prostartcol,proendcol);
XDDFNumericalDataSource<Double> ys2 = XDDFDataSourcesFactory.fromNumericCellRange(sheet,dataCellRangeAddress2);//纵轴为各个数据
XDDFBarChartData.Series series2 = (XDDFBarChartData.Series) data.addSeries(xs, ys2);
series2.setTitle("收入总计(元)", null); // https://stackoverflow.com/questions/21855842
/*
for(int col=1;col<2;col++) {//数据列数:第一列为日期,其他列为对应数据。
CellRangeAddress dataCellRangeAddress=new CellRangeAddress(prostartrow, proendrow, prostartcol, proendcol);
XDDFNumericalDataSource ys = XDDFDataSourcesFactory.fromNumericCellRange(sheet,dataCellRangeAddress);//纵轴为各个数据
XDDFChartData.Series series1 = data.addSeries(xs, ys);
series1.setTitle("111", null);
}*/
chart.plot(data);
// in order to transform a bar chart into a column chart, you just need to change the bar direction
XDDFBarChartData bar = (XDDFBarChartData) data;
bar.setBarDirection(BarDirection.COL);
}
/**
* 隐藏列
* @param sheet
* @param sheetName
*/
private static void hiddenColumn(XSSFSheet sheet, String sheetName) {
/*if(sheetName.equals("sheetname2")){//需要隐藏列
sheet.setColumnHidden(3, true);
sheet.setColumnHidden(4, true);
sheet.setColumnHidden(5, true);
sheet.setColumnHidden(6, true);
sheet.setColumnHidden(7, true);
sheet.setColumnHidden(8, true);
}*/
}
/**
* 设置边框
*/
private static XSSFCellStyle setBorder(XSSFWorkbook wb){
XSSFCellStyle style = wb.createCellStyle();
style.setBorderBottom(BorderStyle.THIN); //边框
style.setBorderTop(BorderStyle.THIN); //边框
style.setBorderLeft(BorderStyle.THIN); //边框
style.setBorderRight(BorderStyle.THIN); //边框
return style;
}
}
4.测试类
import java.io.File;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class MyBarChartTest {
public static void main(String args[]) {
String sheetName = "sheetname1";
try (XSSFWorkbook wb = new XSSFWorkbook()){
String filePathDaily = "C:/Users/Administrator/Desktop/jfree/";
String fileName = "exceltest.xlsx";
File filePath = new File(filePathDaily);
if(!filePath.exists()&&!filePath.isDirectory()){
filePath.mkdir();
}
//1.统计昨日交易量
File file = new File(filePathDaily+fileName);
List<String> title=Arrays.asList("序号","类型","业务","合计:交易量","合计:收入",
"2019-01-01","2019-01-02","2019-01-03","2019-01-04","2019-01-05",
"2019-01-01收入","2019-01-02收入","2019-01-03收入","2019-01-04收入","2019-01-05收入");
List<String> titleStyle=Arrays.asList("int","String","String","int","double",
"int","int","int","int","int",
"double","double","double","double","double");
List<String> dates = Arrays.asList("2019-01-01","2019-01-02","2019-01-03","2019-01-04","2019-01-05");
Map<String, List<Object>> day2ColValueList=new LinkedHashMap<String, List<Object>>();
day2ColValueList.put("类型1业务1",Arrays.asList("类型1","业务1",500,1000.00,100,50,100,150,100,200.00,150.00,200.00,250.00,200.00));
day2ColValueList.put("类型1业务2",Arrays.asList("类型1","业务2",400,800.00,80,60,80,100,80,160.00,130.00,160.00,190.00,160.00));
day2ColValueList.put("类型2业务1",Arrays.asList("类型2","业务1",600,1200.00,120,70,120,170,120,240.00,170.00,240.00,290.00,240.00));
day2ColValueList.put("类型2业务2",Arrays.asList("类型2","业务2",200,400.00,40,140,40,80,40,80.00,100.00,80.00,60.00,80.00));
MyExcleChart2.doWork(title, titleStyle, day2ColValueList,file,sheetName,wb,dates.size());
} catch (Exception e) {
e.printStackTrace();
}
}
}
<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>
package excel.test.com;
import java.io.FileOutputStream;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Chart;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFChart;
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.openxmlformats.schemas.drawingml.x2006.chart.CTAxDataSource;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTBarChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTBarSer;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTBoolean;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTCatAx;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTLegend;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTLineChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTLineSer;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumDataSource;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumRef;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPlotArea;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTScaling;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTSerTx;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTStrRef;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTValAx;
import org.openxmlformats.schemas.drawingml.x2006.chart.STAxPos;
import org.openxmlformats.schemas.drawingml.x2006.chart.STBarDir;
import org.openxmlformats.schemas.drawingml.x2006.chart.STCrosses;
import org.openxmlformats.schemas.drawingml.x2006.chart.STLegendPos;
import org.openxmlformats.schemas.drawingml.x2006.chart.STOrientation;
import org.openxmlformats.schemas.drawingml.x2006.chart.STTickLblPos;
public class BarAndLineChart2 {
public static void main(String[] args) throws Exception {
XSSFWorkbook wb = new XSSFWorkbook();
XSSFSheet sheet = wb.createSheet("Sheet1");
Row row;
Cell cell;
row = sheet.createRow(0);
row.createCell(0);
row.createCell(1).setCellValue("Bars");
row.createCell(2).setCellValue("Lines");
for (int r = 1; r < 7; r++) {
row = sheet.createRow(r);
cell = row.createCell(0);
cell.setCellValue("C" + r);
cell = row.createCell(1);
cell.setCellValue(new java.util.Random().nextDouble());
cell = row.createCell(2);
cell.setCellValue(new java.util.Random().nextDouble()*10d);
}
XSSFDrawing drawing = sheet.createDrawingPatriarch();
// ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 4, 0, 11, 15);
XSSFClientAnchor anchor = (XSSFClientAnchor) drawing.createAnchor(0, 0, 0, 0, 4, 0, 11, 15);
Chart chart = drawing.createChart(anchor);
CTChart ctChart = ((XSSFChart)chart).getCTChart();
CTPlotArea ctPlotArea = ctChart.getPlotArea();
//the bar chart
CTBarChart ctBarChart = ctPlotArea.addNewBarChart();
CTBoolean ctBoolean = ctBarChart.addNewVaryColors();
ctBoolean.setVal(true);
ctBarChart.addNewBarDir().setVal(STBarDir.COL);
//the bar series
CTBarSer ctBarSer = ctBarChart.addNewSer();
CTSerTx ctSerTx = ctBarSer.addNewTx();
CTStrRef ctStrRef = ctSerTx.addNewStrRef();
ctStrRef.setF("Sheet1!$B$1");
ctBarSer.addNewIdx().setVal(0);
CTAxDataSource cttAxDataSource = ctBarSer.addNewCat();
ctStrRef = cttAxDataSource.addNewStrRef();
ctStrRef.setF("Sheet1!$A$2:$A$7");
CTNumDataSource ctNumDataSource = ctBarSer.addNewVal();
CTNumRef ctNumRef = ctNumDataSource.addNewNumRef();
ctNumRef.setF("Sheet1!$B$2:$B$7");
//at least the border lines in Libreoffice Calc ;-)
ctBarSer.addNewSpPr().addNewLn().addNewSolidFill().addNewSrgbClr().setVal(new byte[] {0,0,0});
//telling the BarChart that it has axes and giving them Ids
ctBarChart.addNewAxId().setVal(123456); //cat axis 1 (bars)
ctBarChart.addNewAxId().setVal(123457); //val axis 1 (left)
//the line chart
CTLineChart ctLineChart = ctPlotArea.addNewLineChart();
ctBoolean = ctLineChart.addNewVaryColors();
ctBoolean.setVal(true);
//the line series
CTLineSer ctLineSer = ctLineChart.addNewSer();
ctSerTx = ctLineSer.addNewTx();
ctStrRef = ctSerTx.addNewStrRef();
ctStrRef.setF("Sheet1!$C$1");
ctLineSer.addNewIdx().setVal(1);
cttAxDataSource = ctLineSer.addNewCat();
ctStrRef = cttAxDataSource.addNewStrRef();
ctStrRef.setF("Sheet1!$A$2:$A$7");
ctNumDataSource = ctLineSer.addNewVal();
ctNumRef = ctNumDataSource.addNewNumRef();
ctNumRef.setF("Sheet1!$C$2:$C$7");
//at least the border lines in Libreoffice Calc ;-)
ctLineSer.addNewSpPr().addNewLn().addNewSolidFill().addNewSrgbClr().setVal(new byte[] {0,0,0});
//telling the LineChart that it has axes and giving them Ids
ctLineChart.addNewAxId().setVal(123458); //cat axis 2 (lines)
ctLineChart.addNewAxId().setVal(123459); //val axis 2 (right)
//cat axis 1 (bars)
CTCatAx ctCatAx = ctPlotArea.addNewCatAx();
ctCatAx.addNewAxId().setVal(123456); //id of the cat axis
CTScaling ctScaling = ctCatAx.addNewScaling();
ctScaling.addNewOrientation().setVal(STOrientation.MIN_MAX);
ctCatAx.addNewDelete().setVal(false);
ctCatAx.addNewAxPos().setVal(STAxPos.B);
ctCatAx.addNewCrossAx().setVal(123457); //id of the val axis
ctCatAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);
//val axis 1 (left)
CTValAx ctValAx = ctPlotArea.addNewValAx();
ctValAx.addNewAxId().setVal(123457); //id of the val axis
ctScaling = ctValAx.addNewScaling();
ctScaling.addNewOrientation().setVal(STOrientation.MIN_MAX);
ctValAx.addNewDelete().setVal(false);
ctValAx.addNewAxPos().setVal(STAxPos.L);
ctValAx.addNewCrossAx().setVal(123456); //id of the cat axis
ctValAx.addNewCrosses().setVal(STCrosses.AUTO_ZERO); //this val axis crosses the cat axis at zero
ctValAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);
//cat axis 2 (lines)
ctCatAx = ctPlotArea.addNewCatAx();
ctCatAx.addNewAxId().setVal(123458); //id of the cat axis
ctScaling = ctCatAx.addNewScaling();
ctScaling.addNewOrientation().setVal(STOrientation.MIN_MAX);
ctCatAx.addNewDelete().setVal(true); //this cat axis is deleted
ctCatAx.addNewAxPos().setVal(STAxPos.B);
ctCatAx.addNewCrossAx().setVal(123459); //id of the val axis
ctCatAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);
//val axis 2 (right)
ctValAx = ctPlotArea.addNewValAx();
ctValAx.addNewAxId().setVal(123459); //id of the val axis
ctScaling = ctValAx.addNewScaling();
ctScaling.addNewOrientation().setVal(STOrientation.MIN_MAX);
ctValAx.addNewDelete().setVal(false);
ctValAx.addNewAxPos().setVal(STAxPos.R);
ctValAx.addNewCrossAx().setVal(123458); //id of the cat axis
ctValAx.addNewCrosses().setVal(STCrosses.MAX); //this val axis crosses the cat axis at max value
ctValAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);
//legend
CTLegend ctLegend = ctChart.addNewLegend();
ctLegend.addNewLegendPos().setVal(STLegendPos.B);
ctLegend.addNewOverlay().setVal(false);
FileOutputStream fileOut = new FileOutputStream("BarAndLineChart2.xlsx");
wb.write(fileOut);
fileOut.close();
}
}