在这里,我们将给大家分享关于读取XLSB文件ApachePOI的异常java.io.CharConversionException的知识,让您更了解poi读取xls和xlsx的本质,同时也会涉及到如何
在这里,我们将给大家分享关于读取XLSB文件Apache POI的异常java.io.CharConversionException的知识,让您更了解poi读取xls和xlsx的本质,同时也会涉及到如何更有效地ajax提交编码转换问题 java.io.charConVersionException:EOF、Apache POI解析word为html出现:......converter.core.XWPFConverterException: java.lang.NullPointerException、Exception from container-launch: org.apache.hadoop.util.Shell$ExitCodeException、fastdfs文件上传报错Save file error:java.io.IOException: java.io.IOException: java.io.IOException: recv package size -1 != 10的内容。
本文目录一览:- 读取XLSB文件Apache POI的异常java.io.CharConversionException(poi读取xls和xlsx)
- ajax提交编码转换问题 java.io.charConVersionException:EOF
- Apache POI解析word为html出现:......converter.core.XWPFConverterException: java.lang.NullPointerException
- Exception from container-launch: org.apache.hadoop.util.Shell$ExitCodeException
- fastdfs文件上传报错Save file error:java.io.IOException: java.io.IOException: java.io.IOException: recv package size -1 != 10
读取XLSB文件Apache POI的异常java.io.CharConversionException(poi读取xls和xlsx)
我正在开发一种使用Apache POI读取excel xlsb文件的Java应用程序,但是在读取时出现异常,我的代码如下:
import java.io.IOException;import java.io.InputStream;import org.apache.poi.xssf.eventusermodel.XSSFReader;import org.apache.poi.xssf.model.SharedStringsTable;import org.apache.poi.xssf.usermodel.XSSFRichTextString;import org.apache.poi.openxml4j.exceptions.InvalidFormatException;import org.apache.poi.openxml4j.exceptions.OpenXML4JException;import org.apache.poi.openxml4j.opc.Package;import org.xml.sax.Attributes;import org.xml.sax.ContentHandler;import org.xml.sax.InputSource;import org.xml.sax.SAXException;import org.xml.sax.XMLReader;import org.xml.sax.helpers.DefaultHandler;import org.xml.sax.helpers.XMLReaderFactory;import java.util.Iterator;public class Prueba { public static void main (String [] args){ String direccion = "C:/Documents and Settings/RSalasL/My Documents/New Folder/masstigeoct12.xlsb"; Package pkg; try { pkg = Package.open(direccion); XSSFReader r = new XSSFReader(pkg); SharedStringsTable sst = r.getSharedStringsTable(); XMLReader parser = fetchSheetParser(sst); Iterator<InputStream> sheets = r.getSheetsData(); while(sheets.hasNext()) { System.out.println("Processing new sheet:\n"); InputStream sheet = sheets.next(); InputSource sheetSource = new InputSource(sheet); parser.parse(sheetSource); sheet.close(); System.out.println(""); } } catch (InvalidFormatException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (OpenXML4JException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void processAllSheets(String filename) throws Exception { Package pkg = Package.open(filename); XSSFReader r = new XSSFReader( pkg ); SharedStringsTable sst = r.getSharedStringsTable(); XMLReader parser = fetchSheetParser(sst); Iterator<InputStream> sheets = r.getSheetsData(); while(sheets.hasNext()) { System.out.println("Processing new sheet:\n"); InputStream sheet = sheets.next(); InputSource sheetSource = new InputSource(sheet); parser.parse(sheetSource); sheet.close(); System.out.println(""); } } public static XMLReader fetchSheetParser(SharedStringsTable sst) throws SAXException { XMLReader parser = XMLReaderFactory.createXMLReader( "org.apache.xerces.parsers.SAXParser" ); ContentHandler handler = new SheetHandler(sst); parser.setContentHandler(handler); return parser; } private static class SheetHandler extends DefaultHandler { private SharedStringsTable sst; private String lastContents; private boolean nextIsString; private SheetHandler(SharedStringsTable sst) { this.sst = sst; } public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException { // c => cell if(name.equals("c")) { // Print the cell reference System.out.print(attributes.getValue("r") + " - "); // Figure out if the value is an index in the SST String cellType = attributes.getValue("t"); if(cellType != null && cellType.equals("s")) { nextIsString = true; } else { nextIsString = false; } } // Clear contents cache lastContents = ""; } public void endElement(String uri, String localName, String name) throws SAXException { // Process the last contents as required. // Do now, as characters() may be called more than once if(nextIsString) { int idx = Integer.parseInt(lastContents); lastContents = new XSSFRichTextString(sst.getEntryAt(idx)).toString(); nextIsString = false; } // v => contents of a cell // Output after we''ve seen the string contents if(name.equals("v")) { System.out.println(lastContents); } } public void characters(char[] ch, int start, int length) throws SAXException { lastContents += new String(ch, start, length); } }}
唯一的例外是:
java.io.CharConversionException: Characters larger than 4 bytes are not supported: byte 0x83 implies a length of more than 4 bytes at org.apache.xmlbeans.impl.piccolo.xml.UTF8XMLDecoder.decode(UTF8XMLDecoder.java:162) at org.apache.xmlbeans.impl.piccolo.xml.XMLStreamReader$FastStreamDecoder.read(XMLStreamReader.java:762) at org.apache.xmlbeans.impl.piccolo.xml.XMLStreamReader.read(XMLStreamReader.java:162) at org.apache.xmlbeans.impl.piccolo.xml.PiccoloLexer.yy_refill(PiccoloLexer.java:3474) at org.apache.xmlbeans.impl.piccolo.xml.PiccoloLexer.yylex(PiccoloLexer.java:3958) at org.apache.xmlbeans.impl.piccolo.xml.Piccolo.yylex(Piccolo.java:1290) at org.apache.xmlbeans.impl.piccolo.xml.Piccolo.yyparse(Piccolo.java:1400) at org.apache.xmlbeans.impl.piccolo.xml.Piccolo.parse(Piccolo.java:714) at org.apache.xmlbeans.impl.store.Locale$SaxLoader.load(Locale.java:3439) at org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:1270) at org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:1257) at org.apache.xmlbeans.impl.schema.SchemaTypeLoaderBase.parse(SchemaTypeLoaderBase.java:345) at org.openxmlformats.schemas.spreadsheetml.x2006.main.WorkbookDocument$Factory.parse(Unknown Source) at org.apache.poi.xssf.eventusermodel.XSSFReader$SheetIterator.<init>(XSSFReader.java:207) at org.apache.poi.xssf.eventusermodel.XSSFReader$SheetIterator.<init>(XSSFReader.java:166) at org.apache.poi.xssf.eventusermodel.XSSFReader.getSheetsData(XSSFReader.java:160) at EDManager.Prueba.main(Prueba.java:36)
该文件有2个工作表,一个有329行3列,另一个有566行3列,我只想读取文件以查找第二个表中是否有值。
答案1
小编典典除文本提取外,Apache POI不支持.xlsb文件格式。Apache
POI将很乐意提供对.xls文件(通过HSSF)和.xlsx文件(通过XSSF)或两者(通过公共SS UserModel接口)的完全读写支持。
但是,生成操作不支持.xlsb格式-这是两者之间非常奇怪的混合,并且涉及大量工作,这意味着没有人愿意自愿/赞助所需的工作。
从Apache POI 3.15 beta3 / 3.16开始,Apache
POI为.xlsb提供的功能是.xlsb文件的文本提取器-
XSSFBEventBasedExcelExtractor。您可以使用它来从文件中提取文本,或进行一些调整将其转换为CSV之类的内容
为了获得完整的读/写支持,您需要将文件转换为.xls(如果它没有太多的行/列)或.xlsx(如果有)。如果您确实真的很想提供帮助,可以查看XSSFBEventBasedExcelExtractor的源代码,然后尝试提供补丁以为其提供对POI的全面支持!
(此外,我认为例外情况是您的特定.xlsb文件已部分损坏,但是即使不是它,Apache POI也不支持除文本提取以外的任何功能,对不起)
ajax提交编码转换问题 java.io.charConVersionException:EOF
ajax提交编码转换问题 java.io.charConVersionException:EOF
Apache POI解析word为html出现:......converter.core.XWPFConverterException: java.lang.NullPointerException
使用Apache poi解析word文档为html文件时出现空指针异常:
报错一:
org.apache.poi.xwpf.converter.core.XWPFConverterException: java.lang.NullPointerException
at org.apache.poi.xwpf.converter.xhtml.XHTMLConverter.convert(XHTMLConverter.java:77)
at org.apache.poi.xwpf.converter.xhtml.XHTMLConverter.doConvert(XHTMLConverter.java:63)
at org.apache.poi.xwpf.converter.xhtml.XHTMLConverter.doConvert(XHTMLConverter.java:38)
at org.apache.poi.xwpf.converter.core.AbstractXWPFConverter.convert(AbstractXWPFConverter.java:61)
报错二:
Caused by: java.lang.NullPointerException: null
at org.apache.poi.xwpf.converter.core.XWPFDocumentVisitor.getXWPFNum(XWPFDocumentVisitor.java:473)
at org.apache.poi.xwpf.converter.core.XWPFDocumentVisitor.getNumPr(XWPFDocumentVisitor.java:340)
at org.apache.poi.xwpf.converter.core.XWPFDocumentVisitor.visitParagraph(XWPFDocumentVisitor.java:285)
at org.apache.poi.xwpf.converter.core.XWPFDocumentVisitor.visitBodyElements(XWPFDocumentVisitor.java:247)
at org.apache.poi.xwpf.converter.core.XWPFDocumentVisitor.visitTableCellBody(XWPFDocumentVisitor.java:1107)
at org.apache.poi.xwpf.converter.core.XWPFDocumentVisitor.visitCell(XWPFDocumentVisitor.java:1042)
at org.apache.poi.xwpf.converter.core.XWPFDocumentVisitor.visitTableRow(XWPFDocumentVisitor.java:946)
at org.apache.poi.xwpf.converter.core.XWPFDocumentVisitor.visitTableBody(XWPFDocumentVisitor.java:887)
at org.apache.poi.xwpf.converter.core.XWPFDocumentVisitor.visitTable(XWPFDocumentVisitor.java:869)
at org.apache.poi.xwpf.converter.core.XWPFDocumentVisitor.visitBodyElements(XWPFDocumentVisitor.java:251)
at org.apache.poi.xwpf.converter.core.XWPFDocumentVisitor.start(XWPFDocumentVisitor.java:199)
at org.apache.poi.xwpf.converter.xhtml.XHTMLConverter.convert(XHTMLConverter.java:73)
格式化显示为:
org.apache.poi.xwpf.converter.core.XWPFConverterException: java.lang.NullPointerException
at org.apache.poi.xwpf.converter.xhtml.XHTMLConverter.convert(XHTMLConverter.java:77)
at org.apache.poi.xwpf.converter.xhtml.XHTMLConverter.doConvert(XHTMLConverter.java:63)
at org.apache.poi.xwpf.converter.xhtml.XHTMLConverter.doConvert(XHTMLConverter.java:38)
at org.apache.poi.xwpf.converter.core.AbstractXWPFConverter.convert(AbstractXWPFConverter.java:61)
..................
Caused by: java.lang.NullPointerException: null
at org.apache.poi.xwpf.converter.core.XWPFDocumentVisitor.getXWPFNum(XWPFDocumentVisitor.java:473)
at org.apache.poi.xwpf.converter.core.XWPFDocumentVisitor.getNumPr(XWPFDocumentVisitor.java:340)
at org.apache.poi.xwpf.converter.core.XWPFDocumentVisitor.visitParagraph(XWPFDocumentVisitor.java:285)
at org.apache.poi.xwpf.converter.core.XWPFDocumentVisitor.visitBodyElements(XWPFDocumentVisitor.java:247)
at org.apache.poi.xwpf.converter.core.XWPFDocumentVisitor.visitTableCellBody(XWPFDocumentVisitor.java:1107)
at org.apache.poi.xwpf.converter.core.XWPFDocumentVisitor.visitCell(XWPFDocumentVisitor.java:1042)
at org.apache.poi.xwpf.converter.core.XWPFDocumentVisitor.visitTableRow(XWPFDocumentVisitor.java:946)
at org.apache.poi.xwpf.converter.core.XWPFDocumentVisitor.visitTableBody(XWPFDocumentVisitor.java:887)
at org.apache.poi.xwpf.converter.core.XWPFDocumentVisitor.visitTable(XWPFDocumentVisitor.java:869)
at org.apache.poi.xwpf.converter.core.XWPFDocumentVisitor.visitBodyElements(XWPFDocumentVisitor.java:251)
at org.apache.poi.xwpf.converter.core.XWPFDocumentVisitor.start(XWPFDocumentVisitor.java:199)
at org.apache.poi.xwpf.converter.xhtml.XHTMLConverter.convert(XHTMLConverter.java:73)
解决:看到空指针异常,很多人首先会认为是自己的代码写错了。事实上,这是Apache组件写的很粗糙造成的,该判空的地方没有判空。这里有两个地方出现了控制异常。出现问题的地方估计就是两个了。
第一个空指针出现在RunUnderlineValueProvider类(package org.apache.poi.xwpf.converter.core.styles.run;)。看到这个U,我猜想是解析下划线或者是表格出现了错误。
此处在进行rPr.getU().getVal()操作时没有进行判空操作,出现了空指针异常。
解决:在自己的工程下创建一个一模一样的包,然后创建一个一模一样的类,并更改为下面代码:
package org.apache.poi.xwpf.converter.core.styles.run;
import java.util.Objects;
import org.apache.poi.xwpf.converter.core.styles.XWPFStylesDocument;
import org.apache.poi.xwpf.usermodel.UnderlinePatterns;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTRPr;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTUnderline;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STUnderline.Enum;
public class RunUnderlineValueProvider extends AbstractRunValueProvider<UnderlinePatterns> {
/** INSTANCE */
public static final RunUnderlineValueProvider INSTANCE = new RunUnderlineValueProvider();
@Override
public UnderlinePatterns getValue(CTRPr rPr, XWPFStylesDocument stylesDocument) {
if (Objects.isNull(rPr)) {
return null;
}
if (rPr.isSetU()) {
CTUnderline ctu = rPr.getU();
if (Objects.nonNull(ctu)) {
Enum val = ctu.getVal();
if (Objects.nonNull(val)) {
return UnderlinePatterns.valueOf(val.intValue());
}
}
}
return null;
}
}
第二个空指针出现在XWPFDocumentVisitor类(package org.apache.poi.xwpf.converter.core;),下面的红框内即是出现空指针的地方。
解决:在自己的工程下创建一个一模一样的包,然后创建一个一模一样的类,并修改图示代码为:
protected XWPFNum getXWPFNum(CTNumPr numPr) {
CTDecimalNumber numID = numPr.getNumId();
if (Objects.isNull(numID)) {
return null;
}
XWPFNumbering numbering = document.getNumbering();
if (Objects.isNull(numbering)) {
return null;
}
XWPFNum num = numbering.getNum(numID.getVal());
return num;
}
两处包名为:
Exception from container-launch: org.apache.hadoop.util.Shell$ExitCodeException
运行mapreduce程序时出现错误Exception from container-launch: org.apache.hadoop.util.Shell$ExitCodeException,运行环境ubuntu12.04 64bit, hadoop2.2.0 64bit,eclipse luna 4.4.1, 具体错误如下图所示:
fastdfs文件上传报错Save file error:java.io.IOException: java.io.IOException: java.io.IOException: recv package size -1 != 10
这是什么原因?文件好像也能上传
今天的关于读取XLSB文件Apache POI的异常java.io.CharConversionException和poi读取xls和xlsx的分享已经结束,谢谢您的关注,如果想了解更多关于ajax提交编码转换问题 java.io.charConVersionException:EOF、Apache POI解析word为html出现:......converter.core.XWPFConverterException: java.lang.NullPointerException、Exception from container-launch: org.apache.hadoop.util.Shell$ExitCodeException、fastdfs文件上传报错Save file error:java.io.IOException: java.io.IOException: java.io.IOException: recv package size -1 != 10的相关知识,请在本站进行查询。
本文标签: