1.1.1 需求:
药品目录导出功能,使用人:监督单位、医院、供货商
药品目录添加/导入/删除:监督单位
操作步骤:
1.1.2 分析导出方法
分析一个技术,需要进行技术预研,确定使用XSSF导出excel文件。
确定采用自动刷新:
SXSSFWorkbook wb = new SXSSFWorkbook(XXXX);(自动刷新)
XXXX:保持内存中有XXXX条记录,超过部分写入磁盘
对XSSF导出excel进行封装,写一个封装类,方便开发使用。
ExcelExportSXXSSF.java
工具类的使用方法:使用util工程的ExcelExportSXXSSF类执行导出:
测试代码如下:
//导出文件存放的路径,并且是虚拟目录指向的路径
StringfilePath = "d:/upload/linshi/";
//导出文件的前缀
StringfilePrefix="ypxx";
//-1表示关闭自动刷新,手动控制写磁盘的时机,其它数据表示多少数据在内存保存,超过的则写入磁盘
int flushRows=100;
//定义导出数据的title
List<String>fieldNames=newArrayList<String>();
fieldNames.add("流水号");
fieldNames.add("通用名");
fieldNames.add("价格");
//告诉导出类数据list中对象的属性,让ExcelExportSXXSSF通过反射获取对象的值
List<String>fieldCodes=newArrayList<String>();
fieldCodes.add("bm");//药品流水号
fieldCodes.add("mc");//通用名
fieldCodes.add("price");//价格
//注意:fieldCodes和fieldNames个数必须相同且属性和title顺序一一对应,这样title和内容才一一对应
//开始导出,执行一些workbook及sheet等对象的初始创建
ExcelExportSXXSSFexcelExportSXXSSF = ExcelExportSXXSSF.start(filePath, "/upload/",filePrefix, fieldNames, fieldCodes, flushRows);
//准备导出的数据,将数据存入list,且list中对象的字段名称必须是刚才传入ExcelExportSXXSSF的名称
List<Ypxx>list = newArrayList<Ypxx>();
Ypxxypxx1 = newYpxx("001","青霉素", 5);
Ypxxypxx2 = newYpxx("002","感冒胶囊", 2.5f);
list.add(ypxx1);
list.add(ypxx2);
//执行导出
excelExportSXXSSF.writeDatasByObject(list);
//输出文件,返回下载文件的http地址
Stringwebpath = excelExportSXXSSF.exportFile();
System.out.println(webpath);
操作步骤:
1、 将导出的文件的标题封装在List<String>
2、 将导出的数据对象的字段封装在List<String>,注意:字段和标题必须对象
3、 准备好导出文件存储的物理路径(服务器的物理路径)
4、 准备导出文件浏览的虚拟路径,此路径在tomcat配置虚拟目录
5、 调用ExcelExportSXXSSF的start方法开始导出
6、 调用 excelExportSXXSSF.writeDatasByObject方法将list数据传入,这时开始导出数据
7、 调用excelExportSXXSSF.exportFile();向磁盘写入文件
8、 通过excelExportSXXSSF.getFileAllPath()得导出文件的浏览地址
1.1.3 药品目录导出实现
l Dao:
根据查询条件查询药品目录信息,确定查询内容:
ID 流水号 通用名 剂型 规格 转换系数 生产企业 商品名称 中标价 交易状态
使用逆向工程生成ypxx的mapper及po
指定列生成的java类型。将中标价格的类型转换为float
<table schema="" tableName="ypxx">
<!-- 指定字段生成类型 -->
<columnOverride column="zbjg" javaType="java.lang.Float"/>
</table>
自定义mapper
创建YpxxMapperCustom.xml文件
Sql:
selectid,
bm,
mc,
jx,
gg,
zhxs,
scqymc,
spmc,
zbjg,
jyzt,
(select info
from dictinfo
where dictinfo.dictcode = ypxx.jyzt
and dictinfo.typecode = '003') jyztmc
from ypxx
where ypxx.bm=''(抽取sql 代码)
主查询表:ypxx
关联查询表:通过数据字典明细表查询交易状态对应的名称
public interfaceYpxxMapperCustom {
//药品目录查询
public List<YpxxCustom>findYpxxList(YpxxQueryVo ypxxQueryVo)
throws Exception;
}
l Service
接口和mapper 一样
接口功能:药品目录查询
接口参数:查询条件
//查询药品目录
@Override
public List<YpxxCustom>findYpxxList(YpxxQueryVo ypxxQueryVo)
throws Exception {
return ypxxMapperCustom.findYpxxList(ypxxQueryVo);
}
l action
两个方法
导出页面展示;
//导出药品页面展示
@RequestMapping("/exportYpxx")
public String exportYpxx(Modelmodel)throwsException{
//药品状态
List<Dictinfo>jyztlist =systemConfigService.findDictinfoByType("003");
//药品类别
List<Dictinfo>yplblist =systemConfigService.findDictinfoByType("001");
model.addAttribute("jyztlist",jyztlist);
model.addAttribute("yplblist",yplblist);
return "/business/ypml/exportYpxx";
}
导出功能提交:
调用封装类方法导出excel。
//导出数据提交
@RequestMapping("/exportYpxxSubmit")
public @ResponseBody SubmitResultInfoexportYpxxSubmit(YpxxQueryVo ypxxQueryVo)throws Exception{
// 调用封装类执行导出
// 导出文件存放的路径,并且是虚拟目录指向的路径
//String filePath = "D:/java/tomcat/upload/temp/";
//改为从系统参数配置表获取参数值
StringfilePath = systemConfigService.findBasicinfoById("00301").getValue();
// 导出文件的前缀
StringfilePrefix = "ypxx";
// -1表示关闭自动刷新,手动控制写磁盘的时机,其它数据表示多少数据在内存保存,超过的则写入磁盘
int flushRows = 100;
// 定义导出数据的title
List<String>fieldNames = newArrayList<String>();
fieldNames.add("流水号");
fieldNames.add("通用名");
fieldNames.add("剂型");
fieldNames.add("规格");
fieldNames.add("转换系数");
fieldNames.add("生产企业");
fieldNames.add("商品名称");
fieldNames.add("中标价格");
fieldNames.add("交易状态");
// 告诉导出类数据list中对象的属性,让ExcelExportSXXSSF通过反射获取对象的值
List<String>fieldCodes = newArrayList<String>();
fieldCodes.add("bm");// 药品流水号
fieldCodes.add("mc");// 通用名
fieldCodes.add("jx");
fieldCodes.add("gg");
fieldCodes.add("zhxs");
fieldCodes.add("scqymc");
fieldCodes.add("spmc");
fieldCodes.add("zbjg");
fieldCodes.add("jyztmc");
// 上边的代码可以优化为,将title和title对应的 pojo的属性,使用map存储
// ....
// 注意:fieldCodes和fieldNames个数必须相同且属性和title顺序一一对应,这样title和内容才一一对应
// 开始导出,执行一些workbook及sheet等对象的初始创建
ExcelExportSXXSSFexcelExportSXXSSF = ExcelExportSXXSSF.start(filePath,
"/pic/",filePrefix, fieldNames, fieldCodes, flushRows);
// 导出的数据通过service取出
List<YpxxCustom>list = ypxxService.findYpxxList(ypxxQueryVo);
// 执行导出
excelExportSXXSSF.writeDatasByObject(list);
// 输出文件,返回下载文件的http地址,已经包括虚拟目录
Stringwebpath = excelExportSXXSSF.exportFile();
System.out.println(webpath);
return ResultUtil.createSubmitResult(ResultUtil.createSuccess(
Config.MESSAGE, 313, new Object[] {
list.size(),
webpath//下载地址
}));
}
l 虚拟目录创建
虚拟目录:web请求路径
目标:将excel导出文件写到服务器的某个目录,用户通过客户端远程下载服务器上该目录的内容。
客户端从远程服务器上下载导出excel文件。
虚拟目录创建: 参考我的博客 :http://blog.csdn.net/u012373815/article/details/47206439
l 调试
在applicationContext-business-service.xml 注入service
<!-- 药品目录 -->
<bean id="ypxxService" class="yycg.business.service.impl.YpxxServiceImpl" >
Business下的mapper无法扫描到,修改applicationContext-base-dao.xml扫描器配置:
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 配置扫描包路径,如果扫描多个包路径,中间使用半角逗号分隔也可以使用通配符 **-->
<property name="basePackage" value="yycg.**.dao.mapper"/>
<!-- 配置SqlSessionFactory -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
系统参数是什么?
系统运行参数,一个系统运行所需要设置参数值。
由管理员登陆系统后台进行设置,
系统参数保存数据库BASICINFO
使用时,只需要根据BASICINFO表的id查询参数值。
在程序代码中,通过SystemConfigService,查询系统参数
/**
* 根据id获取系统配置信息
*/
@Override
public BasicinfofindBasicinfoById(String id) throws Exception {
return basicinfoMapper.selectByPrimaryKey(id);
}
使用方法:
// 导出文件存放的路径,并且是虚拟目录指向的路径
//String filePath = "D:/java/tomcat/upload/temp/";
//改为从系统参数配置表获取参数值
String filePath = systemConfigService.findBasicinfoById("00301").getValue();