java儲存資料到excel(包括普通Java程式和後端)
阿新 • • 發佈:2018-12-16
java儲存資料到excel
說明:最近兩次遇到儲存資料到excel中的需求,分別是java程式中讀取檔案資料轉換成excel表儲存和servlet中獲取網頁資料通知瀏覽器下載儲存成excel格式的檔案。下面討論這兩種實現方式,
1.javaSE中程式資料或者讀取檔案資料儲存到excel中
不是很複雜,直接上程式碼,要點寫在註釋裡: 假設現在要把list中的資料儲存到excel物理檔案,list的每個元素是Message物件,Message類中有傳送者、接收者、和訊息內容。
//建立Workbook類 Workbook wb=new HSSFWorkbook(); Sheet sheet=wb.createSheet("聊天資訊表");//sheet是一張表,建立時可以傳入表名字 Row row1=sheet.createRow(0);//由表建立行,需要傳入行標,由0開始 row1.createCell(0).setCellValue("傳送者");//得到行物件後,按列寫入值 row1.createCell(1).setCellValue("接收者"); row1.createCell(2).setCellValue("訊息內容"); for (int i=1;i<list.size();i++) { Message m=list.get(i); //行 Row row=sheet.createRow(i); row.createCell(0).setCellValue(m.getSender()); row.createCell(1).setCellValue(m.getReceiver()); row.createCell(2).setCellValue(m.getMessage()); } //下面給出檔案和輸出流,然後把excel資料寫入 File file=new File("save//使用者"+user.getUserName()+"的訊息記錄表.xls"); // if(!file.exists())file.createNewFile(); try(OutputStream ops=new FileOutputStream(file)){ wb.write(ops); //wb.close(); ops.close();//這裡關閉Workbook或者關閉OutputStream都可以,應該是Workbook關閉的時候順帶關閉了OutputStream } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }
2.Java EE Servlet中儲存資料到excel
例子1. 下面的例子裡:servlet中把session中的一個list物件取出來,告訴瀏覽器以excel的格式下載,此list物件儲存的元素是ShoppingItem類的物件,ShoppingItem類儲存有資料:商品名字,商品單價,商品數量
//1.取出要儲存的資料 HttpSession session=request.getSession(); List<ShoppingItem> items= (List<ShoppingItem>)session.getAttribute("shoppingItems"); //從session中取得要儲存的list物件 //2.設定響應頭告訴瀏覽器以excel格式下載 response.setCharacterEncoding("utf-8");//保證寫入中文資料時不亂碼 String fileName="購物詳細清單.xls";//瀏覽器下載檔案時用的檔名 byte[] b=fileName.getBytes("gbk");//下面兩行保證瀏覽器中下載時中文檔名不亂碼 fileName=new String(b,"iso-8859-1"); response.setHeader("content-disposition", "attachment;filename="+fileName); response.setContentType("application/vnd.ms-excel");//告訴瀏覽器以excel格式下載 //3.構建、儲存excel資料(類似第一種) Workbook wb=new HSSFWorkbook(); Sheet sheet=wb.createSheet("購物詳細清單"); //存商品資訊 Row row1=sheet.createRow(0); row1.createCell(0).setCellValue("商品資訊"); Row row2=sheet.createRow(1); row2.createCell(0).setCellValue("名稱"); row2.createCell(1).setCellValue("單價"); row2.createCell(2).setCellValue("購買數量"); row2.createCell(3).setCellValue("小計"); for(int i=2;i<items.size()+2;i++) { Row rowx=sheet.createRow(i); ShoppingItem item=items.get(i-2); rowx.createCell(0).setCellValue(item.getName()); rowx.createCell(1).setCellValue(item.getPrice()); rowx.createCell(2).setCellValue(item.getCount()); rowx.createCell(3).setCellValue(item.getPrice()*item.getCount()); } OutputStream ops=response.getOutputStream(); wb.write(ops); ops.close(); //wb.close()//這裡和上面第一種不一樣,只能關OutputStream,關Workbook無效
例子2. 直接下載網頁資料到excel中:某個servlet設定響應頭告訴瀏覽器以excel格式下載,然後通過include的方式,轉到要儲存資料的另一個servlet(這個servlet顯示了一些資料(應該也能是jsp)),瀏覽器會把這個servlet所有顯示出來的資料以excel下載
//關於響應頭的設定和例子1一樣 String fileName="購物詳細清單.xls"; byte[] b=fileName.getBytes("gbk"); fileName=new String(b,"iso-8859-1"); response.setHeader("content-disposition", "attachment;filename="+fileName); response.setContentType("application/vnd.ms-excel"); //include RequestDispatcher rd=this.getServletContext().getRequestDispatcher("/ShowDetailServlet"); rd.include(request, response);
ps:只是個人的經驗,難免有錯,歡迎留言。