提问者:小点点

POI读取Excel文件与身体在字符串


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

@Handler
public void processFile(@Body String body) {

为了读取Excel文件,我使用ApachePOI和POI-ooxml(都是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.Exception.NotOffice XmlFileException:未找到有效的条目或内容,这不是有效的OOXML(Office OpenXML)文件"。

此外,我试过:

File file = exchange.getIn().getBody(File.class);
Workbook workbook = new XSSFWorkbook(new FileInputStream(file));

可能是因为文件是从FTP服务器读取的,java.io

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

URL url = new URL(fileFtpPath);
URLConnection urlc = url.openConnection();
InputStream ftpIs = urlc.getInputStream();
Workbook workbook = new XSSFWorkbook(ftpIs);

但是我不喜欢自己连接到FTP服务器,因为骆驼已经读取了文件,并且所需的Excel内容可用(在字符串体中)。有没有办法用ApachePOI从字符串中读取Excel文件的内容?


共2个答案

匿名用户

我有我的路线在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你可以在这个SO问题中找到原始POI示例的副本,由于某种原因,它最近从poi svn中删除了。如果你感兴趣,我的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()))

匿名用户

您可以直接将主体转换为InputStream并将其传递给XSSFWorkbook构造函数

        Exchange exchange = consumerTemplate.receive("file://C:/ftp/?noop=true", pollCount);
        InputStream stream = exchange.getIn().getBody(InputStream.class);

        XSSFWorkbook workbook = new XSSFWorkbook(stream);
                
        XSSFSheet sheet = workbook.getSheetAt(0);