java - 如何使用java邮件在单个邮件中发送由函数返回的两个附件?

标签 java apache-poi jakarta-mail

我正在获取一个 Excel 文件作为方法的返回值。我想将该 Excel 文件作为邮件附件发送,但我没有选项将该文件保存在系统上。所以实际上,我没有文件名。如何使用 javamail 将该文件作为附件发送?

digitalDeliveryReportSheet = digitalWorkbook.createSheet("Local Media");
                headerStyle = digitalWorkbook.createCellStyle();
                headerFont = digitalWorkbook.createFont();
                headerFont.setBold(true);
                headerStyle.setFont(headerFont);

                cell = null;
                XSSFRow rowLm;

                rowNum = 1;
                colNum = 0;

                mergeRowFrom = 0; // --> added
                mergeRowTo = 0; // --> added

                mergeColFrom = 1; // --> added
                mergeColTo = 2; // --> added

                contentStatus = new ArrayList<String>();
                contentStatus.add("Delivered");
                contentStatus.add("Completed");

                rowLm = digitalDeliveryReportSheet.createRow(0);
                rowLm.createCell(colNum++).setCellValue("Delivery Date");
                colNum = 1;

                width = 3000;

                try {
                    width = Integer.parseInt(ApplicationUtil.getProperty(ApplicationConstants.REPORTS_DEFAULT_COLUMN_WIDTH));
                } catch (Exception e) {
                    LOG.warn("Exception while fetching REPORTS_DEFAULT_COLUMN_WIDTH", e);
                }


                for (String header : shelfCodeList) {
                    cell = rowLm.createCell(colNum++);
                    cell.setCellStyle(headerStyle);
                    cell.setCellValue(header);
                    CellRangeAddress cellRangeAddress = new CellRangeAddress(mergeRowFrom, mergeRowTo, mergeColFrom, mergeColTo); // --> added
                    digitalDeliveryReportSheet.addMergedRegion(cellRangeAddress); // --> added
                    mergeColFrom+=2;
                    mergeColTo+=2;
                    colNum++;
                    //sheet.autoSizeColumn(colNum);
                    digitalDeliveryReportSheet.setColumnWidth(colNum, width);
                }

                cellsToCover = shelfCodeList.size()*2;
                rowLm = digitalDeliveryReportSheet.createRow(1);
                colNum = 1;
                rowLm = digitalDeliveryReportSheet.createRow(rowNum);
                for(int i = 1; i <= cellsToCover; i++) {
                    cell = rowLm.createCell(colNum++);
                    cell.setCellStyle(headerStyle);
                    if(i % 2 != 0) {
                        cell.setCellValue(contentStatus.get(0));
                    }
                    else {
                        cell.setCellValue(contentStatus.get(1));
                    }
                }

                countByShelf = new HashMap<Long, Integer>();
                completedCountByShelf = new HashMap<Long, Integer>();
                rowNum++;
                    for (String date : deliveryDateList) {
                        colNum = 0;
                        rowLm = digitalDeliveryReportSheet.createRow(rowNum++);
                        cell = rowLm.createCell(colNum++);
                        cell.setCellValue(date);

                        for (int i=0; i < shelfNumberList.size(); i++) {
                            cell = rowLm.createCell(colNum++);
                            long shelfNumber = shelfNumberList.get(i);
                            countByShelf = map.get(date);
                            completedCountByShelf = byShelf.get(date);

                            if(countByShelf != null) {
                                if(countByShelf.get(shelfNumber) != null) {
                                    cell.setCellValue(countByShelf.get(shelfNumber));
                                }
                            }
                            if(completedCountByShelf!=null) {
                                if(completedCountByShelf.get(shelfNumber) != null) {
                                    cell = rowLm.createCell(colNum);
                                    cell.setCellValue(completedCountByShelf.get(shelfNumber));
                                }
                            }
                            colNum++;
                        }
                    }

                    mergeRowFrom = rowNum; // --> added
                    mergeRowTo = rowNum; // --> added

                    mergeColFrom = 1; // --> added
                    mergeColTo = 2; // --> added
                    rowLm = digitalDeliveryReportSheet.createRow(rowNum);
                    colNum = 1;
                    for (String header : shelfCodeList) {
                        cell = rowLm.createCell(colNum++);
                        cell.setCellStyle(headerStyle);
                        cell.setCellValue(header);
                        CellRangeAddress cellRangeAddress = new CellRangeAddress(mergeRowFrom, mergeRowTo, mergeColFrom, mergeColTo); // --> added
                        digitalDeliveryReportSheet.addMergedRegion(cellRangeAddress); // --> added
                        mergeColFrom+=2;
                        mergeColTo+=2;
                        colNum++;
                        //sheet.autoSizeColumn(colNum);
                        digitalDeliveryReportSheet.setColumnWidth(colNum, width);
                    }

                    rowNum++;
                    colNum = 1;
                    rowLm = digitalDeliveryReportSheet.createRow(rowNum);
                    for(int i = 1; i <= cellsToCover; i++) {
                        cell = rowLm.createCell(colNum++);
                        cell.setCellStyle(headerStyle);
                        if(i % 2 != 0) {
                            cell.setCellValue(contentStatus.get(0));
                        }
                        else {
                            cell.setCellValue(contentStatus.get(1));
                        }
                    }

                    rowNum++;
                    colNum = 0;
                    rowLm = digitalDeliveryReportSheet.createRow(rowNum++);
                    cell = rowLm.createCell(colNum++);
                    cell.setCellValue("Total By Column");
                    for (long shelfNumber : shelfNumberList) {
                        cell = rowLm.createCell(colNum++);
                        if (totalByColumn.get(shelfNumber) != null && totalByColumn.get(shelfNumber) > 0) {
                            cell.setCellValue(totalByColumn.get(shelfNumber));
                        }
                        if(totalCompletedByColumn.get(shelfNumber) != null && totalCompletedByColumn.get(shelfNumber) > 0) {
                            cell = rowLm.createCell(colNum);
                            cell.setCellValue(totalCompletedByColumn.get(shelfNumber));
                        }
                        colNum++;
                    }

    } else {
        throw new AssetLibraryValidationException(errorMessages);
    }

    return digitalWorkbook;

这是返回工作簿的代码,如何发送此返回的工作簿而不将其保存在我的系统上。

最佳答案

您需要将数据转换为某种可导出的格式,例如Excel文件格式、csv格式等。并且您需要将数据转换为内存中的字节数组。一旦您在字节数组中获得了正确格式的数据,您就可以使用 ByteArrayDataSource 将其附加到 JavaMail 消息。稍微搜索一下应该会找到一些例子,但关键是:

mbp.setDataHandler(new DataHandler(
    new ByteArrayDataSource(my_byte_array, "text/csv"))); // or whatever MIME type

关于java - 如何使用java邮件在单个邮件中发送由函数返回的两个附件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60207999/

相关文章:

java - 以最有效的方式从 Java 中重复调用 python

java - 为什么 throws 关键字无法处理字段声明中抛出的异常

java - 如何使用 Apache POI 搜索特定日期的 Excel 工作表?

java - 如何使用 Apache POI 查找/替换 .docx 文件中的占位符?

spring - JavaMailSender 返回空指针异常

java - 我可以将类添加到 sun 的 rt.jar 文件吗?

JavaMail 詹姆斯服务器 : Email is marked as spam

java - 在 Java 中使用三角方法时,我得到不正确的值是否有原因?

java - 在 Eclipse Indigo 中缓慢打开 "Dynamic web project"折叠

java - Apache POI 图像比例图像