yycgz之药品目录导出(一)

时间:2022-03-17 14:46:35

1      药品目录接口

yycgz之药品目录导出(一)

在市级药品采购平台上,开发一个药品目录导入、导出功能。

用户导入过程:

用户线下整理excel文件(记录要导入药品目录信息)

    注意:excel文件规则(定义了文件内容格式,比如第一列是药品流水号、第二列是药品名称。。。。)

进入市级药品采购平台,使用药品目录导入功能,将线下excel文件导入平台上。

系统按照上边excel文件规则进行文件内容解析,插入到系统数据库。

 

 

导入功能好处:

方便执行批量操作

对于复杂的信息,可以采用导入功能,由用户在线下整理内容,导入系统。效率是很快。

 

 

导出功能好处:

方便用户备份重要数据信息。

将数据导出到本地,方便对数据进行二次加工。

建议:所有统计功能,都要添加导出功能。

 

1.1     药品目录 表

系统数据库中,创建一个张表ypxx(药品目录表):

记录了市级医药平台所使用的所有药品(平台药品总目录

 

药品流水号

省平台和市平台统一使用的号,此流水号在省级招标平台产生

药品通用名:(行业内对药品的通用称呼)、剂型、规格、转换系数、生产企业、商品名药品中标价

药品交易状态(业务代码:1:正常、2:暂停)

 yycgz之药品目录导出(一)

系统中不对药品目录中的记录进行物理删除,如果这个药品不在系统中使用,设置交易状态为2。

2      药品目录导出

2.1     导出流程

 

第一步;根据查询条件(导出条件)查询药品目录表

第二步:将查询到药品目录列表调用api导出excel文件

     导出文件过程就是写文件过程

2.2     Apache poi

yycgz之药品目录导出(一)

 

学习目标:使用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();//创建1sheet

         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,出现内存溢出

 yycgz之药品目录导出(一)

总结: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);//将临时写的文件合并,输出整个文件

 

 

跟踪代码:

向磁盘刷新数据,生成临时文件:

yycgz之药品目录导出(一)

临时文件内容就是向excel中写的内容,

最后执行文件合并,将文件输出。

 

总结:使用XSSF导出数据,将数据写入内存一部分,超过的则立即写磁盘,所以内存占有量有限不会导致内存溢出。

 

缺点:写数据时速度慢

 

优点:写大数据量时不会发生内存溢出

 

 

本系统采用XSSF导出药品目录信息。