您的位置:首页 > 编程语言 > Java开发

JavaWeb 实现Excel 的导入导出

2017-07-14 11:01 381 查看
开发环境:

myeclipse10.4

/**
导出Excel  文件
*/
public String exportDictEntryData(DictionaryManagedForm fm,
HttpServletRequest request, HttpServletResponse response) {
String tempFile;
// 导出为Excel数据
try {
//查询数据已经存在的数据
List<DictionaryManagedDomain> dictDomainList = new ArrayList<DictionaryManagedDomain>();
//赋值条件
fm.getDomain().setDictionariesId(fm.getDomain().getId());
dictDomainList = dictionaryManagedDao.getExportDictEntryList(fm.getDomain());
//如果未查询都数据,直接返回
if(dictDomainList.size()==0){
return "";
}
// 第一步,创建一个webbook,对应一个Excel文件
HSSFWorkbook wb = new HSSFWorkbook();
// 第二步,并设置excel样式
HSSFCellStyle titleStyle = wb.createCellStyle();//表头样式
titleStyle.setWrapText(true);//自动换行
titleStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
titleStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
titleStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
titleStyle.setRightBorderColor(HSSFColor.BLACK.index);//边框颜色
titleStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
titleStyle.setRightBorderColor(HSSFColor.BLACK.index);
titleStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框
titleStyle.setRightBorderColor(HSSFColor.BLACK.index);
titleStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);//下边框
titleStyle.setBottomBorderColor(HSSFColor.BLACK.index);

HSSFCellStyle titleStyle1 = wb.createCellStyle();//大表头的样式1
titleStyle1.setWrapText(true);//自动换行
titleStyle1.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
titleStyle1.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中

HSSFCellStyle titleStyle2 = wb.createCellStyle();//大表头的样式2
titleStyle2.setWrapText(true);//自动换行
titleStyle2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
titleStyle2.setAlignment(HSSFCellStyle.ALIGN_LEFT);//水平居左

HSSFCellStyle contentStyle = wb.createCellStyle();//数据样式
contentStyle.setWrapText(true); //自动换行
contentStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
contentStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居左
contentStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
contentStyle.setRightBorderColor(HSSFColor.BLACK.index);//边框颜色
contentStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
contentStyle.setRightBorderColor(HSSFColor.BLACK.index);
contentStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框
contentStyle.setRightBorderColor(HSSFColor.BLACK.index);
contentStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);//下边框
contentStyle.setBottomBorderColor(HSSFColor.BLACK.index);

HSSFFont titleFont = wb.createFont();//表头字体样式
titleFont.setFontName("宋体");
titleFont.setFontHeightInPoints((short) 11);//设置字体大小
titleFont.setBoldweight((short)800);

HSSFFont contentFont = wb.createFont();//数据字体样式
contentFont.setFontName("宋体");
contentFont.setFontHeightInPoints((short) 9);//设置字体大小

HSSFFont titleFont1 = wb.createFont();//表头字体样式
titleFont1.setFontName("宋体");
titleFont1.setFontHeightInPoints((short) 11);//设置字体大小
titleFont1.setBoldweight((short)800);

titleStyle.setFont(titleFont);
titleStyle1.setFont(titleFont1);//大表头的样式
titleStyle2.setFont(titleFont1);//大表头的样式
contentStyle.setFont(contentFont);

//TODO:模板下载
HSSFSheet tableSheet;
tableSheet=wb.createSheet("字典项数据");
//设置每列宽度
tableSheet.autoSizeColumn((short) 0, true);
tableSheet.setColumnWidth((short) 0, 20 * 256);
tableSheet.autoSizeColumn((short) 1, true);
tableSheet.setColumnWidth((short) 1, 40 * 256);
tableSheet.autoSizeColumn((short) 2, true);
tableSheet.setColumnWidth((short) 2, 20 * 256);
tableSheet.autoSizeColumn((short) 3, true);
tableSheet.setColumnWidth((short) 3, 20 * 256);

//第四步:将数据放入相应的单元格
HSSFRow targetTableRow ;
HSSFCell targetTableCell;
//数据行  创建第0行
int targetTableI=0;//execl行数
//创建表头行
targetTableRow = tableSheet.createRow((int) (targetTableI));
targetTableCell = targetTableRow.createCell((short) 0);
targetTableCell.setCellValue("字典项编码");
targetTableCell.setCellStyle(titleStyle);

targetTableCell = targetTableRow.createCell((short) 1);
targetTableCell.setCellValue("字典项名称");
targetTableCell.setCellStyle(titleStyle);
//动态插入数据
for (int i = 0; i <dictDomainList.size(); i++) {
targetTableRow = tableSheet.createRow((int) i + 1);
DictionaryManagedDomain  dictDomain = new DictionaryManagedDomain();
dictDomain = dictDomainList.get(i);
// 第四步,创建单元格,并设置值
targetTableRow.createCell((short) 0).setCellValue(dictDomain.getDictionariesEntryCode());
targetTableRow.createCell((short) 1).setCellValue(dictDomain.getDictionariesEntryName());
}

try{
long times=System.currentTimeMillis();//为了防止多人同时操作导出,所以生成时间的临时文件
tempFile="C://"+times+".xls";//临时路径
FileOutputStream fout = new FileOutputStream(tempFile);
wb.write(fout);
fout.close();
System.out.println("ok..");
return tempFile;
}catch (Exception e){
System.out.println("导出数据出错");
e.printStackTrace();
return "";
}
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}

return "";
}


//导入Excel

/**
* 导入新增的表格数据
*/
@Override
public JSONObject importDictEntryForAdd(DictionaryManagedForm fm) {

JSONObject  importJson = new JSONObject();
List<DictionaryManagedDomain> errorList = new ArrayList<DictionaryManagedDomain>();//存放错误信息的列表
String flag="0";
//获取文件路径,创建写入流
InputStream in = null;
try {
in =fm.getExcelImportFile().getInputStream();
} catch (FileNotFoundException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
//导入的文件
try{
Workbook wk = Workbook.getWorkbook(in);//定义工作空间
Sheet[] a=wk.getSheets();
Sheet sh = a[0];//定义工作簿
int toRowNum = sh.getRows();//行数
Cell dictCodeCell=null;//第一列
Cell dictNameCell=null;//第二列
DictionaryManagedDomain domain;
List<String> dictEntryCodes=new ArrayList<String>();//用来判断重复的字典项编码
List<DictionaryManagedDomain> list= new ArrayList<DictionaryManagedDomain>();
for(int i = 1 ; i < toRowNum ; i ++){//分行,批行导入
domain = new DictionaryManagedDomain();
dictCodeCell = sh.getCell(0, i);
dictNameCell = sh.getCell(1, i);

String dictEntryCode=dictCodeCell.getContents();//代表字典编码
String dictEntryName=dictNameCell.getContents();//代表字典项名称

if(dictEntryCode.trim() != null && !dictEntryCode.trim().equals("")){
if(dictEntryCodes.contains(dictEntryCode.trim())){//疾病编码重复
domain.setErrors("execl的第"+(i+1)+"行,字典项编码:"+dictEntryCode.trim()+",字典项名称:"+dictEntryName.trim()+",重复导入!");
errorList.add(domain);
} else {
domain.setDictionariesEntryCode(dictEntryCode);
domain.setDictionariesEntryName(dictEntryName);
domain.setId(fm.getDomain().getId());
list.add(domain);
}
}else {
//如果字典为空
domain.setErrors("execl的第"+(i+1)+"行,字典编码不能为空!");
errorList.add(domain);
}
}

//进入数据插入
if(list.size()==0){
//导入的excel为空
flag="-2";//导入excel无有效数据
}else if(list.size()>0){
//导入表格数据
//                          int sumNum = dictionaryManagedDao.importDictEntryInfoFromExcel(list);
flag = String.valueOf(list.size());
}
importJson.put("excelData", list);

}catch(Exception e){
e.printStackTrace();
flag="0";
}
importJson.put("flag", flag);//导入数据行数
importJson.put("errorList", errorList);//导入数据行数

return importJson;
}


参考文档:
针对不同 POI 通用导出Excel(.xls,.xlsx) http://blog.csdn.net/houxuehan/article/details/50960259
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java web excel