java - 使用 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&charset={{outputEncoding}}" />
<log message="Sending data packet: ${header.aircraftMetadata.outputPath}/${header.aircraftMetadata.shipNumber}-${header.enginePosition}_${header.messageDateTime}.xlsx" />
输出看起来像一个二进制文件,它不是一个 excel 文件。我认为是因为它发送到消息交换的方式?
解决方案
好吧,这是操作员错误。在我的路线中,我使用了 charset={{outputEncoding}} ,其中编码设置为 US ASCII。
在上下文路由中不要使用字符集编码。这将产生一个 Excel 文件输出。
<to uri="{{EndpointTest}}fileName=/${header.aircraftMetadata.outputPath}/${header.aircraftMetadata.shipNumber}-${header.enginePosition}_${header.messageDateTime}.xlsx" />
推荐阅读
- google-chrome-extension - chrome.storage 不工作,并阻止下面的进程
- android - 在片段内执行 FragmentTransactions 是个好主意吗?
- r - ggplot2 中每个组的不同 scale_fill_gradient
- ios - 安排本地通知(静默)以在后台执行自定义任务 + swift ios
- jmeter - 如何将数组从 JSR223 采样器传递到另一个 JSR223 采样器?
- scala - 不兼容的 Jackson 版本:Spark Structured Streaming
- json - 以 JSON 格式登录到 cloudfoundry logstash
- c# - 使用 lambda 表达式更改列表中的字符串
- c# - 在 Azure VM 上,FtpWebRequest 处于活动模式(UsePassive = False)的“500 语法错误,命令无法识别”
- c# - 检查文件可访问性 .NET Core