我正在使用 JasperReports API 以 Excel 格式导出报告。
我的 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"?>
为什么我会收到此错误?
我非常渴望得到帮助。
答案 0 :(得分:1)
根据你的说法,问题似乎出现在你的XML文件中:它将其编码声明为UTF-8,但是当Xerces尝试将你的文件读取为UTF-8时,它会读取无效的序列。
根据错误消息判断,它表示在1字节序列中有一个无效字节。
UTF-8识别4个(理论上为6个)字节序列:(表示为位字段)
因此,唯一可以产生此错误的情况是它在0xxxxxxx字符后面找到一个10xxxxxx字符。
所以有两种情况之一:
答案 1 :(得分:1)
如果在处理html文件时遇到类似的异常,可以在html头中添加以下行:
<meta http-equiv="Content-Type" content="text/html; charset=utl-8;" pageEncoding="utf-8" />
这将解决问题。