GVKun编程网logo

读取XLSB文件Apache POI的异常java.io.CharConversionException(poi读取xls和xlsx)

7

在这里,我们将给大家分享关于读取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)

读取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

ajax提交编码转换问题 java.io.charConVersionException:EOF

Apache POI解析word为html出现:......converter.core.XWPFConverterException: java.lang.NullPointerException

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

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

fastdfs文件上传报错Save file error:java.io.IOException: java.io.IOException: java.io.IOException: recv package size -1 != 10

这是什么原因?文件好像也能上传

今天的关于读取XLSB文件Apache POI的异常java.io.CharConversionExceptionpoi读取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的相关知识,请在本站进行查询。

本文标签: