【问题标题】:How to show dropdown in excel using jrxml (jasper api)?如何使用 jrxml(jasper api)在 excel 中显示下拉列表?
【发布时间】:2016-02-05 23:01:02
【问题描述】:

我是 jasper 的新手。我的项目使用 jasper 创建了一个只有列名(例如:名称、年龄、部门、位置)的 excel 模板,该模板使用 jrxml 进行字体和对齐。 [基本上我们使用 来显示列名]

用户可以下载模板并输入他们想要的值。

现在为了避免用户通过输入值手动输入详细信息,我想在模板中提供带有一些硬编码值的下拉列表。

例如对于字段 'Location' ,我可以设置 'Texas' 、 'California' 、 'FortWorth' 等值。我不是从 DB 中查询这些值,我只是想在 .jrxml 中对它们进行硬编码。我必须再创建一行,其中 Location 列应该有下拉值,用户可以从中选择一个并上传到我的应用程序

在下载的 excel 中,我想要一个包含上述值的下拉列表,以便用户可以选择而不是自己输入。

有没有办法把它放在 .jrxml 中。如果这是不可能的,那么在 excel 的下拉列表中给出可以呈现这些的代码。

我的一个字段的示例 .jrxml 是

<staticText>
    <reportElement mode="Opaque" x="684" y="0" width="114" height="20" backcolor="#808080">
    </reportElement>
    <box leftPadding="10">
        <pen lineColor="#000000" />
        <topPen lineWidth="0.5" />
        <leftPen lineWidth="0.5" />
        <bottomPen lineWidth="0.5" />
        <rightPen lineWidth="0.5" />
    </box>
    <textElement>
        <font size="10" isBold="true" />
    </textElement>
    <text><![CDATA[Location]]></text>
</staticText>

如果需要更多详细信息,请告诉我

【问题讨论】:

  • 嗨罗伯特,我读了那篇文章,但我没有在我的应用程序中使用 jasper 或 iReports。我的应用程序中有 jasperreport.jar 和 jrxml。所以我无法在 jrxml 中获得将在 excel 中显示组合框的等效代码
  • Petter Friberg 如果您可以分享模板示例,我可以将组合框的值硬编码在模板本身中,这将是非常棒的。我急切地等待模板

标签: jasper-reports apache-poi export-to-excel dropdown


【解决方案1】:

我不认为使用当前的 jasper api 6.0 这是可能的,但是使用 POI(已经在您的类路径中)在导出后添加它非常容易。

首先我们导出或JasperPrintprint,到excel(包括代码,因为它最好删除空行,我们稍后会用poi处理,Exception处理超出了这个例子)

JRXlsExporter exporter = new JRXlsExporter();
File outputFile = new File("excelTest.xls");
exporter.setExporterInput(new SimpleExporterInput(print));
exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(outputFile));
SimpleXlsReportConfiguration configuration = new SimpleXlsReportConfiguration();
configuration.setOnePagePerSheet(false);
configuration.setDetectCellType(true);
configuration.setCollapseRowSpan(false);
configuration.setWhitePageBackground(false);
configuration.setRemoveEmptySpaceBetweenColumns(true);
configuration.setRemoveEmptySpaceBetweenRows(true);
exporter.setConfiguration(configuration);
exporter.exportReport();

现在报告已导出到 excel,我们用 POI 重新打开它并添加我们的数据验证

int rowCount = 50; //This will be discussed at end.
int cellWithDV = 1;

HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(outputFile));
HSSFSheet sheet = workbook.getSheetAt(0);
CellRangeAddressList addressList = new CellRangeAddressList(1,rowCount, cellWithDV, cellWithDV);
DVConstraint dvConstraint = DVConstraint.createExplicitListConstraint(
                    new String[]{ "Texas" , "California", "FortWorth"});
DataValidation dataValidation = new HSSFDataValidation(addressList, dvConstraint);
dataValidation.setSuppressDropDownArrow(false);
sheet.addValidationData(dataValidation);
workbook.write(new FileOutputStream(outputFile));
workbook.close();

rowCount 可以通过以下方式获得:

  1. 再次查询数据库
  2. 使用在DetailEval() 被调用之前计算多少次的scriptlet
  3. 使用 POI 查找最后一行。
  4. 在 excel (2003) 中使用最大值为 65536

希望对你有帮助

【讨论】:

  • 它回答了我的问题。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-10
  • 1970-01-01
  • 2012-10-26
  • 2013-01-16
  • 2016-01-29
  • 2019-05-05
  • 1970-01-01
相关资源
最近更新 更多