有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在Excel文件中创建Excel图表

我正在从系统中导出一些数据。我想在excel图表中可视化这些数据集。我找到了一个又老又封闭的问题,在哪里找不到解决方案。当我更改数据字段时,图表应该重新绘制,我想这是excel标准

我认为可能是这样的:

  • 导出数据
  • 使用MS Excel手动创建图表
  • 在以后的所有其他导出中保存并加载此模板

您知道如何使用Java实现POI吗?特别是作为模板导入图表


共 (2) 个答案

  1. # 1 楼答案

    POI并没有提供这种功能,但您可以使用jXL或Aspose单元格转换或复制图表(图形)(Aspose不是免费的)

    这是将excel图表提取到图像的代码段

    public class ExportChartToImage
    {
        public static void main(String[] args) throws Exception
        {
            //Start Excel
            Application excelApp = new Application();
            excelApp.setVisible(true);
    
            //Create test workbook
            Workbook workbook = excelApp.createWorkbook("/home/tejus/Desktop/Chart Test");
    
            //Get the first (and the only) worksheet
            final Worksheet worksheet1 = workbook.getWorksheet(1);
    
            //Fill-in the first worksheet with sample data
            worksheet1.getCell("A1").setValue("Date");
            worksheet1.getCell("A2").setValue("March 1");
            worksheet1.getCell("A3").setValue("March 8");
            worksheet1.getCell("A4").setValue("March 15");
    
            worksheet1.getCell("B1").setValue("Customer");
            worksheet1.getCell("B2").setValue("Smith");
            worksheet1.getCell("B3").setValue("Jones");
            worksheet1.getCell("B4").setValue("James");
    
            worksheet1.getCell("C1").setValue("Sales");
            worksheet1.getCell("C2").setValue("23");
            worksheet1.getCell("C3").setValue("17");
            worksheet1.getCell("C4").setValue("39");
    
            excelApp.getOleMessageLoop().doInvokeAndWait(new Runnable()
            {
                public void run()
                {
                    final Variant unspecified = Variant.createUnspecifiedParameter();
                    final Int32 localeID = new Int32(LocaleID.LOCALE_SYSTEM_DEFAULT);
    
                    Range sourceDataNativePeer = worksheet1.getRange("A1:C4").getPeer();
                    _Worksheet worksheetNativePeer = worksheet1.getPeer();
    
                    IDispatch chartObjectDispatch = worksheetNativePeer.chartObjects(unspecified, localeID);
    
                    ChartObjectsImpl chartObjects = new ChartObjectsImpl(chartObjectDispatch);
                    ChartObject chartObject = chartObjects.add(new DoubleFloat(100), new DoubleFloat(150), new DoubleFloat(300), new DoubleFloat(225));
    
                    _Chart chart = chartObject.getChart();
                    chart.setSourceData(sourceDataNativePeer, new Variant(XlRowCol.xlRows));
    
                    BStr fileName = new BStr("/home/tejus/Desktop/chart.gif");
                    Variant filterName = new Variant("gif");
                    Variant interactive = new Variant(false);
    
                    chart.export(fileName, filterName, interactive);
    
                    chart.setAutoDelete(false);
                    chart.release();
    
                    chartObject.setAutoDelete(false);
                    chartObject.release();
    
                    chartObjects.setAutoDelete(false);
                    chartObjects.release();
    
                    chartObjectDispatch.setAutoDelete(false);
                    chartObjectDispatch.release();
                }
            });
    
            System.out.println("Press 'Enter' to terminate the application");
            System.in.read();
    
            //Close the MS Excel application.
            boolean saveChanges = false;
            workbook.close(saveChanges);
            boolean forceQuit = true;
            excelApp.close(forceQuit);
        }
    
    }
    

    我用的是J excel

  2. # 2 楼答案

    到目前为止,{a1}说的是“您当前无法创建图表。但是,您可以在Excel中创建图表,使用HSSF修改图表数据值并写出新的电子表格。这是可能的,因为POI试图尽可能保持现有记录的完整性”

    然而,在我的例子中,我已经使用命名范围在excel工作表上手动创建了一个图表,并且使用java,我正在根据我的要求更新命名范围。由于图表基于命名范围,因此它也会得到更新

    有关更新,请检查here