1. 程式人生 > >java儲存資料到excel(包括普通Java程式和後端)

java儲存資料到excel(包括普通Java程式和後端)

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:只是個人的經驗,難免有錯,歡迎留言。