我试图读取一个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&charset={{outputEncoding}}" />
<log message="Sending data packet: ${header.aircraftMetadata.outputPath}/${header.aircraftMetadata.shipNumber}-${header.enginePosition}_${header.messageDateTime}.xlsx" />
输出看起来像一个二进制文件,所有文件都已废弃,这不是excel文件。我认为是因为它发送到消息交换的方式了吗?
答案 0 :(得分:0)
嗯,这是操作员错误。在我的路线中,我使用的是charset = {{outputEncoding}},其中编码设置为US ASCII。
上下文路由中的不要使用字符集编码。这将产生一个Excel文件输出。
<to uri="{{EndpointTest}}fileName=/${header.aircraftMetadata.outputPath}/${header.aircraftMetadata.shipNumber}-${header.enginePosition}_${header.messageDateTime}.xlsx" />