aspose-free-consulting / projects

The starting point for Aspose free consulting projects
5 stars 5 forks source link

请问折线图形状如何单独设置每个系列颜色?、如何在形状中插入数据表? #370

Closed BigdataSurvey closed 2 months ago

BigdataSurvey commented 4 months ago

环境:Aspose.Words For Java 23.7.jar、JAVA1.8 原型图如下: image 代码运行效果如下: image 目前问题1:我在代码中设置了循环设置每个系列的颜色,但是没有生效。 问题2:请问在形状中如何插入像原型中一样的数据表格。 目前我用的是23.7版本。 代码如下:

public class Demo9 {
    public static void main(String[] args) {
        try {
            // 创建一个空白文档
            Document doc = new Document("output/school_template.docx");
            DocumentBuilder builder = new DocumentBuilder(doc);
            builder.moveToDocumentEnd();
            List<GxyItemData> rowData = AttributeData.list17();

            setBarChart(builder, "第一个标题", new String[]{"2021-2022", "2022-2023", "2023-2024"}, rowData, 490, 640);
            // 保存文档
            String fileName = "output/AsposeWord1" + new SimpleDateFormat("MMddHHmmss").format(new Date()) + ".docx";
            doc.save(fileName);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void setBarChart(DocumentBuilder builder, String title, String[] categories, List<GxyItemData> entity, double width, double height) throws Exception {
        Shape shape = builder.insertChart(ChartType.LINE, 432, 252);
        shape.setWrapSide(WrapSide.BOTH);
        shape.setWrapType(WrapType.TOP_BOTTOM);
        shape.setVerticalAlignment(VerticalAlignment.CENTER);
        shape.setHorizontalAlignment(HorizontalAlignment.CENTER);
        shape.setAllowOverlap(false);
        shape.getStroke().setColor(new Color(221, 221, 221)); // 设置线条颜色
        shape.getFill().setColor(new Color(222, 235, 247)); // 设置填充颜色
        Chart chart = shape.getChart();
        chart.getTitle().setText(title);
        chart.getAxisX().getNumberFormat().setFormatCode("0.00%");
        chart.getAxisY().getNumberFormat().setFormatCode("0.00%");
        ChartSeriesCollection seriesColl = chart.getSeries();
        seriesColl.clear();
        entity.forEach(c -> { c.setValue4(c.getValue4() == null ? new double[0] : c.getValue4());});
        double maxY = entity.stream().mapToDouble(s -> { return Arrays.stream(s.getValue4()).max().getAsDouble();}).max().getAsDouble();
        //添加数据
        entity.forEach(c -> {seriesColl.add(c.getName2(), categories, c.getValue4());});
        Color[] Colors = new Color[]{new Color(249,106,103),new Color(86,126,217),new Color(254,143,48),new Color(255,201,8),new Color(128,203,75)};
        for (int i = 0; i < seriesColl.getCount(); i++) {
            System.out.println(seriesColl.get(i));
            //单独设置每个系列的颜色
            seriesColl.get(i).getFormat().getFill().setColor(Colors[i]);
            ChartSeries series = seriesColl.get(i);
            series.hasDataLabels(true);
            ChartDataLabelCollection dataLabelCollection = series.getDataLabels();
            dataLabelCollection.setShowValue(true);
            dataLabelCollection.getNumberFormat().setFormatCode("0.00%");
            dataLabelCollection.setSeparator("\r\n");
        }
        ChartAxis axisY = chart.getAxisY();
        if (maxY <= 0.5d){
            axisY.getScaling().setMaximum(new AxisBound(0.5));
            axisY.getScaling().setMinimum(new AxisBound(0));
        }else if(maxY <= 0.55d){
            axisY.getScaling().setMaximum(new AxisBound(0.55));
            axisY.getScaling().setMinimum(new AxisBound(0));
        }else if(maxY <= 0.6d){
            axisY.getScaling().setMaximum(new AxisBound(0.6));
            axisY.getScaling().setMinimum(new AxisBound(0));
        }else if(maxY <= 0.65d){
            axisY.getScaling().setMaximum(new AxisBound(0.65));
            axisY.getScaling().setMinimum(new AxisBound(0));
        }else if(maxY <= 0.7d){
            axisY.getScaling().setMaximum(new AxisBound(0.7));
            axisY.getScaling().setMinimum(new AxisBound(0.1));
        }else if(maxY <= 0.75d){
            axisY.getScaling().setMaximum(new AxisBound(0.75));
            axisY.getScaling().setMinimum(new AxisBound(0));
        }else if(maxY <= 0.8d){
            axisY.getScaling().setMaximum(new AxisBound(0.8));
            axisY.getScaling().setMinimum(new AxisBound(0.1));
        }else if(maxY <= 0.9d){
            axisY.getScaling().setMaximum(new AxisBound(0.9));
            axisY.getScaling().setMinimum(new AxisBound(0.1));
        }else if (maxY <= 1.0d){
            axisY.getScaling().setMaximum(new AxisBound(1.0));
            axisY.getScaling().setMinimum(new AxisBound(0));
        }
    }
}
AlexNosk commented 4 months ago

@BigdataSurvey

  1. 您可以使用Stroke.Color设置折线图中线条的颜色。 例如看下面的代码:
    
    Document doc = new Document();
    DocumentBuilder builder = new DocumentBuilder(doc);

// Add chart with default data. You can specify different chart types and sizes. Shape shape = builder.insertChart(ChartType.LINE, 432, 252);

// Chart property of Shape contains all chart related options. Chart chart = shape.getChart();

// Get chart series collection. ChartSeriesCollection seriesColl = chart.getSeries();

// Delete default generated series. seriesColl.clear();

// Create category names array, in this example we have two categories. String[] categories = new String[] { "AW Category 1", "AW Category 2" };

// Adding new series. Please note, data arrays must not be empty and arrays must be the same size. ChartSeries s1 = seriesColl.add("AW Series 1", categories, new double[] { 1, 2 }); ChartSeries s2 = seriesColl.add("AW Series 2", categories, new double[] { 3, 4 }); ChartSeries s3 = seriesColl.add("AW Series 3", categories, new double[] { 5, 6 }); ChartSeries s4 = seriesColl.add("AW Series 4", categories, new double[] { 7, 8 });

// Set color of the lines s1.getFormat().getStroke().setColor(Color.red); s2.getFormat().getStroke().setColor(Color.black); s3.getFormat().getStroke().setColor(Color.blue); s4.getFormat().getStroke().setColor(Color.yellow);

doc.save("C:\Temp\out.docx");



2. 恐怕目前还没有办法以编程方式显示图表数据表。 此功能请求记录为 **WORDSNET-15898**,我们将随时向您通报最新情况,并在此功能实施后通知您。

PS: 获得支持的主要场所是 Aspose.Words 支持论坛。 请在那里发布您的进一步问题。
<https://forum.aspose.com/c/words/8>
AlexNosk commented 2 months ago

The issues you have found earlier (filed as WORDSNET-15898) have been fixed in this Aspose.Words for Java 24.3 update.