Excel通过poi设置折线图样式

本文介绍了如何使用Java的poi库来创建并详细设置Excel折线图的样式,包括图例、标题、坐标轴的样式,如颜色、字体、线条粗细和虚实效果。
摘要由CSDN通过智能技术生成

  最近通过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
您可以使用POI库来导出Excel折线图,并且可以设置线条为虚线。下面是一个示例代码,展示了如何使用POI来实现这个功能: ```java import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.*; import java.io.FileOutputStream; import java.io.IOException; public class ExcelChartExample { public static void main(String[] args) { // 创建一个新的Excel工作簿 Workbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet("折线图示例"); // 创建一个数据源 Row row1 = sheet.createRow(0); row1.createCell(0).setCellValue(1); row1.createCell(1).setCellValue(2); row1.createCell(2).setCellValue(3); row1.createCell(3).setCellValue(4); Row row2 = sheet.createRow(1); row2.createCell(0).setCellValue(5); row2.createCell(1).setCellValue(6); row2.createCell(2).setCellValue(7); row2.createCell(3).setCellValue(8); // 创建一个折线图 Drawing drawing = sheet.createDrawingPatriarch(); ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 4, 0, 10, 20); Chart chart = drawing.createChart(anchor); ChartLegend legend = chart.getOrCreateLegend(); legend.setPosition(LegendPosition.BOTTOM); LineChartData data = chart.getChartDataFactory().createLineChartData(); // 创建折线 ChartAxis bottomAxis = chart.getChartAxisFactory().createCategoryAxis(AxisPosition.BOTTOM); ValueAxis leftAxis = chart.getChartAxisFactory().createValueAxis(AxisPosition.LEFT); leftAxis.setCrosses(AxisCrosses.AUTO_ZERO); ChartDataSource<Number> xs = DataSources.fromNumericCellRange(sheet, new CellRangeAddress(0, 0, 0, 3)); ChartDataSource<Number> ys1 = DataSources.fromNumericCellRange(sheet, new CellRangeAddress(1, 1, 0, 3)); ChartDataSource<Number> ys2 = DataSources.fromNumericCellRange(sheet, new CellRangeAddress(2, 2, 0, 3)); LineChartSeries series1 = data.addSeries(xs, ys1); series1.setTitle(sheet.getRow(1).getCell(0).getStringCellValue()); LineChartSeries series2 = data.addSeries(xs, ys2); series2.setTitle(sheet.getRow(2).getCell(0).getStringCellValue()); // 设置线条样式为虚线 CTChartLines lines1 = series1.getCTLineSer().addNewSpPr().addNewLn().addNewPr(); lines1.addNewDash().setVal(new byte[]{4, 4}); CTChartLines lines2 = series2.getCTLineSer().addNewSpPr().addNewLn().addNewPr(); lines2.addNewDash().setVal(new byte[]{4, 4}); // 将图表添加到工作表 chart.plot(data, bottomAxis, leftAxis); // 保存Excel文件 try { FileOutputStream fileOut = new FileOutputStream("折线图示例.xlsx"); workbook.write(fileOut); fileOut.close(); workbook.close(); System.out.println("Excel文件导出成功!"); } catch (IOException e) { e.printStackTrace(); } } } ``` 这个示例代码会创建一个包含折线图Excel文件,并且将线条样式设置为虚线。您可以根据需要修改数据源和线条样式设置。请确保将POI库添加到项目的依赖中。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灵异生物

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值