Java: 如何在excel sheet中显示条码?
Java: How to display barcode in excel sheet?
我正在尝试使用 API 之类的 Apache POI 在 excel sheet 中显示 条形码,但没有找到任何解决方案.
我也尝试使用 JasperReports(因为我们可以在其中生成条形码),然后使用 JRXlsExporter
.
将编译后的报告转换为 excel
下面是我的 jrxml 用于 excel 导出
<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="customer_export" language="groovy" pageWidth="755" pageHeight="842" columnWidth="715" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
<parameter name="siteId" class="java.lang.String">
<defaultValueExpression><![CDATA[]]></defaultValueExpression>
</parameter>
<parameter name="companyId" class="java.lang.String">
<defaultValueExpression><![CDATA[]]></defaultValueExpression>
</parameter>
<queryString>
<![CDATA[SELECT c.NAME ,c.EXTERNAL_CODE ,a.ADDRESS,CASE WHEN c.LOCAL_MAIL IS NOT NULL THEN c.LOCAL_MAIL when C.MAIL IS NOT NULL then c.MAIL when c.MAIL IS Null then NULL when c.LOCAL_MAIL is NULL then NULL ELSE NULL END as MAIL, ru.BARCODE, c.PHONE FROM CUSTOMER c, SITE csite, RACK_USER ru, ADDRESS a WHERE c.COMPANY_SITE_ID = csite.ID_SITE AND c.RACK_USER_ID = ru.ID_RACK_USER AND ru.ID_RACK_USER = a.RACK_USER_ID AND csite.ID_SITE=$P{companyId} AND c.SITE_ID=$P{siteId} AND a.MAIN_FOR_COMPANY_SITE=1 AND a.COMPANY_SITE_ID =$P{companyId} ORDER BY c.NAME ASC]]>
</queryString>
<field name="NAME" class="java.lang.String"/>
<field name="EXTERNAL_CODE" class="java.lang.String"/>
<field name="ADDRESS" class="java.lang.String"/>
<field name="MAIL" class="java.lang.String"/>
<field name="BARCODE" class="java.lang.String"/>
<field name="PHONE" class="java.lang.String"/>
<title>
<band height="20">
<staticText>
<reportElement mode="Opaque" x="0" y="0" width="119" height="20" backcolor="#CCCCCC"/>
<textElement textAlignment="Center" verticalAlignment="Middle"/>
<text><![CDATA[Customer Name]]></text>
</staticText>
<staticText>
<reportElement mode="Opaque" x="119" y="0" width="112" height="20" backcolor="#CCCCCC"/>
<textElement textAlignment="Center" verticalAlignment="Middle"/>
<text><![CDATA[Customer Code]]></text>
</staticText>
<staticText>
<reportElement mode="Opaque" x="231" y="0" width="157" height="20" backcolor="#CCCCCC"/>
<textElement textAlignment="Center" verticalAlignment="Middle"/>
<text><![CDATA[Address]]></text>
</staticText>
<staticText>
<reportElement mode="Opaque" x="388" y="0" width="121" height="20" backcolor="#CCCCCC"/>
<textElement textAlignment="Center" verticalAlignment="Middle"/>
<text><![CDATA[Email]]></text>
</staticText>
<staticText>
<reportElement mode="Opaque" x="509" y="0" width="100" height="20" backcolor="#CCCCCC"/>
<textElement textAlignment="Center" verticalAlignment="Middle"/>
<text><![CDATA[Barcode]]></text>
</staticText>
<staticText>
<reportElement mode="Opaque" x="609" y="0" width="106" height="20" backcolor="#CCCCCC"/>
<textElement textAlignment="Center" verticalAlignment="Middle"/>
<text><![CDATA[Phone Number]]></text>
</staticText>
</band>
</title>
<detail>
<band height="24" splitType="Stretch">
<textField>
<reportElement positionType="Float" stretchType="RelativeToTallestObject" x="0" y="0" width="119" height="24"/>
<textElement textAlignment="Center" verticalAlignment="Middle"/>
<textFieldExpression><![CDATA[$F{NAME}]]></textFieldExpression>
</textField>
<textField>
<reportElement positionType="Float" stretchType="RelativeToTallestObject" x="119" y="0" width="112" height="24"/>
<textElement textAlignment="Center" verticalAlignment="Middle"/>
<textFieldExpression><![CDATA[$F{EXTERNAL_CODE}]]></textFieldExpression>
</textField>
<textField isStretchWithOverflow="true">
<reportElement positionType="Float" stretchType="RelativeToTallestObject" x="231" y="0" width="157" height="24"/>
<textElement textAlignment="Center" verticalAlignment="Middle"/>
<textFieldExpression><![CDATA[$F{ADDRESS}]]></textFieldExpression>
</textField>
<textField isStretchWithOverflow="true">
<reportElement positionType="Float" stretchType="RelativeToTallestObject" x="388" y="0" width="121" height="24"/>
<textElement textAlignment="Center" verticalAlignment="Middle"/>
<textFieldExpression><![CDATA[$F{MAIL}]]></textFieldExpression>
</textField>
<textField isBlankWhenNull="true">
<reportElement positionType="Float" stretchType="RelativeToTallestObject" x="609" y="0" width="106" height="24"/>
<textElement textAlignment="Center" verticalAlignment="Middle"/>
<textFieldExpression><![CDATA[$F{PHONE}]]></textFieldExpression>
</textField>
<componentElement>
<reportElement positionType="Float" stretchType="RelativeToTallestObject" x="509" y="0" width="100" height="24"/>
<jr:barbecue xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd" type="Code39" drawText="true" checksumRequired="false" evaluationTime="Report">
<jr:codeExpression><![CDATA["1234"]]></jr:codeExpression>
</jr:barbecue>
</componentElement>
</band>
</detail>
Java 导出代码 excel:
JRXlsExporter exporterXLS = new JRXlsExporter();
exporterXLS.setParameter(JRXlsExporterParameter.JASPER_PRINT, jprint);
exporterXLS.setParameter(JRXlsExporterParameter.OUTPUT_STREAM, reportos);
exporterXLS.setParameter(JRXlsExporterParameter.IS_DETECT_CELL_TYPE, Boolean.TRUE);
exporterXLS.setParameter(JRXlsExporterParameter.IGNORE_PAGE_MARGINS, Boolean.TRUE);
exporterXLS.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND, Boolean.FALSE);
exporterXLS.setParameter(JRXlsExporterParameter.IS_IGNORE_GRAPHICS, Boolean.TRUE);
exporterXLS.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_COLUMNS, Boolean.TRUE);
exporterXLS.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.TRUE);
exporterXLS.setParameter(JRXlsExporterParameter.MAXIMUM_ROWS_PER_SHEET, 50000);
exporterXLS.setParameter(JRXlsExporterParameter.OUTPUT_FILE, filename);
exporterXLS.exportReport();
但是在 条码列 中 空 当导出 excel 时。
我需要在 JasperReports 或 Java 或其他任何应用中应用任何属性吗?
或者还有其他 API 或者我们可以使用 Apache POI 显示条码吗?
使用 barcode4j or barbecue 您可以在 java 中将条形码生成为图像,然后将其传递给 jasper-reports
使用 barcode4j 的示例
Java代码
public class MyBarcodeGenerator {
public static Image getGS1_128(String code) {
if (code==null){
return null;
}
EAN128Bean c = new EAN128Bean();
c.setChecksumMode(ChecksumMode.CP_AUTO);
c.setOmitBrackets(false);
c.setCodeset(Code128Constants.CODESET_C);
c.setMsgPosition(HumanReadablePlacement.HRP_BOTTOM);
c.doQuietZone(true);
c.setQuietZone(5);
c.setFontSize(2d);
int dpi = 200;
boolean antiAlias = false;
int orientation = 0;
BitmapCanvasProvider canvas = new BitmapCanvasProvider(dpi, BufferedImage.TYPE_BYTE_BINARY, antiAlias, orientation);
c.generateBarcode(canvas, code);
return canvas.getBufferedImage();
}
}
jrxml,显示图片
<image scaleImage="Clip" hAlign="Center" vAlign="Middle" isUsingCache="false" onErrorType="Blank">
<reportElement positionType="Float" x="112" y="67" width="315" height="95" uuid="b90b1ec8-1483-4677-8db4-4556ecdad6b3">
<printWhenExpression><![CDATA[new Boolean($F{GS1_128}!=null)]]></printWhenExpression>
</reportElement>
<imageExpression><![CDATA[my.package.MyBarcodeGenerator.getGS1_128($F{GS1_128})]]></imageExpression>
</image>
For correct image size change the dpi settings or use the batik libraries to generate svg images, it's a bit more complex but with much better resolution see barcode4j svg dom
我正在尝试使用 API 之类的 Apache POI 在 excel sheet 中显示 条形码,但没有找到任何解决方案.
我也尝试使用 JasperReports(因为我们可以在其中生成条形码),然后使用 JRXlsExporter
.
下面是我的 jrxml 用于 excel 导出
<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="customer_export" language="groovy" pageWidth="755" pageHeight="842" columnWidth="715" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
<parameter name="siteId" class="java.lang.String">
<defaultValueExpression><![CDATA[]]></defaultValueExpression>
</parameter>
<parameter name="companyId" class="java.lang.String">
<defaultValueExpression><![CDATA[]]></defaultValueExpression>
</parameter>
<queryString>
<![CDATA[SELECT c.NAME ,c.EXTERNAL_CODE ,a.ADDRESS,CASE WHEN c.LOCAL_MAIL IS NOT NULL THEN c.LOCAL_MAIL when C.MAIL IS NOT NULL then c.MAIL when c.MAIL IS Null then NULL when c.LOCAL_MAIL is NULL then NULL ELSE NULL END as MAIL, ru.BARCODE, c.PHONE FROM CUSTOMER c, SITE csite, RACK_USER ru, ADDRESS a WHERE c.COMPANY_SITE_ID = csite.ID_SITE AND c.RACK_USER_ID = ru.ID_RACK_USER AND ru.ID_RACK_USER = a.RACK_USER_ID AND csite.ID_SITE=$P{companyId} AND c.SITE_ID=$P{siteId} AND a.MAIN_FOR_COMPANY_SITE=1 AND a.COMPANY_SITE_ID =$P{companyId} ORDER BY c.NAME ASC]]>
</queryString>
<field name="NAME" class="java.lang.String"/>
<field name="EXTERNAL_CODE" class="java.lang.String"/>
<field name="ADDRESS" class="java.lang.String"/>
<field name="MAIL" class="java.lang.String"/>
<field name="BARCODE" class="java.lang.String"/>
<field name="PHONE" class="java.lang.String"/>
<title>
<band height="20">
<staticText>
<reportElement mode="Opaque" x="0" y="0" width="119" height="20" backcolor="#CCCCCC"/>
<textElement textAlignment="Center" verticalAlignment="Middle"/>
<text><![CDATA[Customer Name]]></text>
</staticText>
<staticText>
<reportElement mode="Opaque" x="119" y="0" width="112" height="20" backcolor="#CCCCCC"/>
<textElement textAlignment="Center" verticalAlignment="Middle"/>
<text><![CDATA[Customer Code]]></text>
</staticText>
<staticText>
<reportElement mode="Opaque" x="231" y="0" width="157" height="20" backcolor="#CCCCCC"/>
<textElement textAlignment="Center" verticalAlignment="Middle"/>
<text><![CDATA[Address]]></text>
</staticText>
<staticText>
<reportElement mode="Opaque" x="388" y="0" width="121" height="20" backcolor="#CCCCCC"/>
<textElement textAlignment="Center" verticalAlignment="Middle"/>
<text><![CDATA[Email]]></text>
</staticText>
<staticText>
<reportElement mode="Opaque" x="509" y="0" width="100" height="20" backcolor="#CCCCCC"/>
<textElement textAlignment="Center" verticalAlignment="Middle"/>
<text><![CDATA[Barcode]]></text>
</staticText>
<staticText>
<reportElement mode="Opaque" x="609" y="0" width="106" height="20" backcolor="#CCCCCC"/>
<textElement textAlignment="Center" verticalAlignment="Middle"/>
<text><![CDATA[Phone Number]]></text>
</staticText>
</band>
</title>
<detail>
<band height="24" splitType="Stretch">
<textField>
<reportElement positionType="Float" stretchType="RelativeToTallestObject" x="0" y="0" width="119" height="24"/>
<textElement textAlignment="Center" verticalAlignment="Middle"/>
<textFieldExpression><![CDATA[$F{NAME}]]></textFieldExpression>
</textField>
<textField>
<reportElement positionType="Float" stretchType="RelativeToTallestObject" x="119" y="0" width="112" height="24"/>
<textElement textAlignment="Center" verticalAlignment="Middle"/>
<textFieldExpression><![CDATA[$F{EXTERNAL_CODE}]]></textFieldExpression>
</textField>
<textField isStretchWithOverflow="true">
<reportElement positionType="Float" stretchType="RelativeToTallestObject" x="231" y="0" width="157" height="24"/>
<textElement textAlignment="Center" verticalAlignment="Middle"/>
<textFieldExpression><![CDATA[$F{ADDRESS}]]></textFieldExpression>
</textField>
<textField isStretchWithOverflow="true">
<reportElement positionType="Float" stretchType="RelativeToTallestObject" x="388" y="0" width="121" height="24"/>
<textElement textAlignment="Center" verticalAlignment="Middle"/>
<textFieldExpression><![CDATA[$F{MAIL}]]></textFieldExpression>
</textField>
<textField isBlankWhenNull="true">
<reportElement positionType="Float" stretchType="RelativeToTallestObject" x="609" y="0" width="106" height="24"/>
<textElement textAlignment="Center" verticalAlignment="Middle"/>
<textFieldExpression><![CDATA[$F{PHONE}]]></textFieldExpression>
</textField>
<componentElement>
<reportElement positionType="Float" stretchType="RelativeToTallestObject" x="509" y="0" width="100" height="24"/>
<jr:barbecue xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd" type="Code39" drawText="true" checksumRequired="false" evaluationTime="Report">
<jr:codeExpression><![CDATA["1234"]]></jr:codeExpression>
</jr:barbecue>
</componentElement>
</band>
</detail>
Java 导出代码 excel:
JRXlsExporter exporterXLS = new JRXlsExporter();
exporterXLS.setParameter(JRXlsExporterParameter.JASPER_PRINT, jprint);
exporterXLS.setParameter(JRXlsExporterParameter.OUTPUT_STREAM, reportos);
exporterXLS.setParameter(JRXlsExporterParameter.IS_DETECT_CELL_TYPE, Boolean.TRUE);
exporterXLS.setParameter(JRXlsExporterParameter.IGNORE_PAGE_MARGINS, Boolean.TRUE);
exporterXLS.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND, Boolean.FALSE);
exporterXLS.setParameter(JRXlsExporterParameter.IS_IGNORE_GRAPHICS, Boolean.TRUE);
exporterXLS.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_COLUMNS, Boolean.TRUE);
exporterXLS.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.TRUE);
exporterXLS.setParameter(JRXlsExporterParameter.MAXIMUM_ROWS_PER_SHEET, 50000);
exporterXLS.setParameter(JRXlsExporterParameter.OUTPUT_FILE, filename);
exporterXLS.exportReport();
但是在 条码列 中 空 当导出 excel 时。
我需要在 JasperReports 或 Java 或其他任何应用中应用任何属性吗?
或者还有其他 API 或者我们可以使用 Apache POI 显示条码吗?
使用 barcode4j or barbecue 您可以在 java 中将条形码生成为图像,然后将其传递给 jasper-reports
使用 barcode4j 的示例
Java代码
public class MyBarcodeGenerator {
public static Image getGS1_128(String code) {
if (code==null){
return null;
}
EAN128Bean c = new EAN128Bean();
c.setChecksumMode(ChecksumMode.CP_AUTO);
c.setOmitBrackets(false);
c.setCodeset(Code128Constants.CODESET_C);
c.setMsgPosition(HumanReadablePlacement.HRP_BOTTOM);
c.doQuietZone(true);
c.setQuietZone(5);
c.setFontSize(2d);
int dpi = 200;
boolean antiAlias = false;
int orientation = 0;
BitmapCanvasProvider canvas = new BitmapCanvasProvider(dpi, BufferedImage.TYPE_BYTE_BINARY, antiAlias, orientation);
c.generateBarcode(canvas, code);
return canvas.getBufferedImage();
}
}
jrxml,显示图片
<image scaleImage="Clip" hAlign="Center" vAlign="Middle" isUsingCache="false" onErrorType="Blank">
<reportElement positionType="Float" x="112" y="67" width="315" height="95" uuid="b90b1ec8-1483-4677-8db4-4556ecdad6b3">
<printWhenExpression><![CDATA[new Boolean($F{GS1_128}!=null)]]></printWhenExpression>
</reportElement>
<imageExpression><![CDATA[my.package.MyBarcodeGenerator.getGS1_128($F{GS1_128})]]></imageExpression>
</image>
For correct image size change the dpi settings or use the batik libraries to generate svg images, it's a bit more complex but with much better resolution see barcode4j svg dom