一、廢話
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