POI条形图生成一系列有问题

2024-03-21

我使用 JDK8 和 POI-4.1.0 使用它们的示例herea link http://svn.apache.org/repos/asf/poi/trunk/src/examples/src/org/apache/poi/xwpf/usermodel/examples/ChartFromScratch.java

将图表导出到Word。当创建两个系列时就可以了两个系列的img https://i.stack.imgur.com/eyVMv.png, 但我只创建一个系列。系列的图表错误类别一个系列图片 https://i.stack.imgur.com/ylrlr.png

"lang1" "lang2" "lang3" is category name but they become series name. i have no ideal. I also find use line chart have the same problem my code
    public static void main(String[] args) throws Exception {

            List<String> listLanguages = new ArrayList<>(3);
            listLanguages.add("lang1");listLanguages.add("lang2");listLanguages.add("lang3");

            List<Double> listCountries = new ArrayList<>(3);            
            listCountries.add(10d);listCountries.add(20d);listCountries.add(30d);

            List<Double> listSpeakers = new ArrayList<>(3);
            listSpeakers.add(14d);listSpeakers.add(25d);listSpeakers.add(33d);

            String[] categories = listLanguages.toArray(new String[listLanguages.size()]);
            Double[] values1 = listCountries.toArray(new Double[listCountries.size()]);
            Double[] values2 = listSpeakers.toArray(new Double[listSpeakers.size()]);

            try (XWPFDocument doc = new XWPFDocument()) {
                XWPFChart chart = doc.createChart(5000000, 4000000);
                XDDFChartAxis bottomAxis = chart.createCategoryAxis(AxisPosition.BOTTOM);

                XDDFValueAxis leftAxis = chart.createValueAxis(AxisPosition.LEFT);

                leftAxis.setCrosses(AxisCrosses.AUTO_ZERO);
                leftAxis.setCrossBetween(AxisCrossBetween.BETWEEN);
                final int numOfPoints = categories.length;
                final String categoryDataRange = chart.formatRange(new CellRangeAddress(1, numOfPoints, 0, 0));
                final String valuesDataRange = chart.formatRange(new CellRangeAddress(1, numOfPoints, 1, 1));
                final String valuesDataRange2 = chart.formatRange(new CellRangeAddress(1, numOfPoints, 2, 2));
                final XDDFDataSource<?> categoriesData = XDDFDataSourcesFactory.fromArray(categories, categoryDataRange, 0);
                final XDDFNumericalDataSource<? extends Number> valuesData = XDDFDataSourcesFactory.fromArray(values1, valuesDataRange, 1);               
                final XDDFNumericalDataSource<? extends Number> valuesData2 = XDDFDataSourcesFactory.fromArray(values2, valuesDataRange2, 2);
                XDDFBarChartData bar = (XDDFBarChartData) chart.createData(ChartTypes.BAR, bottomAxis, leftAxis);
                XDDFBarChartData.Series series1 = (XDDFBarChartData.Series) bar.addSeries(categoriesData, valuesData);
                series1.setTitle("a",chart.setSheetTitle("a", 1));

                 //XDDFBarChartData.Series series2 = (XDDFBarChartData.Series) bar.addSeries(categoriesData, valuesData2);
                //series2.setTitle("b",chart.setSheetTitle("b", 2)); 

                bar.setVaryColors(true);
                bar.setBarDirection(BarDirection.COL);
                chart.plot(bar);

                XDDFChartLegend legend = chart.getOrAddLegend();
                legend.setPosition(LegendPosition.LEFT);
               // legend.setOverlay(false);
               try (OutputStream out = new FileOutputStream("C:/Users/lyf/Desktop/barExample.docx")) {
                    doc.write(out);
                }
            }
            catch(Exception e)
            {  
            }   
    }

主要问题是设置setVaryColors to true含义如下:

如果只有一个系列,则改变该系列中每个数据点的颜色。然后图例显示不同的数据点而不是系列。如果有多个系列,则为每个系列改变颜色。然后图例显示了不同的系列。

所以我们需要设置setVaryColors to false如果只有一个系列存在。

但我们还需要额外设置AxisCrossBetween,因此左轴与类别之间的类别轴交叉。否则,第一个和最后一个类别正好位于交叉点上,并且条形图只有一半可见。

最后,XDDF目前只准备了一半,还有很多错误。例如XDDFChart.setSheetTitle是越野车。它创建了一个表,但只完成了一半且不完整。创建不完整的表后,Excel 无法打开工作簿。所以在Word中更新图表数据是不可能的。

以下代码适用于我,可以创建仅包含一个系列以及两个系列的图表。另外,我尝试通过单个步骤使代码更加结构化。每个步骤都对其正在执行的操作进行了评论。

import java.io.*;

import org.apache.poi.xwpf.usermodel.*;

import org.apache.poi.ss.util.*;
import org.apache.poi.util.Units;

import org.apache.poi.xddf.usermodel.*;
import org.apache.poi.xddf.usermodel.chart.*;

import org.apache.poi.xssf.usermodel.*;

public class CreateWordXDDFChart {

 // Methode to set title in the data sheet without creating a Table but using the sheet data only.
 // Creating a Table is not really necessary.
 static CellReference setTitleInDataSheet(XWPFChart chart, String title, int column) throws Exception {
  XSSFWorkbook workbook = chart.getWorkbook();
  XSSFSheet sheet = workbook.getSheetAt(0);
  XSSFRow row = sheet.getRow(0); if (row == null) row = sheet.createRow(0);
  XSSFCell cell = row.getCell(column); if (cell == null) cell = row.createCell(column);
  cell.setCellValue(title);
  return new CellReference(sheet.getSheetName(), 0, column, true, true);
 }

 public static void main(String[] args) throws Exception {
  try (XWPFDocument document = new XWPFDocument()) {

   // create the data
   String[] categories = new String[]{"Lang 1", "Lang 2", "Lang 3"};
   Double[] valuesA = new Double[]{10d, 20d, 30d};
   Double[] valuesB = new Double[]{15d, 25d, 35d};

   // create the chart
   XWPFChart chart = document.createChart(15*Units.EMU_PER_CENTIMETER, 10*Units.EMU_PER_CENTIMETER);

   // create data sources
   int numOfPoints = categories.length;
   String categoryDataRange = chart.formatRange(new CellRangeAddress(1, numOfPoints, 0, 0));
   String valuesDataRangeA = chart.formatRange(new CellRangeAddress(1, numOfPoints, 1, 1));
   String valuesDataRangeB = chart.formatRange(new CellRangeAddress(1, numOfPoints, 2, 2));
   XDDFDataSource<String> categoriesData = XDDFDataSourcesFactory.fromArray(categories, categoryDataRange, 0);
   XDDFNumericalDataSource<Double> valuesDataA = XDDFDataSourcesFactory.fromArray(valuesA, valuesDataRangeA, 1);
   XDDFNumericalDataSource<Double> valuesDataB = XDDFDataSourcesFactory.fromArray(valuesB, valuesDataRangeB, 2);

   // create axis
   XDDFCategoryAxis bottomAxis = chart.createCategoryAxis(AxisPosition.BOTTOM);
   XDDFValueAxis leftAxis = chart.createValueAxis(AxisPosition.LEFT);
   leftAxis.setCrosses(AxisCrosses.AUTO_ZERO);
   // Set AxisCrossBetween, so the left axis crosses the category axis between the categories.
   // Else first and last category is exactly on cross points and the bars are only half visible.
   leftAxis.setCrossBetween(AxisCrossBetween.BETWEEN);

   // create chart data
   XDDFChartData data = chart.createData(ChartTypes.BAR, bottomAxis, leftAxis);
   ((XDDFBarChartData)data).setBarDirection(BarDirection.COL);

   // create series
   // if only one series do not vary colors for each bar
   ((XDDFBarChartData)data).setVaryColors(false);
   XDDFChartData.Series series = data.addSeries(categoriesData, valuesDataA);
   // XDDFChart.setSheetTitle is buggy. It creates a Table but only half way and incomplete. 
   // Excel cannot opening the workbook after creatingg that incomplete Table. 
   // So updating the chart data in Word is not possible.
   //series.setTitle("a", chart.setSheetTitle("a", 1));
   series.setTitle("a", setTitleInDataSheet(chart, "a", 1));

/*
   // if more than one series do vary colors of the series
   ((XDDFBarChartData)data).setVaryColors(true);
   series = data.addSeries(categoriesData, valuesDataB);
   //series.setTitle("b", chart.setSheetTitle("b", 2));
   series.setTitle("b", setTitleInDataSheet(chart, "b", 2));
*/

   // plot chart data
   chart.plot(data);

   // create legend
   XDDFChartLegend legend = chart.getOrAddLegend();
   legend.setPosition(LegendPosition.LEFT);
   legend.setOverlay(false);

   // Write the output to a file
   try (FileOutputStream fileOut = new FileOutputStream("CreateWordXDDFChart.docx")) {
    document.write(fileOut);
   }
  }
 }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

POI条形图生成一系列有问题 的相关文章

  • 在java中切换imageIcon?

    我有很多在窗口中移动的平面 线程 我想根据平面的方向切换 ImageIcon 例如 如果飞机向右飞行 则飞机的 imageIcon 是向右的 然后飞机向左飞行 则将 imageIcon 交换为飞机向左 我怎样才能在方法paintCompon
  • Cassandra Pojo Sink Flink 中的动态表名称

    我是 Apache Flink 的新手 我正在使用 Pojo Sink 将数据加载到 Cassandra 中 现在 我在以下命令的帮助下指定表和键空间名称 Table注解 现在 我想在运行时动态传递表名称和键空间名称 以便可以将数据加载到用
  • ProcessBuilder 未正确执行 Java 类文件

    在一个java文件中 我调用命令行语句来执行另一个java文件 这就是我正在做的 List
  • 为什么这不会绘制图像?

    我想做的是 当我运行应用程序时 它会启动线程并且图像显示 3 秒 3000 毫秒 然后线程停止运行 图片路径正确 图片文件存在 线程本身运行 但是 图像似乎没有显示 可能出什么问题了 这是我的代码 package org main impo
  • 使用 Java 的 OpenId 提供者/服务器

    我正在尝试使用 OpenId 服务增强现有的 Java Web 应用程序 以便登录用户可以使用我的 Web 应用程序作为 OpenId 提供程序登录另一个启用 OpenId 的应用程序 My first attempt was to use
  • “在 arraylist 构造函数中找不到 add(java.lang.String) 合适的方法”?

    import java util ArrayList import java util Random public class College instance variables replace the example below wit
  • 如何找出已使用的 JAR?

    在更大的项目中 我们可能会使用大量的 JAR 如何找出项目 而不是整个项目 中的某个模块 包正在使用哪些 JAR 有什么工具 技术等吗 较大的项目通常使用类似的构建工具maven http maven apache org or ant h
  • JUnit 测试方法无法返回值

    为什么 JUnit 测试方法无法返回值 文档 https junit org junit5 docs current user guide writing tests classes and methods说 强调我的 测试方法和生命周期方
  • 我如何通过代码在 Anylogic 中创建路径空间标记元素

    我在anyloigic方面完全是菜鸟 现在我正在尝试通过代码创建简单的网络 具有两个点节点的网络 以及链接这些节点的路径 遇到一些问题 当我运行模型时 控制台显示 使用初始化 方法 但我已经知道 初始化方法在较低版本中已被弃用 我使用的是8
  • Java SWT 用户输入验证

    在 SWT 中进行用户输入验证时 Java 约定是什么 我读到有 FieldEditors 它们是非常方便的字段 但遗憾的是仅适用于首选项和对话框 我还了解到有一个 IValidator 接口 但它经常与数据绑定一起使用 就我而言 我的大多
  • kafka消费端Offsets的一致性

    我有复制因子为 3 的卡夫卡主题min insync replicas 2 一个向该主题发送 X 条消息的生产者acks all 一段时间后 1 分钟内 在所有消息发送到主题后 将使用 java kafka 客户端为此主题创建新的消费者 使
  • 何时使用 clone() 以及 addAll() 和 add() 的实际工作原理

    我正在使用 Java 和 MySQL 我的项目中有大约 60 个交易屏幕 我曾经用过add and addAll 复制的功能ArrayList 例如 List
  • 如何在生产中安全地更改会话 cookie 域或名称?

    我们最近意识到我们的会话 cookie 正在被写入我们网站的完全限定域名 www myapp com 例如 MYAPPCOOKIE 79D5DB83 domain www myapp com 我们希望将其切换为可以跨子域共享的cookie
  • 如何在打开导航抽屉时使背景 Activity 变小?

    我想做我的背景Activity打开时稍微小一点Navigation Drawer 模拟存在的效果Airbnb应用 我想最好的解释是截图 但重点不是让 View 变小 而是让它成为与 Drawer 打开 关闭动画同步的动画 因此 如果您开始打
  • 重构 google 的 NetworkBoundResource 类以使用 RxJava 而不是 LiveData

    谷歌的android架构组件教程here https developer android com topic libraries architecture guide html有一部分解释了如何抽象通过网络获取数据的逻辑 在其中 他们使用
  • 如何将模型从 ML Pipeline 保存到 S3 或 HDFS?

    我正在尝试保存 ML Pipeline 生成的数千个模型 正如答案中所示here https stackoverflow com questions 32121046 run 3000 random forest models by gro
  • 注释处理工具<-检查有效注释

    I have ColumnMetadata index 1 ColumnMetadata index 2 ColumnMetadata index 3 我必须使用 APT 检查索引号是否唯一 我不知道该怎么做 我看不懂教程 一般我在网上找资
  • 使用基于Optional内容的流

    我从不受我控制的服务获取可能为空的地图 并且想要处理它 比方说 过滤 映射并减少到我需要的单个元素 问题 是否有从Optional到Stream的 链接 我尝试过 除其他外 return Optional ofNullable getMap
  • JAXB 枚举字段未序列化

    我有以下课程 package dictionary import java io Serializable import java util Objects import javax xml bind annotation XmlEleme
  • 如何在服务器上获取球衣日志?

    我正在使用球衣进行 REST WS 如何在服务器端启用球衣日志 很长的故事 我收到客户端异常 但我在 tomcat 日志中没有看到任何内容 它甚至没有到达我的方法 由于堆栈跟踪显示 toReturnValue 它确实从服务器获取了一些内容

随机推荐

  • Xcode - ld:找不到架构 arm64 的符号

    我正在尝试通过 Xcode 编译我的应用程序 一切都一直有效 但今天突然返回此错误 导致构建失败 我附上完整的错误日志 感谢您的帮助 Undefined symbols for architecture arm64 chkstk darwi
  • 如何使用函数动态分配 d3.forceRadial 的中心?

    我有一个包含父节点和子节点的数据集 父节点可以与其他父节点链接 子节点可以与其父节点链接 我想要做的是将子节点径向放置在父节点周围 节点看起来像这样 parent id 1 type parent x y vx vy id 2 x y vx
  • 如何将 Subversion 存储库(而不是我的工作副本)恢复为特定修订版?

    我对 Subversion 比较陌生 来自 Source Safe 这让我抓狂 使用 Tortoise 界面 Commit 不断向我显示 bin 目录中的 java 文件 它说这些文件 丢失 好吧 这是一个单独的问题 基本上 当我尝试了几种
  • 如何仅获取 yum 更新列表

    好吧 我一直有这个问题 我只想使用 yum 从 Linux 系统 RHEL 或 Fedora 通过 bash 脚本在文件中列出可用的更新 但我总是必须处理创建的标头信息 如下所示 Loaded plugins XXXX repo XXXX
  • .vimrc 导致错误(E10: \ 后面应该跟 /、? 或 &)

    我已经复制粘贴了这个 vimrc http amix dk vim vimrc html进入 Fedora 15 中的 etc vimrc 中 每次我使用 vim 执行任何操作时 我都会收到许多行号错误 这些错误似乎不是我的 vimrc 文
  • 如何在react-google-maps中调用函数getCenter()和其他函数

    I tried
  • 自定义 WordPress 主题:布局图像不显示

    我正在构建一个自定义 WordPress 主题 所以我的主题文件夹包含以下文件 文件夹 header php index php footer php style css images picture 1 jpg 我的问题是我无法使用正确显
  • 检查特定输入文件是否为空

    在我的表单中 我有 3 个用于文件上传的输入字段
  • iPhone iOS 如何在适当的位置翻转/反射任何 UIView?

    我知道如何通过在其边界内重新绘制 UIImage 来翻转 反射 旋转它 IBAction reflectImageView UIImageView imageView UIGraphicsBeginImageContextWithOptio
  • 配置的 iPhone 未显示在 Xcode Organizer(或 iTunes)中

    我最近设置了应用程序 ID 和配置文件 并且能够在设备上成功测试我的应用程序 然后 我下载了一些示例 iOS XCode 项目 在部署其中一个项目并从手机中删除示例应用程序后 我无法将手机与 iTunes 同步 也无法在 Xcode 管理器
  • iOS 自动续订在当前订阅期结束时过期

    我订购了自动续订产品 5分钟后 它就过期了 我认为在Sandbox中5分钟等于1个月 当前订阅期结束时 5分钟后 不应该自动续订吗 但它已经过期了 在沙盒环境中 自动续订订阅的时间比实际时间要短得多 从这个答案 https stackove
  • 在两个单独的脚本之间共享变量[重复]

    这个问题在这里已经有答案了 我正在尝试在两个单独的选项卡中运行的两个不同的 Tampermonkey 脚本之间共享变量 我尝试在一个脚本中使用 GM setValue 然后在另一个脚本中使用 GM getValue 检索它 但没有成功 所以
  • XML:跨越其他元素的里程碑或元素

    我正在与OSIS http bibletechnologies net 开放圣经信息标准 用于描述圣经和相关文本的 XML 模式 当我第一次查看 XML 示例时 我注意到一些以前在 XML 中从未见过的奇怪之处 主要是关闭的标签 然后是逻辑
  • ANDROID_HOME 和 ANDROID_SDK_ROOT 环境变量均未导出 - Windows 10

    我是一个初学者 正在学习appium工具 尝试启动 appium 会话并收到错误 An unknown server side error occurred while processing the command Original err
  • 如何使用 mysqli 插入 MySQL

    我刚刚学习数据库 我希望能够存储用户输入 关于如何使用 PHP 获取表单数据并将其保存到数据库的基本示例是什么 还确保表单安全SQL攻击 http en wikipedia org wiki SQL injection File 示例 ht
  • Scala脚本等待mongo完成任务

    我正在编写一个简单的基于 scala 的脚本 该脚本应该将一些数据插入 Mongo 集合中 问题是 该脚本在 mongo 完成其任务之前退出 考虑以下脚本 处理该问题的惯用 最佳方法是什么 usr bin env scalas scalaV
  • 如何检查可以找到多少列字符[重复]

    这个问题在这里已经有答案了 我有一个包含 4 列的数据集 其中包含名称 其中名称的数量和名称的顺序在列之间有所不同 某些列还可以包含相同的名称两次或更多次 看起来如下 df lt data frame x1 c Ben Alex Tim L
  • SQL Server 将字符串长度减少到 8000 个字符

    我正在尝试将数据插入列数据类型为的表中NTEXT 理想情况下 它应该存储超过 8000 个字符 但在我的情况下 它会将其减少到 8000 个字符 我正在程序中运行时进行插入查询 以下是该过程正在进行的示例查询 INSERT INTO TMP
  • Eclipse 中的 CPLEX 库路径错误

    我正在使用 eclipse 进行 java 编码 我完成了代码 它在 CPLEX 库 12 6 上运行良好 我在属性 gt 库 gt 添加外部 jar gt cplex jar 中添加了库 我想更改CPLEX 12 7的库 所以我删除了以前
  • POI条形图生成一系列有问题

    我使用 JDK8 和 POI 4 1 0 使用它们的示例herea link http svn apache org repos asf poi trunk src examples src org apache poi xwpf user