java.io.UTFDataFormatException : Invalid byte 1 of 1-byte UTF-8 sequence while exporting to excel

标签 java jasper-reports

我正在使用JasperReports APIExcel格式导出报告。

我的Java代码是:

Connection connection;
FacesContext facesContext = FacesContext.getCurrentInstance();
HttpServletResponse response = (HttpServletResponse)facesContext.getExternalContext().getResponse();
InputStream reportStream = facesContext.getExternalContext().getResourceAsStream("C:/summaryOfEmployees.jasper");
ServletOutputStream servletOutputStream = response.getOutputStream();
Class.forName("oracle.jdbc.driver.OracleDriver");
Session hibernateSession = null;
hibernateSession = HibernateUtils.currentSession();
connection = hibernateSession.connection();
facesContext.responseComplete();

HashMap parameterMap = new HashMap();

JExcelApiExporter exporterXLS = new JExcelApiExporter();

JasperReport jasperReport = JasperCompileManager.compileReport("C:/summaryOfEmployees.jasper");

JasperPrint jasperPrint = JasperFillManager.fillReport("C:/summaryOfEmployees.jasper", parameterMap, connection);

exporterXLS.setParameter(JRXlsExporterParameter.JASPER_PRINT,jasperPrint);
exporterXLS.setParameter(JRXlsExporterParameter.IS_DETECT_CELL_TYPE,Boolean.TRUE);
exporterXLS.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND,Boolean.FALSE);
exporterXLS.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS,Boolean.TRUE);
exporterXLS.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_COLUMNS,Boolean.TRUE);
exporterXLS.setParameter(JRXlsExporterParameter.OUTPUT_STREAM,servletOutputStream);
exporterXLS.exportReport();

connection.close();
servletOutputStream.flush();
servletOutputStream.close();

我在控制台上遇到以下异常,并且 Excel 文件显示为空

    net.sf.jasperreports.engine.JRException: java.io.UTFDataFormatException: Invalid  byte 1 of 1-byte UTF-8 sequence....
.................................
Caused by: java.io.UTFDataFormatException: Invalid byte 1 of 1-byte UTF-8 sequence.
at org.apache.xerces.impl.io.UTF8Reader.invalidByte(Unknown Source)
at org.apache.xerces.impl.io.UTF8Reader.read(Unknown Source)
at org.apache.xerces.impl.XMLEntityScanner.load(Unknown Source)
at org.apache.xerces.impl.XMLEntityScanner.skipString(Unknown Source)
at org.apache.xerces.impl.XMLVersionDetector.determineDocVersion(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
at org.apache.commons.digester.Digester.parse(Digester.java:1745)
at net.sf.jasperreports.engine.xml.JRXmlLoader.loadXML(JRXmlLoader.java:243)
... 44 more

iReport 中显示的 xml 文件的第一行表示 UTF-8 不是问题,如下所示:

   <?xml version="1.0" encoding="UTF-8"?>    

为什么我会收到此错误?

我非常渴望得到帮助。

最佳答案

根据您的说法,问题似乎出在您的 XML 文件中:它声明其编码为 UTF-8,但是当 Xerces 尝试以 UTF-8 形式读取您的文件时,它会读取无效序列。

从错误消息来看,它表明 1 字节序列中有一个无效字节。

UTF-8 识别 4 个(理论上 6 个)字节序列:(表示为位字段)

  • 0xxxxxxx
  • 110xxxxx 10xxxxxx
  • 1110xxxx 10xxxxxx 10xxxxxx
  • 111110xx 10xxxxxx 10xxxxxx 10xxxxxx

因此,唯一可能产生此错误的情况是它在 0xxxxxxx 字符后面找到 10xxxxxx 字符。

以下两种情况之一:

  • 您的文件应该是 UTF-8 但它已损坏(因为您使用记事本或其他方式对其进行了编辑)
  • 您的文件是“iso-8859-1”(使用全部 256 个 1 字节字符),并且应在 XML header 中如此声明。

关于java.io.UTFDataFormatException : Invalid byte 1 of 1-byte UTF-8 sequence while exporting to excel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16689950/

相关文章:

java - 在 Java 中创建泛型数组

java - 另一种打印我的方法的方法?

java - 获取 IntelliJ Kotlin 插件和 gradle 进行匹配

java - JasperReports 与 Java Bean : Failed to render image (the field of InputStream type)

jasper-reports - 如何在控制台上打印 jasper 报告

java - jasper 报告中同一页两侧的拆分表

java - 观察者设计模式的主题是接口(interface)还是父类(super class)?

java - 我是否需要其他方法来使用 ColorFactory 类?

java - 碧 Jade 报告 : How to pass multiple SQL queries from a Java Program

deployment - 在 iReport 中链接子报表,以便它们也可以在 Jasper 服务器中使用