使用apache camel读写Excel文档

时间:2018-10-08 16:27:53

标签: java excel apache-camel apache-poi

我试图读取一个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文件。我认为是因为它发送到消息交换的方式了吗?

1 个答案:

答案 0 :(得分:0)

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

上下文路由中的

不要使用字符集编码。这将产生一个Excel文件输出。

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