2

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

我认为它可能会这样工作:

  • 导出数据
  • 使用 MS-Excel 手动创建图表
  • 将其保存并加载为所有其他未来导出的模板

你知道如何使用 Java 处理 POI 吗?特别是图表作为模板的导入?

4

2 回答 2

2

POI 不提供该功能,但您可以使用 J XL 或 Aspose Cells 转换或复制图表(图形)(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

于 2014-03-20T13:55:47.107 回答
1

到目前为止,由于apache POI 限制“您当前无法创建图表。但是,您可以在 Excel 中创建图表,使用 HSSF 修改图表数据值并写出新的电子表格。这是可能的,因为 POI 试图保留现有记录尽可能完好无损”。

但是在我的情况下,我使用命名范围在 Excel 表上手动创建了一个图表,并使用 java,我正在根据我的要求更新命名范围。由于图表基于命名范围,因此它也会得到更新。

如需更新,请查看此处

于 2013-07-31T13:32:10.970 回答