**HAP系统中实现excel数据生成并**
**Poi的EXCEL相关类介绍与依赖引入**
**Excel相关导出类介绍** **
**
Poi进行excel导出时,提供了三个基本功能的类:HSSFWorkbook、XSSFWorkbook、SXSSFWorkbook,三个类都提供了excel文件相关导出,但是对于导出的excel版本兼容性及数据量存在区别对比如下:
● HSSFWorkbook
导出数据格式:xls
缺点:最多只能处理65536数据行,否则会抛出异常
java.lang.IllegalArgumentException: Invalid row number (65536) outside
allowable range (0..65535)
优点:过程中写入缓存 不操作磁盘,最后一次性写入磁盘,速度快
● XSSFWorkbook
导出数据格式:xlsx
缺点:写数据时速度非常慢,非常耗内存,也会发生内存溢出
优点:可以写较大数据量,一般处理100万以下
● SXSSFWorkbook
导出数据格式:xlsx
优点:处理大数据量的写入,内存占用少
**Maven依赖引入**
**将头行表中的数据按照excel模板生成对应xlsx文件**
**HAP标准功能附件管理中配置相关文件保存路径**
路径:附件管理-目录管理
**设置对应excel模板并保存到配置的附件路径下**
**查询数据并将数据输出到excel模板中生成excel文件**
@Autowired
private IAttachCategoryService categoryService; //自动注入HAP附件的service类
@Autowired
private IHeaderService headerService; //自动注入header的service类
AttachCategory category = categoryService.selectAttachByCode(requestCtx, "TEST
"); //获取对应附件信息
String fileDirPath = category.getCategoryPath(); //获取对应附件存储路径
XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream(new
File(fileDirPath + File.separator + "test.xlsx")));
//加载对应excel模板
XSSFSheet sheet = workbook.getSheetAt(workbook.getSheetIndex("测试模板"));
//获取对应模板的sheet页
Header header = headerService.getOneHeader(“TEST01”); //查询对应输出数据
//设置模板头相关信息
XSSFRow row;
XSSFCell cell;
row = sheet.getRow(1);
cell = row.getCell(5);
cell.setCellValue(header.getOrderNumber());
row = sheet.getRow(1);
cell = row.getCell(8);
cell.setCellValue(header.getOrderType());
//循环复制指定行数量的行
Listlines = header.getLine();
//获取合并单元格区域
int lastRowNo = sheet.getLastRowNum();
sheet.shiftRows(3, lastRowNo, step, true, false);
//创建空行
XSSFRow row;
int lineRowNum = 3;
for (int i = 0; i < lines.size(); i++) {
row = sheet.createRow(lineRowNum + i);
CellCopyPolicy cellCopyPolicy = new CellCopyPolicy();
cellCopyPolicy.setCopyCellStyle(true);
cellCopyPolicy.setCopyCellValue(false);
row.copyRowFrom(sheet.getRow(lineRowNum + lines.size()), cellCopyPolicy);
}
//设置行相关信息
for (Line line : lines) {
row = sheet.getRow(lineRowNum++);
row.getCell(5).setCellValue(line.getLineType());
row.getCell(6).setCellValue(line.getItem());
row.getCell(7).setCellValue(line.getDescription());
row.getCell(8).setCellValue(line.getQuantity());
row.getCell(9).setCellValue(line.getPrice());
}
//将生成的excel保存到对应的附件路径下
String targetFilePath = fileDirPath + File.separator +“文件名” + ".xlsx";
File targetFile = new File(targetFilePath);
FileOutputStream targetFileOutputStream = new FileOutputStream(targetFile);
workbook.write(targetFileOutputStream);
workbook.close();
targetFileOutputStream.flush();
targetFileOutputStream.close();
//保存附件相关信息到HAP附件相关的表中
**将生成excel作为附件进行发送**
** HAP标准功能中配置邮件模板 **
路径:系统管理-邮件-邮件模板
**邮件发送**
@Autowired
private IMessageService messageService;
//定义模板中对应的变量
Mapmap = new HashMap<>(2);
map.put("SupplierName", header.getSupplierName());
map.put("AccountCheckNumber", header.getAccountCheckNumber());
//定义收件人相关信息
ListmessageReceiverList = new ArrayList<>();
MessageReceiver mr = new MessageReceiver();
mr.setMessageAddress("1@qq.com");
//对应收件人邮箱
mr.setMessageType(ReceiverTypeEnum.NORMAL.getCode());
messageReceiverList.add(mr);
//将附件sysFile对象的文件的id转化为list
ListsysFileIdList = Collections.singletonList(sysFile.getFileId());
//调用邮件发送api
messageService.sendMessage(requestCtx, "TEST", map, messageReceiverList,
sysFileIdList);
作者:段志超
审核:邓金边
编辑:朱思聪