首页 > 解决方案 > 使用 apache camel 读写 excel 文档

问题描述

我正在尝试阅读 excel 文档,对其进行按摩,然后以骆驼路线编写文档。我可以阅读 excel 文档,我可以写入它的单元格或更新它。我无法将流写入骆驼消息交换并获得 excel 文档输出。

我究竟做错了什么?谢谢你!!!

所以,我的想法是我有一个我导入的 excel 模板。我有来自交换的数据,这些数据将放在第二张表的电子表格单元格中,然后我需要将该文件发送到目的地。

public class XlsxProcessor implements Processor {  

    private Logger log = Logger.getLogger(XlsxProcessor.class.getName());

    private static final String template = "DataloaderTemplate.xlsx";
/* collect data from in msg exchange to populate excel spreadsheet */       
    @Override
    public void process(Exchange exchange) throws Exception {

        log.info("Importing Excel Spreedsheet Start...");

/*        List<Map<String, String>> rows = (List<Map<String, String>>)exchange.getIn().getBody();

        for (Map<String, String> row : rows) {

          StringBuilder line = new StringBuilder();
          Iterator<String> rowItr = row.values().iterator();

          while (rowItr.hasNext()) {
            String value = rowItr.next();
            line.append(value);
           if (rowItr.hasNext()) {
               line.append(",");
           }
          }
          line.append("\n");
          log.info("row values: " + line.toString() );
        }
*/        
        InputStream xlsxStream = null;
        ClassLoader classLoader = this.getClass().getClassLoader();
        URL url = this.getClass().getClassLoader().getResource("/excel/" + template);
        log.info("Located Resource URL: " + url );

        if (url != null ){
            log.info("open input stream");
            xlsxStream = url.openStream(); 
            } else {
                log.error("Excel APM Upload Template URI cannot be located!");
            }
                log.info("Open WorkBook!");
                XSSFWorkbook workbook = new XSSFWorkbook(xlsxStream);
                XSSFSheet worksheet = workbook.getSheetAt(1);
                XSSFRow row;

                int rowid = 2;  //data entry starts at row 3 sheet 1 ( 0, 1, 2 )
//                for (String key : keyid) {
                   row = worksheet.createRow(rowid++);
                   int cellid = 0;
//                   for (Object obj : objectArr) {
                     for ( int i = 0; i < 10; i++){
                         XSSFCell cell = (XSSFCell) row.createCell(i);
                         cell.setCellValue(String.valueOf(i));
                   }
//                }

         ByteArrayOutputStream bos = new ByteArrayOutputStream();
         try {
              workbook.write(bos);
             } catch (IOException e) {
             } finally {
             try {
                  bos.close();
                 } catch (IOException e) {
              }
            }
            byte[] xlsx = bos.toByteArray();

            exchange.getIn().setBody(xlsx);

        log.info("APM Predix Excel Spreedsheet End...");
}

进入骆驼上下文以将文件发送到目的地

                <process ref="xlsxProcessor" />
                <to uri="{{EndpointTest}}fileName=/${header.aircraftMetadata.outputPath}/${header.aircraftMetadata.shipNumber}-${header.enginePosition}_${header.messageDateTime}.xlsx&amp;charset={{outputEncoding}}" />
                <log message="Sending data packet: ${header.aircraftMetadata.outputPath}/${header.aircraftMetadata.shipNumber}-${header.enginePosition}_${header.messageDateTime}.xlsx" /> 

输出看起来像一个二进制文件,它不是一个 excel 文件。我认为是因为它发送到消息交换的方式?

标签: javaexcelapache-camelapache-poi

解决方案


好吧,这是操作员错误。在我的路线中,我使用了 charset={{outputEncoding}} ,其中编码设置为 US ASCII。

在上下文路由中不要使用字符集编码。这将产生一个 Excel 文件输出。

         <to uri="{{EndpointTest}}fileName=/${header.aircraftMetadata.outputPath}/${header.aircraftMetadata.shipNumber}-${header.enginePosition}_${header.messageDateTime}.xlsx" />

推荐阅读