java如何导出送货单
导出送货单的实现方法
在Java中导出送货单通常涉及数据查询、模板处理和文件生成三个核心环节。以下是具体实现方案:
使用Apache POI操作Excel
适用于需要生成Excel格式送货单的场景:
// 创建工作簿对象
XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet sheet = workbook.createSheet("送货单");
// 创建表头行
XSSFRow headerRow = sheet.createRow(0);
headerRow.createCell(0).setCellValue("订单编号");
headerRow.createCell(1).setCellValue("客户名称");
// 填充数据行
List<DeliveryOrder> orders = getOrdersFromDatabase();
for(int i=0; i<orders.size(); i++){
XSSFRow row = sheet.createRow(i+1);
row.createCell(0).setCellValue(orders.get(i).getOrderNo());
row.createCell(1).setCellValue(orders.get(i).getCustomerName());
}
// 输出文件
try(FileOutputStream out = new FileOutputStream("delivery_orders.xlsx")){
workbook.write(out);
}
使用iText生成PDF
适用于需要打印或存档的PDF格式送货单:

Document document = new Document();
PdfWriter.getInstance(document, new FileOutputStream("delivery.pdf"));
document.open();
// 添加标题
Paragraph title = new Paragraph("送货单明细",
FontFactory.getFont(FontFactory.HELVETICA_BOLD, 18));
title.setAlignment(Element.ALIGN_CENTER);
document.add(title);
// 创建表格
PdfPTable table = new PdfPTable(4);
table.addCell("商品编码");
table.addCell("商品名称");
table.addCell("数量");
table.addCell("单价");
// 填充数据
for(DeliveryItem item : getItems()){
table.addCell(item.getProductCode());
table.addCell(item.getProductName());
table.addCell(String.valueOf(item.getQuantity()));
table.addCell(item.getUnitPrice().toString());
}
document.add(table);
document.close();
基于模板引擎生成
使用Freemarker或Thymeleaf处理预设计模板:
-
创建HTML模板文件(delivery_template.ftl):

<table border="1"> <tr><th>收货地址</th><td>${delivery.address}</td></tr> <tr><th>联系电话</th><td>${delivery.phone}</td></tr> </table> -
Java处理代码:
Configuration cfg = new Configuration(Configuration.VERSION_2_3_31); cfg.setDirectoryForTemplateLoading(new File("templates")); Template template = cfg.getTemplate("delivery_template.ftl");
Map<String, Object> data = new HashMap<>(); data.put("delivery", getDeliveryData());
try(Writer out = new FileWriter("output.html")){ template.process(data, out); }
---
#### 直接打印实现
通过Java打印API连接打印机:
```java
PrinterJob job = PrinterJob.getPrinterJob();
job.setPrintable((graphics, pageFormat, pageIndex) -> {
if(pageIndex > 0) return Printable.NO_SUCH_PAGE;
graphics.drawString("送货单", 100, 100);
graphics.drawString("---------------------", 100, 120);
return Printable.PAGE_EXISTS;
});
if(job.printDialog()){
job.print();
}
关键注意事项
- 大数据量导出时应采用分页机制
- 敏感信息需加密处理
- 企业级系统建议采用异步导出模式
- 文件命名建议包含时间戳防止重复
实际选择方案应根据具体业务需求、系统架构和输出格式要求决定。商业项目推荐使用专业报表工具如JasperReports或付费API实现复杂格式。






