一、废话
Excel表格是office软件中的一员,几乎是使用次数最多的办公软件。所以在java进行企业级应用开发的时候经常会用到对应的上传下载便利办公。
目前,比较常用的实现Java导入、导出Excel的技术有两种Jakarta POI和Java Excel。
我最近使用的是POI进行上传下载。
官方主页http://poi.apache.org/index.html,API文档http://poi.apache.org/apidocs/index.html
二、正事
HSSF(用于操作Excel的组件)提供给用户使用的对象在rg.apache.poi.hssf.usermodel包中,有以下几种对象:
HSSFWorkbook excel的文档对象
HSSFSheet excel的表单
HSSFRow excel的行
HSSFCell excel的格子单元
HSSFFont excel字体
HSSFDataFormat 日期格式
HSSFHeader sheet头
HSSFFooter sheet尾(只有打印的时候才能看到效果)
HSSFCellStyle cell样式
HSSFDateUtil 日期
HSSFPrintSetup 打印
HSSFErrorConstants 错误信息表
其实Excel表格的操作类似于前端的TABLE操作:
HSSFWorkbook→HSSFSheet →HSSFRow→HSSFCell
(工作文档对象→列表单对象 →行对象→列对象)
然后可以插入文字,设置格式,设置字体等处理
下面演示一个小小的示范
1 //文件源对象 2 POIFSFileSystem fs=null; 3 //工作文档对象 4 HSSFWorkbook wb=null; 5 //工作表单对象 6 HSSFSheet sheet=null; 7 8 fs=new POIFSFileSystem(new FileInputStream("D:/P1200/P1200/WebRoot/excel/"+filename+".xls")); 9 wb = new HSSFWorkbook(fs); 10 //获取第一个表单 11 sheet =wb.getSheetAt(0); 12 //获取第一行 13 HSSFRow row = sheet.getRow(0); 14 //获取第一行的第一列 15 HSSFCell cell = row.getCell(0); 16 //为得到的单元格对象赋值 17 cell.setCellValue("随意");
操作过程中需要记得几个要点:
第一:你操作的对象是建立在java中的对象所以最后要是用如下IO流进行实现
1 FileOutputStream fileOut = new FileOutputStream("D:/P1200/P1200/WebRoot/excel/"+filename+".xls"); 2 wb.write(fileOut);
第二:注意每一个对象类似数组:也就是说起点是0;
第三:setCellValue()这个方法现在是不推荐使用;
现在给出一个SpringMVC上传实例;
@RequestMapping("/report") public String report(@RequestParam("Excle")MultipartFile file,HttpServletRequest request){ //设置文件名,由系统时间生成比较难冲突,用来保存上传记录 String fileName=System.currentTimeMillis()+".xls"; String path = request.getSession().getServletContext().getRealPath("reportExcle"); //创建文档对象 File targetFile = new File(path,fileName); //异常字符串 String EXCEPTION_PersonMsg=null; //文档对象实例化 if(!targetFile.exists()){ targetFile.mkdirs();//递归创建父目录 } try { file.transferTo(targetFile); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } HSSFWorkbook wb=null; try { POIFSFileSystem fs=new POIFSFileSystem(new FileInputStream("d:/P1200/P1200/WebRoot/reportExcle/"+fileName)); wb = new HSSFWorkbook(fs); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } //得到Excel工作表对象 HSSFSheet sheet = wb.getSheetAt(0); //校验可以不用看自己另外写 //与数据库进行交互
//通过循环遍历表中每行 for(i=1;i<sheet.getLastRowNum();i++){ Personalmsg bean=new Personalmsg(); HSSFRow row = sheet.getRow(i);
//通过循环遍历行中每列 for(int j=0;j<5;j++){ HSSFCell cell = row.getCell((short)j); System.out.println(cell); if(j==1&&cell!=null&&!cell.toString().trim().equals("")){ bean.setPersonMsgs(cell.toString()); } if(j==2&&cell!=null&&!cell.toString().trim().equals("")){ bean.setPersonMsgNote(cell.toString()); } if(j==3&&cell!=null&&!cell.toString().trim().equals("")){ bean.setPrice(Double.parseDouble(cell.toString())); } if(j==4){ bean.setPersonMsgDate(new Date()); bean.setStatus(1); System.out.println(bean); XXXXXXXX.save(bean); } } } return "redirect:/test/PersonMsg/tolist.spring"; }
在使用上传过程中可以把上传文件直接转换成IO流不用保存源文件
在上传过程中应该避免以ajax技术提交文件,因为会与MultipartFile冲突导致找不到对应的Requestmapping