Java POI读取Excel文件,正文为字符串

Java POI读取Excel文件,正文为字符串,java,apache-camel,apache-poi,Java,Apache Camel,Apache Poi,目前,我正在尝试读取通过ApacheCamel(2.25.1)轮询的Excel文件。 这意味着该方法通过字符串获取文件内容: @Handler public void processFile(@Body String body) { 为了读取Excel文件,我使用ApachePOI和POIooXML(都是4.1.2) 但是,直接使用字符串 WorkbookFactory.create(new ByteArrayInputStream(body.getBytes(Charset.forName(

目前,我正在尝试读取通过ApacheCamel(2.25.1)轮询的Excel文件。 这意味着该方法通过字符串获取文件内容:

@Handler
public void processFile(@Body String body) {
为了读取Excel文件,我使用ApachePOI和POIooXML(都是4.1.2)

但是,直接使用字符串

WorkbookFactory.create(new ByteArrayInputStream(body.getBytes(Charset.forName("UTF-8"))))
抛出“java.io.IOException:ZIP条目大小过大或无效”

将字符串与其他编码一起使用:

WorkbookFactory.create(new ByteArrayInputStream(body.getBytes()))
抛出“org.apache.poi.openxml4j.exceptions.NotOfficeXmlFileException:找不到有效的条目或内容,这不是有效的OOXML(Office Open XML)文件”

此外,我尝试:

File file = exchange.getIn().getBody(File.class);
Workbook workbook = new XSSFWorkbook(new FileInputStream(file));
可能是因为文件是从FTP服务器读取的,所以会引发java.io.FileNotFoundException:无效的文件路径

但是,下一个代码确实有效:

URL url = new URL(fileFtpPath);
URLConnection urlc = url.openConnection();
InputStream ftpIs = urlc.getInputStream();
Workbook workbook = new XSSFWorkbook(ftpIs);
但我不希望自己连接到FTP服务器,因为Camel已经读取了文件,并且所需的Excel内容可用(在字符串体中)。
有没有办法用ApachePOI从字符串中读取Excel文件的内容?

我的路由是XML格式的,因此我使用groovy处理Excel文件,也许您会觉得它很有用

import org.apache.poi.ss.usermodel.WorkbookFactory

def workbook = WorkbookFactory.create(request.getBody(File.class))
def sheet = workbook.getSheetAt(0)
...
还有一种方法通常用于处理流的大型excel文件。为此,我们应该从
org.apache.poi.xssf.eventusermodel
实现
XSSFSheetXMLHandler.SheetContentsHandler
您可以在这里找到原始POI示例的副本,由于某种原因,它最近被从中删除。如果您感兴趣,我的groovy版本如下

import org.apache.poi.openxml4j.opc.OPCPackage
import org.apache.poi.ooxml.util.SAXHelper
import org.apache.poi.xssf.eventusermodel.XSSFReader
import org.apache.poi.xssf.eventusermodel.XSSFSheetXMLHandler
import org.apache.poi.xssf.eventusermodel.ReadOnlySharedStringsTable
import org.apache.poi.hssf.usermodel.HSSFDataFormatter
import org.xml.sax.InputSource

class MyHandler implements XSSFSheetXMLHandler.SheetContentsHandler {
    ...
}

def pkg = OPCPackage.open(request.getBody(InputStream.class))
def xssfReader = new XSSFReader(pkg)
def sheetParser = SAXHelper.newXMLReader()

def handler = new XSSFSheetXMLHandler(xssfReader.getStylesTable(), null, new ReadOnlySharedStringsTable(pkg), MyHandler, new HSSFDataFormatter(), false)
sheetParser.setContentHandler(handler)
sheetParser.parse(new InputSource(xssfReader.getSheetsData().next()))

可能是框架(POI和Camel)导致了我的问题,而不是Java语言。所以这个解决方案仍然抛出FileNotFoundException。我认为这是因为FTP服务器上使用了文件类和文件。Java等效的
WorkbookFactory.create(exchange.getIn().getBody(Java.io.File.class))
仍然抛出FileNotFoundException。无论如何,谢谢你的帮助。通过使用
InputStream is=exchange.getIn().getBody(InputStream.class)解决了这个问题
令人惊讶的是,以下内容不起作用:
WorkbookFactory.create(新的ByteArrayInputStream(body.getBytes(Charset.forName(“UTF-8”))))
虽然我没有使用sheetParser,但我接受了你的答案,因为它让我想到了getBody(InputStream.class)。很高兴我能提供帮助