前段时间要做一个excel表格的上传下载功能,上网找了各种资料及源码,最后借鉴别人的代码及思路完成了符合自己需求的代码,总结一下excel的上传下载实质是通过第三方的类库比如poi,jxl等对excel单元格的设置与读写,通过类库的api,你可以发现各种各样的操作excel的方法,基本上只要你能在office的excel上进行的基本操作通过代码都能实现。
上传文件:
首先新建一个工具类,我命名为ImportExcelUtil,代码如下:
public class ImportExcelUtil {
private final static String excel2003L =".xls"; //2003- 版本的excel
private final static String excel2007U =".xlsx"; //2007+ 版本的excel
/**
* 描述:获取IO流中的数据,组装成List>对象
* @param in,fileName
* @return
* @throws IOException
*/
public List> getBankListByExcel(InputStream in,String fileName) throws Exception{
List> list = null;
//创建Excel工作薄
Workbook work = this.getWorkbook(in,fileName);
if(null == work){
throw new Exception("创建Excel工作薄为空!");
}
Sheet sheet = null;
Row row = null;
Cell cell = null;
list = new ArrayList>();
//遍历Excel中所有的sheet
int s=work.getNumberOfSheets();
for (int i = 0; i < work.getNumberOfSheets(); i++) {
sheet = work.getSheetAt(i);
if(sheet==null){continue;}
int s2=sheet.getLastRowNum();
//遍历当前sheet中的所有行
for (int j = sheet.getFirstRowNum(); j <= sheet.getLastRowNum(); j++) {
row = sheet.getRow(j);
if(row==null||row.getFirstCellNum()==j){continue;}
//遍历所有的列
List
这个工具类是支持2003和2007的,excel2003和2007所用到的包是不一样的,所以如何你的工程师maven构建的话需要在pom.xml上引入下面两个包:
org.apache.poi
poi
3.14
org.apache.poi
poi-ooxml
3.14
工具类写好以后,接下来就可以在具体业务逻辑实现方法里调用了,我这边有个上传的controller
public class UploadExcelControl {
@Autowired
DetailInfoVoService detailInfoVoService;
/**
* 描述:通过传统方式form表单提交方式导入excel文件
* @param request
* @throws Exception
*/
@RequestMapping(value="upload.do",method={RequestMethod.GET,RequestMethod.POST})
public String uploadExcel(HttpServletRequest request) throws Exception {
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
System.out.println("通过传统方式form表单提交方式导入excel文件!");
InputStream in =null;
List> listob = null;
MultipartFile file = multipartRequest.getFile("upfile");
if(file.isEmpty()){
throw new Exception("文件不存在!");
}
in = file.getInputStream();
listob = new ImportExcelUtil().getBankListByExcel(in,file.getOriginalFilename());
in.close();
//因为要导入的excel比较特殊,不是常规的一行类别,其他行都是数据,所以我需要根据具体模板来读取excel
for (int i = 0; i < listob.size(); i+=11) {
DetailInfoVo vo = new DetailInfoVo();
vo.setSiteId(String .valueOf(listob.get(i).get(1)));
vo.setSiteName(String.valueOf(listob.get(i).get(3)));
vo.setSitePhone(String.valueOf(listob.get(i).get(5)));
vo.setSiteAddress(String.valueOf(listob.get(i+1).get(1)));
vo.setIsOpened(String.valueOf(listob.get(i+1).get(5)));
vo.setSiteClass(String.valueOf(listob.get(i+2).get(1)).split(",")[0]);
vo.setSiteScale(String.valueOf(listob.get(i+2).get(1)).split(",")[1]);
vo.setSiteDetail(String.valueOf(listob.get(i+3).get(0)));
vo.setIsPartnership(String.valueOf(listob.get(i+4).get(1)));
vo.setReason(String.valueOf(listob.get(i+5).get(0)));
vo.setBossName(String.valueOf(listob.get(i+7).get(1)));
vo.setBossAge(String.valueOf(listob.get(i+7).get(3)));
vo.setBossJiguan(String.valueOf(listob.get(i+7).get(5)));
vo.setBossYear(String.valueOf(listob.get(i+8).get(1)));
vo.setBossPeople(String.valueOf(listob.get(i+8).get(3)));
vo.setOthers(String.valueOf(listob.get(i+9).get(1)));
vo.setEventLog(String.valueOf(listob.get(i+10).get(0)));
int resultCode=detailInfoVoService.insert(vo);
if(resultCode!=0){
System.out.println("=======");
}
}
return "result";
}
}
前台使用的是form表单提交的方式,首先在jsp页面定义一个form,action指向对应的controller
上传的内容就介绍完了,相比上传,下载更加容易。
导出excel:
=======
新建一个工具类ExportExcelUtil:
public class ExportExcelUtil {
/**
* 描述:根据文件路径获取项目中的文件
* @param fileDir 文件路径
* @return
* @throws Exception
*/
public File getExcelDemoFile(String fileDir) throws Exception{
String classDir = null;
String fileBaseDir = null;
File file = null;
classDir = Thread.currentThread().getContextClassLoader().getResource("/").getPath();
fileBaseDir = classDir.substring(0, classDir.lastIndexOf("classes"));
file = new File(fileBaseDir+fileDir);
if(!file.exists()){
throw new Exception("模板文件不存在!");
}
return file;
}
public Workbook writeNewExcel(File file,String sheetName,List lis) throws Exception{
Workbook wb = null;
Row row = null;
Cell cell = null;
FileInputStream fis = new FileInputStream(file);
wb = new ImportExcelUtil().getWorkbook(fis, file.getName()); //获取工作薄
Sheet sheet = wb.getSheet(sheetName);
//循环插入数据
int lastRow = sheet.getLastRowNum()+1; //插入数据的数据ROW
CellStyle cs = setSimpleCellStyle(wb); //Excel单元格样式
for (int i = 0; i < lis.size(); i++) {
row = sheet.createRow(lastRow+i); //创建新的ROW,用于数据插入
//按项目实际需求,在该处将对象数据插入到Excel中
DetailInfoVo vo = lis.get(i);
if(null==vo){
break;
}
//Cell赋值开始
cell = row.createCell(0);
cell.setCellValue(vo.getSiteId());
cell.setCellStyle(cs);
cell = row.createCell(1);
cell.setCellValue(vo.getSiteName());
cell.setCellStyle(cs);
cell = row.createCell(2);
cell.setCellValue(vo.getSiteAddress());
cell.setCellStyle(cs);
cell = row.createCell(3);
cell.setCellValue(vo.getSiteClass());
cell.setCellStyle(cs);
cell = row.createCell(4);
cell.setCellValue(vo.getSiteScale());
cell.setCellStyle(cs);
cell = row.createCell(5);
cell.setCellValue(vo.getIsPartnership());
cell.setCellStyle(cs);
cell = row.createCell(6);
cell.setCellValue(vo.getSitePhone());
cell.setCellStyle(cs);
cell = row.createCell(7);
cell.setCellValue(vo.getIsOpened());
cell.setCellStyle(cs);
}
return wb;
}
/**
* 描述:设置简单的Cell样式
* @return
*/
public CellStyle setSimpleCellStyle(Workbook wb){
CellStyle cs = wb.createCellStyle();
cs.setBorderBottom(CellStyle.BORDER_THIN); //下边框
cs.setBorderLeft(CellStyle.BORDER_THIN);//左边框
cs.setBorderTop(CellStyle.BORDER_THIN);//上边框
cs.setBorderRight(CellStyle.BORDER_THIN);//右边框
cs.setAlignment(CellStyle.ALIGN_CENTER); // 居中
return cs;
}
}
具体的实现类如下
public class ExportExcelControl {
@Autowired
DetailInfoVoService detailInfoVoService;
@RequestMapping(value="export.do",method={RequestMethod.GET,RequestMethod.POST})
public String exportExcel(HttpServletRequest request,HttpServletResponse response) throws Exception {
OutputStream os = null;
Workbook wb = null; //工作薄
List list=detailInfoVoService.findList();
try {
List lo = new ArrayList();
for (int i = 0; i < list.size(); i++) {
//根据具体需求向excel即将导出的vo模型填充数据
DetailInfoVo vo = new DetailInfoVo();
vo.setSiteId(list.get(i).getSiteId());
vo.setSiteName(list.get(i).getSiteName());
vo.setSiteAddress(list.get(i).getSiteAddress());
vo.setSiteClass(list.get(i).getSiteClass());
vo.setSiteScale(list.get(i).getSiteScale());
vo.setIsPartnership(list.get(i).getIsPartnership());
vo.setSitePhone(list.get(i).getSitePhone());
vo.setIsOpened(list.get(i).getIsOpened());
lo.add(vo);
}
//导出Excel文件数据
ExportExcelUtil util = new ExportExcelUtil();
File file =util.getExcelDemoFile("/ExcelDemoFile/模板.xlsx");
String sheetName="sheet1";
wb = util.writeNewExcel(file, sheetName,lo);
String fileName="导出信息.xlsx";
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-disposition", "attachment;filename="+ URLEncoder.encode(fileName, "utf-8"));
os = response.getOutputStream();
wb.write(os);
} catch (Exception e) {
e.printStackTrace();
}
finally{
os.flush();
os.close();
wb.close();
}
return null;
}
}
更详细的代码我就不贴了,主要是上传下载这个思路大家要理清,原理搞清楚了啥都会搞了,比如加特技,通过poi提供的api让你的excel更加炫酷。