читать и писать документ Excel с использованием Apache Camel - PullRequest
0 голосов
/ 08 октября 2018

Я пытаюсь прочитать документ Excel, помассировать его, а затем написать документ на верблюде.Я могу прочитать документ Excel, я могу написать в его ячейки или обновить его.У меня проблемы с записью потока в обмен сообщениями верблюда и получением документа Excel.

что я делаю не так?спасибо !!!

так, идея в том, что у меня есть шаблон Excel, который я импортирую.У меня есть данные, поступающие с биржи, которые будут помещены в ячейки электронной таблицы на 2-м листе, а затем мне нужно отправить этот файл в пункт назначения.

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 голосов
/ 09 октября 2018

ну, это ошибка оператора.в моем маршруте я использовал charset = {{outputEncoding}}, где кодировка установлена ​​в US ASCII.

в контексте контекста не используйте кодировку charset.Это производит вывод файла Excel.

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