需求描述:
1.导出的Excel中部分列包含有下拉列表,并没有尝试过用代码实现这种功能,个人感觉比较棘手,故采用了模版的形式,直接导出数据到已经创建好的Excel模版中
2.Excel的第一列需要写保护,不允许用户修改
3.每一个大类导出到以大类名称命名的Excel中,连同各个对象对应的附件一同拷贝到同Excel的相同目录,然后压缩,下载
4.下载完成后删除该压缩文件,避免垃圾文件过多
public String doDownloadDatas() {
String fileStr = null;
String ms = String.valueOf(System.currentTimeMillis());//以时间戳创建一个临时文件夹
try {// 获取指定的文件
UserManager userManager = (UserManager)SpringHelper.getBean("userManager");//获取当前登录人信息
UserDTO user = userManager.getCurrentUserInfo();
String orgCode = user.getOrgCode();//"ORG00002";// 当前用户所属组织编码
String orgName = user.getOrgName();//"勘探与生产分公司";// 当前用户所属组织名称
List<PrimaryAllot> dataList = this.getMaterialKinds(orgCode);
if (dataList != null && dataList.size() > 0) {
for (int i = 0; i < dataList.size(); i++) {
PrimaryAllot pa = dataList.get(i);
String materialName = pa.getMaterialName();
String materialCode = pa.getMaterialCode();
// 获取指定的模版文档
// Java Excel API既可以从本地文件系统的一个文件(.xls),也可以从输入流中读取Excel数据表。
// 构建Workbook对象, 只读Workbook对象
// 直接从本地文件创建Workbook
// 从输入流创建Workbookx
// String filePath = this.getClass().getResource("/conf/standartInformationReport.xls").getPath();
//获取文件路径,该方法只在windows环境下好使,但是部署到linux服务器上时报FileNotFoundException
// FileInputStream fs=new FileInputStream(filePath);
// 因此修改成如下的方式,可以在Linux和Windows系统中获取到该文件的路径
InputStream fs=this.getClass().getClassLoader().getResourceAsStream("conf/standartInformationReport.xls");
HSSFWorkbook wb=new HSSFWorkbook(fs);
// wb.writeProtectWorkbook("pmsapp", "pmsapp");//写保护操作,下载下来以后,打开Excel文件时所用的 用户名密码都是“pmsapp”
HSSFSheet sheet=wb.getSheetAt(1);
//System.out.println(sheet.getLastRowNum()+" "+row.getLastCellNum());
//创建临时目录
String key = "file.root";
String root = PMSPropertyUtil.getValueOfProperties(key);
String tempPath = root + File.separator+"tempprimaryfile" + File.separator + ms + File.separator;
File tempFile = new File(tempPath);
if (!tempFile.exists()) {
tempFile.mkdirs();
}
FileOutputStream out=new FileOutputStream(tempPath+orgName+"_"+materialName+".xls");
// List objList = this.getDatas(orgCode,materialCode); //这个是从数据库中取得要导出的数据
// int m = 4;//从第五行、第一列开始写入数据
// for (int j = 0; j < objList.size(); j++) {
// HSSFRow row=sheet.getRow(m);
// Object[] objs=(Object[])objList.get(j);
// for (int n = 0; n<19; n++) {
// row.getCell((short)n).setCellValue(objs[n]==null||"null".equals(objs[n])?"":objs[n].toString());
// }
// m++;
// }
List<StandardChooseAdvise> objList = this.getDatas(orgCode,materialCode); //这个是从数据库中取得要导出的数据
int m = 4;//从第五行、第一列开始写入数据
for (int j = 0; j < objList.size(); j++) {
HSSFRow row=sheet.createRow(m);
CellStyle locked = wb.createCellStyle();
locked.setLocked(true);
StandardChooseAdvise objs=(StandardChooseAdvise)objList.get(j);
for (int n = 0; n<19; n++) {
row.createCell((short)0).setCellValue(objs.getId()==null||"null".equals(objs.getId())?"":objs.getId().toString());//序号
row.getCell((short)0).setCellStyle(locked);//锁定该表格
row.createCell((short)1).setCellValue(objs.getItem().getNodeCode()==null||"null".equals(objs.getItem().getNodeCode())?"":objs.getItem().getNodeCode());//物料分类
row.createCell((short)2).setCellValue(objs.getItem().getNodeName()==null||"null".equals(objs.getItem().getNodeName())?"":objs.getItem().getNodeName());//物料分类描述
String standardSort = objs.getStandardSort()==null||"null".equals(objs.getStandardSort())?"":objs.getStandardSort();
if(standardSort.length()>0){
standardSort = "";
}else if ("00001".equals(standardSort)) {
standardSort="国际标准";
}else if ("00002".equals(standardSort)) {
standardSort="国外先进标准";
}else if ("00003".equals(standardSort)) {
standardSort="国家标准";
}else if ("00004".equals(standardSort)) {
standardSort="行业标准";
}else if ("00005".equals(standardSort)) {
standardSort="地方标准";
}else if ("00006".equals(standardSort)) {
standardSort="集团公司企业标准";
}else if ("00007".equals(standardSort)) {
standardSort="外部企业标准";
}else if ("00008".equals(standardSort)) {
standardSort="内部企业订货条件及技术规格书";
}
row.createCell((short)3).setCellValue(standardSort);//标准信息标准分类
row.createCell((short)4).setCellValue(objs.getStandardNO()==null||"null".equals(objs.getStandardNO())?"":objs.getStandardNO());//标准信息标准代号
row.createCell((short)5).setCellValue(objs.getStandardOrderNO()==null||"null".equals(objs.getStandardOrderNO())?"":objs.getStandardOrderNO());//标准信息标准顺序号
row.createCell((short)6).setCellValue(objs.getPublicNO()==null||"null".equals(objs.getPublicNO())?"":objs.getPublicNO());//标准信息发布年代号
row.createCell((short)7).setCellValue(objs.getStandardName()==null||"null".equals(objs.getStandardName())?"":objs.getStandardName());//标准信息标准名称
row.createCell((short)8).setCellValue(objs.getUsedStandardNO()==null||"null".equals(objs.getUsedStandardNO())?"":objs.getUsedStandardNO());//采标情况标准代号
row.createCell((short)9).setCellValue(objs.getUsedStandardOrderNO()==null||"null".equals(objs.getUsedStandardOrderNO())?"":objs.getUsedStandardOrderNO());//采标情况标准顺序号
row.createCell((short)10).setCellValue(objs.getUsedPublicNO()==null||"null".equals(objs.getUsedPublicNO())?"":objs.getUsedPublicNO());//采标情况发布年代号
row.createCell((short)11).setCellValue(objs.getUsedStandardName()==null||"null".equals(objs.getUsedStandardName())?"":objs.getUsedStandardName());//采标情况标准名称
row.createCell((short)12).setCellValue(objs.getUsedInTheDefree()==null||"null".equals(objs.getUsedInTheDefree())?"":objs.getUsedInTheDefree());//采标程度
row.createCell((short)13).setCellValue(objs.getOuterCompanyName()==null||"null".equals(objs.getOuterCompanyName())?"":objs.getOuterCompanyName());//外部企业名称
String haveRecode = objs.getHaveRecord()==null||"null".equals(objs.getHaveRecord())?"":objs.getHaveRecord();
if(haveRecode.length()>0){
haveRecode = "";
}else if ("00001".equals(haveRecode)) {
haveRecode="是";
}else if ("00002".equals(haveRecode)) {
haveRecode="否";
}
row.createCell((short)14).setCellValue(haveRecode);//是否在当地技术监督部门备案
String outerAttachment = objs.getOuterAttachment()==null||"null".equals(objs.getOuterAttachment())?"":objs.getOuterAttachment();
if(outerAttachment.length()>0){
outerAttachment = "";
}else if ("00001".equals(outerAttachment)) {
outerAttachment="是";
}else if ("00002".equals(outerAttachment)) {
outerAttachment="否";
}
row.createCell((short)15).setCellValue(outerAttachment);//外部企业标准附件
String hasAttr = objs.getHasAttr()==null||"null".equals(objs.getHasAttr())?"":objs.getHasAttr();
if(hasAttr.length()>0){
hasAttr = "";
}else if ("00001".equals(hasAttr)) {
hasAttr="是";
}else if ("00002".equals(hasAttr)) {
hasAttr="否";
}
row.createCell((short)16).setCellValue(hasAttr);//内部技术规格书附件
row.createCell((short)17).setCellValue(objs.getBigorg()==null||"null".equals(objs.getBigorg())?"":objs.getBigorg());//提报单位
row.createCell((short)18).setCellValue(objs.getCountAdvice()==null||"null".equals(objs.getCountAdvice())?"":objs.getCountAdvice());//所属企业创编意见数量
}
m++;
}
sheet.protectSheet("123");//dui
out.flush();
wb.write(out);
out.close();
}
fileStr = queryAllFiles(dataList,ms);
}
} catch (Exception e) {
fileStr = "导出失败,请联系管理员!";
e.printStackTrace();
}
return fileStr;//如果导出成功则为压缩包路径,否则为空值
}
待续中……