java读取excel图表模板,修改选值范围

自定义目录标题)

java读取excel图表模板,修改选值范围

梳理一下思路:
首先使用POI读取excel第一个sheet页,在sheet页中获取到图表饼状图或圆环图,修改图形数据并修改选值范围达到自己需要的表格。

package com.adc.da.util.utils;

import org.apache.poi.POIXMLDocumentPart;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.*;
import org.openxmlformats.schemas.drawingml.x2006.chart.*;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;



/**
 * @Author: zhengxz
 * @Date: 2019/11/11 13:54
 */
public class ExportExcel {
    public static void main(String[]args){
        List<List<Object>> list = new ArrayList<>();
        List<Object> list_0 = new ArrayList<>();
        List<Object> list_1 = new ArrayList<>();
        HttpServletRequest request = null;
        HttpServletResponse response = null;
        //1为饼状图2为圆环图
        String type = "1";
        list_0.add("");
        list_0.add("Estate");
        list_0.add("Hatchback");
        list_0.add("MPV");
        list_0.add("Sedan");
        list_0.add("SUV");
        list_0.add("VAN");
        list_1.add("单价");
        list_1.add(0.6);
        list_1.add(9.4);
        list_1.add(12.3);
        list_1.add(35.5);
        list_1.add(41.4);
        list_1.add(0.9);
        list.add(list_0);
        list.add(list_1);
        try {
            pieExcel(request,response,type,list);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 饼状图圆环图导出
     * @param request
     * @param response
     * @param type
     * @throws Exception
     * @author: zhengxz
     * @time: 2019/11/11 11:34
     */
    public static void pieExcel(HttpServletRequest request, HttpServletResponse response,String type,List<List<Object>> list) throws Exception {

        //加载图表模版
        String filePath =null;
        if("1".equals(type)){
            filePath = "template/excel/pie.xlsx";
        }else if("2".equals(type)){
            filePath = "template/excel/donut.xlsx";
        }

        File file = new File(filePath);
        FileInputStream tps = new FileInputStream(file);
        /*创建excel*/
        XSSFWorkbook wb = new XSSFWorkbook(tps);
        XSSFSheet sheet = wb.getSheetAt(0);

        //设置全局  行宽
        sheet.setDefaultColumnWidth((short) (15));
        /*excel属性*/
        XSSFCellStyle cs = setStyle(wb);

        XSSFFont font = wb.createFont();
        //设置字体格式
        font.setFontName("宋体");
        /*字体大小*/
        font.setFontHeightInPoints((short) 11);
        cs.setFont(font);

        //遍历第一页元素找到图表
        XSSFChart chart;
        XSSFDrawing drawingPatriarch = sheet.getDrawingPatriarch();
        //拿到图形
        List<XSSFChart> charts = drawingPatriarch.getCharts();

        chart = charts.get(0);

        POIXMLDocumentPart xlsPart = chart.getRelations().get(0);

        CTChart ctChart = chart.getCTChart();
        CTPlotArea plotArea = ctChart.getPlotArea();
        // 获取图表的系列
        CTPieSer ser = null;
        //判断是什么图形
        if("1".equals(type)){
            //饼状图
            CTPieChart pieChartArray = plotArea.getPieChartArray(0);
            ser = pieChartArray.getSerArray(0);
            //圆环图
        }else if("2".equals(type)){
            CTDoughnutChart doughnutChartArray = plotArea.getDoughnutChartArray(0);
            ser = doughnutChartArray.getSerArray(0);
        }

        CTSerTx tx = ser.getTx();
        tx.getStrRef().getStrCache().getPtArray(0).setV("ddd");

        CTAxDataSource cat = ser.getCat();
        CTStrData strData = cat.getStrRef().getStrCache();

        //获取图表的值
        CTNumDataSource val = ser.getVal();
        CTNumData numData = val.getNumRef().getNumCache();

        strData.setPtArray(null);  // unset old axis text
        numData.setPtArray(null);  // unset old values
        // set model
        int idx = 0;
        int rownum = 0;
        XSSFRow row_0 = sheet.createRow(0);
        XSSFRow row_1 = sheet.createRow(1);
        for (int i = 0; i < list.get(0).size(); i++) {
            CTNumVal numVal = numData.addNewPt();
            numVal.setIdx(idx);
            numVal.setV(list.get(0).get(i).toString());

            CTStrVal sVal = strData.addNewPt();
            sVal.setIdx(idx);
            sVal.setV(list.get(1).get(i).toString());
            idx++;
            rownum++;
            row_0.createCell(i).setCellValue(list.get(0).get(i).toString());
            Object  o = list.get(1).get(i);
            //必须是数字类型
            if(o instanceof Double){
                row_1.createCell(i).setCellValue((Double) o);
            }else {
                row_1.createCell(i).setCellValue((String) o);
            }

        }
        numData.getPtCount().setVal(idx);
        strData.getPtCount().setVal(idx);

        String numDataRange = new CellRangeAddress(1, 1, 1
            , rownum-1).formatAsString(sheet.getSheetName(), true);
        val.getNumRef().setF(numDataRange);
        String axisDataRange = new CellRangeAddress(0, 0, 1
            , rownum-1).formatAsString(sheet.getSheetName(), true);
        cat.getStrRef().setF(axisDataRange);

        //更新嵌入的workbook
        OutputStream xlsOut = xlsPart.getPackagePart().getOutputStream();
        wb.write(xlsOut);
        xlsOut.close();
        /*导出excel数据处理*/

        String fileName = "";
        //初始统计图名称为:csvYYYYMMDD
        String nowDateStr = DateUtils.dateToString(new Date(), "yyyyMMdd");
        String excelName = "";
        excelName = fileName + nowDateStr;
        String headStr = "attachment; filename=" + excelName + ".xlsx";
        response.setHeader("Content-Disposition", headStr);
        ServletOutputStream out = response.getOutputStream();
        wb.write(out);
        out.close();
    }

    /**
     * 设置表格风格
     * @param wb
     * @return
     * @author: zhengxz
     * @time: 2019/11/8 9:01
     */
    public static XSSFCellStyle setStyle(XSSFWorkbook wb){

        XSSFCellStyle cs = wb.createCellStyle();
        cs.setAlignment(HorizontalAlignment.CENTER);
        cs.setVerticalAlignment(VerticalAlignment.CENTER);
        cs.setBorderBottom(BorderStyle.THIN);//下边框
        cs.setBorderLeft(BorderStyle.THIN);//左边框
        cs.setBorderRight(BorderStyle.THIN);//右边框
        cs.setBorderTop(BorderStyle.THIN);//上边框
        cs.setAlignment(HorizontalAlignment.CENTER_SELECTION);//左右居中
        cs.setVerticalAlignment(VerticalAlignment.CENTER);//上下居中
        cs.setWrapText(true);
        return cs;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值