1 药品目录接口
在市级药品采购平台上,开发一个药品目录导入、导出功能。
用户导入过程:
用户线下整理excel文件(记录要导入药品目录信息)
注意:excel文件规则(定义了文件内容格式,比如第一列是药品流水号、第二列是药品名称。。。。)
进入市级药品采购平台,使用药品目录导入功能,将线下excel文件导入平台上。
系统按照上边excel文件规则进行文件内容解析,插入到系统数据库。
导入功能好处:
方便执行批量操作
对于复杂的信息,可以采用导入功能,由用户在线下整理内容,导入系统。效率是很快。
导出功能好处:
方便用户备份重要数据信息。
将数据导出到本地,方便对数据进行二次加工。
建议:所有统计功能,都要添加导出功能。
1.1 药品目录 表
系统数据库中,创建一个张表ypxx(药品目录表):
记录了市级医药平台所使用的所有药品(平台药品总目录)
药品流水号:
省平台和市平台统一使用的号,此流水号在省级招标平台产生
药品通用名:(行业内对药品的通用称呼)、剂型、规格、转换系数、生产企业、商品名、药品中标价
药品交易状态(业务代码:1:正常、2:暂停)
系统中不对药品目录中的记录进行物理删除,如果这个药品不在系统中使用,设置交易状态为2。
2 药品目录导出
2.1 导出流程
第一步;根据查询条件(导出条件)查询药品目录表
第二步:将查询到药品目录列表调用api导出excel文件
导出文件过程就是写文件过程
2.2 Apache poi
学习目标:使用HSSF 和 XSSF操作excel文档。
2.3 使用HSSF 和 XSSF导出excel
2.3.1 Hssf导出excel
HSSF只操作.xls文件(97-03版本excel),一个sheet中行有限制,最大65536行。
第一步:创建workbook工作簿(excel文档)
Workbook wb = new HSSFWorkbook();
FileOutputStream fileOut = new FileOutputStream("workbook.xls");
wb.write(fileOut);
fileOut.close();
第二步:创建一个sheet工作表
Sheet sheet3 = wb.createSheet(safeName);
第三步:在sheet中创建row行
Row row = sheet.createRow((short)0);
第四步:在row行中创建cell单元格
Cell cell = row.createCell(0);
第五步:向cell中写数据
cell.setCellValue(1);
第六步:输出excel文件(写文件)
wb.write(fileOut);
fileOut.close();
测试代码:
// 创建文件输出流
FileOutputStreamout = newFileOutputStream("d:/workbook.xls");
//创建一个工作簿
Workbookwb = newHSSFWorkbook();
for (int j = 0; j < 1; j++) {
Sheets = wb.createSheet();//创建1个sheet
wb.setSheetName(j,"sheet"+ j);//指定sheet的名称
//xls文件最大支持65536行
for (int rownum = 0; rownum <65536; rownum++) {//创建行,.xls一个sheet中的行数最大65535
// 创建一行
Rowr = s.createRow(rownum);
for (int cellnum = 0; cellnum< 10; cellnum ++) {//一行创建10个单元格
// 在行里边创建单元格
Cellc = r.createCell(cellnum);
//向单元格写入数据
c.setCellValue(cellnum);
}
}
}
System.out.println("int..............");
wb.write(out);//输出文件内容
try {
Thread.sleep(2000);
}catch(InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
out.close();
使用上边的测试代码,在一个工作簿中导出多个sheet,出现内存溢出
总结:HSSF 在先将excel数据加载到内存再写磁盘,如果是大数据量操作,会导致内存溢出。
出现内存溢出原因,HSSF工作原理,将excel中所有数据填充到java对象中,进行文件写操作。
缺点:
如果数据大,引起内存溢问题。
优点:
编程方便,如果数据量小,数据写在内存中速度很快的。
2.3.2 XSSF导出 excel
XSSF操作03以上版本(07版本)excel,扩展名.xlsx,工作表行数没有限制
写excel文件步骤:
可以解决HSSF操作大数据内存溢出问题。
第一步:创建一个工作簿
SXSSFWorkbook wb = new SXSSFWorkbook(-1); -1:关闭自动刷新
SXSSFWorkbook wb = new SXSSFWorkbook(XXXX);(自动刷新)
XXXX:保持内存中有XXXX条记录,超过部分写入磁盘
第二步:创建一个工作表
//创建一个sheet
Sheet sh = wb.createSheet();
第三步:在sheet中创建行
Row row = sh.createRow(rownum);
第四步:创建单元格
Cell cell = row.createCell(cellnum);
第五步:向单元格中写数据
cell.setCellValue(address);
第六步:将内容写入磁盘
由于-1设置关闭自动刷新
需要人工主动刷新
调用:
((SXSSFSheet)sh).flushRows(100);
第七步:输出文件
wb.write(out);//将临时写的文件合并,输出整个文件
跟踪代码:
向磁盘刷新数据,生成临时文件:
临时文件内容就是向excel中写的内容,
最后执行文件合并,将文件输出。
总结:使用XSSF导出数据,将数据写入内存一部分,超过的则立即写磁盘,所以内存占有量有限不会导致内存溢出。
缺点:写数据时速度慢
优点:写大数据量时不会发生内存溢出
本系统采用XSSF导出药品目录信息。