2010-07-28 254 views
16

我需要从我的Java代码创建Excel表格,其中包含使用Apache POI库的条形图,折线图等图表。 这可能吗? 我无法找到任何有用的代码示例。使用Apache POI创建Excel图表

除了Java的POI库之外,还有其他的选择吗?

+1

这里是一个教程,解释[如何使用POI/JFreeChart在Excel中创建图表](http://thinktibits.blogspot.com.au/2012/12/Java-POI-Excel-Create-Chart-Example- JFreeChart-Part-4.html)。 – user1933158 2012-12-27 21:35:57

回答

17

您只能使用Excel模板来保存包含POI的图表。 这意味着你创建一个带有图表的Excel模板文件,并将图表的数据源链接到一个definedName,然后你可以从POI加载模板文件并使用代码来更改definedName。 当前POI不支持从头创建图表。

+1

Hi Liya, 非常感谢您的回复。 我已经按照您的建议尝试过了。 模板excel文件(空白图表的源数据为动态数据源)需要动态命名范围(使用偏移功能)。 我已经使用了以下链接中的程序: 'http://www.youtube.com/watch?v=7le-m8YRP6M' – javdev 2010-07-30 03:49:11

+0

但我面临以下问题: 保存成功后,一个命名范围说'testrange ',每当我点击表格中的任何其他单元格,然后再次检查“测试范围”的公式时,它会变得无法理解。例如对于例如 如果我将它保存为“= OFFSET(A1 ,,, COUNTA(A:A),2)”,然后单击其他单元格。现在如果再次检查'testrange'的公式,它会显示如下所示: “= OFFSET(Sheet1!XFB11 ,,, COUNTA(Sheet1!XFB:XFB),2)”,每次检查时都会更改。 我在Excel 2003和2007中也面临这个问题。 请建议如果我在设置动态命名范围时做错了什么。 – javdev 2010-07-30 03:50:08

+0

你的公式使用相对地址,请尝试绝对地址 OFFSET($ A $ 1 ,,, Count($ A $ A),2) – liya 2010-07-30 10:07:19

1

从头开始这将会非常复杂,因为您必须弄清楚Excel文件中需要进行什么操作来创建图表。我会走一条不同的路线。

创建一个Excel文件,其中包含一个为某些数据(使用常规方式使用Excel)创建条形图等的宏。然后使用Apache POI创建一个包含所需数据的文件,并从Java启动Excel,然后执行创建图表的宏。

+0

嗨DJ, 感谢您的快速回复。 其实我和你的建议完全一样。 但是在这种情况下,如果数据量很大,宏执行的速度非常慢,这是我关心的问题。宏使用中也存在安全问题。 所以,我想创建使用POI库的图表。可能吗? 感谢和问候, Abhinav – javdev 2010-07-29 05:10:08

+0

我确定这是,但您可能需要找出包含图表的文件的确切内容。我仍然会用Excel创建一个例子,然后使用POI重现它。 xlsx文件的完整规范可用,但非常复杂。 – DJClayworth 2010-08-03 18:09:37

4

除了Java的POI库之外,还有其他的选择吗?

还有一些其他的图书馆,但我不确定是否可以写图表这样的东西。

如果可以使用较新的Office版本(使用基于格式文件的XML的那些),比你可以使用不同的方法:

  • 创建一个Excel与Office的新版本文件,包含您需要的图表和一些虚拟数据。
  • 解压该excel文件并从里面提取XML文件。最感兴趣的将是文件xl \ worksheets \ sheet1.xml xl \ worksheets \ sheet2.xml或xl \ worksheets \ sheet3.xml(取决于使用的是什么纸张)
  • 查看文件格式(更多比使用POI复杂),但不应该很难识别您之前输入的“虚拟”数据。
  • 使用Velocity或FreeMarker将该xml文件转换为模板(通过用变量和宏替换虚拟数据会产生相同的结果)
  • 编写一个小程序(只需几行),可以将真实数据,与模板合并,并将所有内容都打包回zip,但放入* .xlsx扩展名。

我知道上述步骤看起来有点复杂,但如果你没有太复杂的Excel文件,它应该比看起来更容易。

+0

嗨阿德里安, 非常感谢您的快速回复和有价值的信息。 这种方法看起来很合理,但很少有人担心: 1.我想支持Excel 2003和2007. 2.用于生成图表的xml很难理解。 这些问题是否有其他选择。 你也提到过“还有其他一些图书馆,但我不确定是否可以像图表一样写这样的东西。” - >你可以提出一些(这是免费的),可以提供这种功能。 再次感谢, Abhinav – javdev 2010-07-29 05:23:21

+2

其他一些优秀的库:http://jexcelapi.sourceforge.net/,http://sourceforge.net/projects/openxls/,https://xlsql.dev.java.net/ ,而不是有许多Java到COM的桥梁允许直接从Java使用Excel安装,例如http://danadler.com/jacob/(但也有很多其他的)。 另一个选择是使用OpenOffice(因为它很容易从Java编码到API),并让OpenOffice将结果导出为相应的Excel格式。 – 2010-07-29 12:44:44

2

线程看起来很老,我不知道你是否已经想出了一种方法或仍在寻找一种方法。

但这是我会做的。有一个名为JFreeChart的免费图书馆。您可以使用它来生成JPG或PNG文件,然后在使用Apache POI创建时可以将其插入到Excel文件中。

但是,这种方法的缺点是,如Excel中那样更改电子表格中的数据时,图形中的数据不会动态变化。现在,这是我无法忍受的事情。

所以我现在要做一些研究。我非常肯定,既然问题已经被问到,那么必须在Apache POI中增加一项功能,或者另一种优雅的处理方式。如果我发现任何情况,我一定会在此发布我的发现。

---- ---- UPDATE

在我的研究持续了大约一个小时,我只能找到一个合适的库调用SmartXLS(请谷歌,我不能张贴链接,因为我”新手和垃圾邮件防范机制踢了)这是远远接近我会使用。您可以通过程序生成Excel和图表。该网站非常简单,我找不到任何许可信息,所以我假设它是免费的个人和商业用途。我能够毫无问题地下载该库。我还没有用过它。给它一个镜头,让我们知道它是如何工作的。

+0

嗨Karthik,谢谢你的回复。您发现POI具有局限性。而且我也不能选择SmartXLS,因为它不是免费的。 JFreeChart是非常好的API,但我想要动态的Excel图表。所以,我使用了liya和dj在下面讨论的方法。 – javdev 2010-10-08 05:51:17

+0

基本上我使用poi将数据转储到excel文件中,并在Excel第一次打开时使用Excel宏创建来自该数据的图表。 – javdev 2010-10-08 05:52:31

+0

您是否可以发布您在Excel中使用的宏的片段来创建图表?我很确定我可以谷歌它。看到你有一个可行的解决方案,我宁愿问你并且节省一些时间,而不是重新发明那个轮子。感谢回复。 – 2010-10-08 20:37:26

6

在poi-3.8对图表的支持似乎即将到来。

请参阅this discussion

而且尤其是the example

+4

(这个问题似乎有点被看待,所以我认为在3年前的答案中添加评论是不会伤害的)。不幸的是,到目前为止,他们没有添加任何东西,只有散点图和折线图。幸运的是,创建新的图表类型似乎并不那么困难,建立在ooxml-schemas上(检查apache poi中的ScatterChart的源代码以了解如何),可以尝试添加新的图表类型。感谢@prule的链接,帮助我找到了这种可能! – 2015-04-08 14:30:46

1

这里是the working example

  • 我有数据在JSON和.xlsm模板文件与宏。 - excel中不需要图表,数据或范围名称

  • 每次需要使用图表创建工作表时,将模板表克隆,在z1处放置所需的图表类型并更改插入到适当图表类型的默认折线图。从z1中删除图表类型以避免多次执行。

希望它有帮助。