Camel POI阅读正文为字符串的Excel文件

c9x0cxw0  于 2022-11-07  发布在  Apache
关注(0)|答案(2)|浏览(177)

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

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

为了阅读Excel文件,我使用Apache POI和POI-ooxml(都是4.1.2)。
但是,直接使用String

WorkbookFactory.create(new ByteArrayInputStream(body.getBytes(Charset.forName("UTF-8"))))

抛出一个“java.io. IO异常:ZIP项大小太大或无效”。
将String与其他编码一起使用:

WorkbookFactory.create(new ByteArrayInputStream(body.getBytes()))

异常错误:未找到有效条目或内容,这不是有效得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内容是可用的(在String body中)。有什么方法可以用Apache POI从String中读取Excel文件的内容吗?

9cbw7uwe

9cbw7uwe1#

我的路径是XML格式的,所以我使用groovy来处理excel文件,也许您会发现它很有帮助

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

def workbook = WorkbookFactory.create(request.getBody(File.class))
def sheet = workbook.getSheetAt(0)
...

还有另一种方法通常用于处理大型excel文件,在这种情况下,我们需要处理流。
您可以在这个SO question中找到原始POI示例的副本,由于某种原因,它最近从poi svn中被删除了。

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()))
bd1hkmkf

bd1hkmkf2#

您可以直接将主体转换为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);

相关问题