1、該功能需要poi的jar包,鏈接: http://pan.baidu.com/s/1migAtNq 密碼: 38fx。
2、首先新建一個實體類,用以存放單個數據
public class Test { private String x; private String y; private String value; public void setX(String x) { this.x = x; } public void setY(String y) { this.y = y; } public void setValue(String value) { this.value = value; } public String getX() { return x; } public String getY() { return y; } public String getValue() { return value; } }
3、將數據合並成一個集合,例如list<Test> list;
4、開始生成excel
//1、創建workbook,對應一個excel HSSFWorkbook wb = new HSSFWorkbook(); //1.5、生成excel中可能用到的單元格樣式 //首先創建字體樣式 HSSFFont font = wb.createFont();//創建字體樣式 font.setFontName("宋體");//使用宋體 font.setFontHeightInPoints((short) 10);//字體大小 font2.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 加粗 //然后創建單元格樣式style HSSFCellStyle style1 = wb.createCellStyle(); style1.setFont(font);//將字體注入 style1.setWrapText(true);// 自動換行 style1.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 左右居中 style1.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 上下居中 style1.setFillForegroundColor(IndexedColors.LIGHT_YELLOW.getIndex());// 設置單元格的背景顏色 style1.setFillPattern(CellStyle.SOLID_FOREGROUND); style1.setBorderTop((short) 1);// 邊框的大小 style1.setBorderBottom((short) 1); style1.setBorderLeft((short) 1); style1.setBorderRight((short) 1); //2、生成一個sheet,對應excel的sheet,參數為excel中sheet顯示的名字 HSSFSheet sheet = wb.createSheet("采集對象一致率");//3、設置sheet中每列的寬度,第一個參數為第幾列,0為第一列;第二個參數為列的寬度,可以設置為0。//Test中有三個屬性,因此這里設置三列,第0列設置寬度為0,第1~3列用以存放數據 sheet.setColumnWidth(0, 0); sheet.setColumnWidth(1, 20*256); sheet.setColumnWidth(2, 20*256); sheet.setColumnWidth(3, 20*256);//4、生成sheet中一行,從0開始 HSSFRow row = sheet.createRow(0); row.setHeight((short) 800);// 設定行的高度//5、創建row中的單元格,從0開始 HSSFCell cell = row.createCell(0);//我們第一列設置寬度為0,不會顯示,因此第0個單元格不需要設置樣式 cell = row.createCell(1);//從第1個單元格開始,設置每個單元格樣式 cell.setCellValue("x");//設置單元格中內容 cell.setCellStyle(style1);//設置單元格樣式 cell = row.createCell(2);//第二個單元格 cell.setCellValue("y"); cell.setCellStyle(style1); cell = row.createCell(3);//第三個單元格 cell.setCellValue("value"); cell.setCellStyle(style1); //6、輸入數據 for(int i = 1; i <= list.size(); i++){ cell = row.createCell(i); ……//操作同第5步,通過setCellValue(list.get(i-1).getX())注入數據 …… } //7、如果需要單元格合並,有兩種方式 1、sheet.addMergedRegion(new Region(1,(short)1,1,(short)11));//參數為(第一行,最后一行,第一列,最后一列) 2、sheet.addMergedRegion(new CellRangeAddress(2, 3, 1, 1));//參數為(第一行,最后一行,第一列,最后一列) //8、輸入excel FileOutputStream os = new FileOutputStream(path+"test.xls"); wb.write(os); os.close(); 5、執行完上述操作,excel已經生成在服務器的path目錄下了,文件名為test。 6、將文件發送至客戶端。 注意:在ie瀏覽器下,如果采用location.href='/ServletDownload.do';方式下載,不能在servlet中使用response.getWriter();輸出,而應該用response.getOutputStream(); 否則存在下載后的excel直接在瀏覽器上打開,而不是指定文件路徑后下載。其他瀏覽器未測試過。 服務端代碼 1)、設置響應的頭文件,會自動識別文件內容 response.setContentType("multipart/form-data"); 2)、設置Content-Disposition response.setHeader("Content-Disposition", "attachment;filename=test.xls"); 3)、輸出流 OutputStream out = response.getOutputStream(); 4)、獲取服務端生成的excel文件,這里的path等於4.8中的path InputStream in = new FileInputStream(new File(path)); 5)、輸出文件 int b; while((b=in.read())!=-1){ out.write(b); } in.close(); out.close(); 客戶端代碼 location.href='/ServletDownload';
以下記錄一些poi常用功能(歡迎大家評論補充):
合並行列:
sheet1.addMergedRegion(new Region(sheet1CurrRow,(short)0,sheet1CurrRow,(short)4));//合並(起始行,起始列,結束行,結束列)
sheet為HSSFSheet對象。里面四個參數依次對應合並的:起始行、起始列、結束行、結束列。
例子:如下圖中,數據4占據三列。調用上面方法,參數分別為1,0,1,2。
凍結行列:
sheet1.createFreezePane(0, 4, 0, 4);
sheet1為HSSFSheet對象。里面的四個參數依次對應合並的:要凍結的列數、要凍結的行數、右邊區域可見的左邊列數,下面區域可見的首行。
常用於對表格表頭凍結,下列數據滾動表頭仍保持在上方。
設置編碼格式:
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
設置cell中格式為utf-16.用以應付可能存在的中文亂碼問題。
cell樣式:
HSSFCellStyle style = workbook.createCellStyle();//首先創建一個style
style.setAlignment(align);//水平居左、居右、居中。使用HSSFCellStyle自帶的參數:HSSFCellStyle.ALIGN_CENTER or ALIGN_LEFT or ALIGN_RIGHT
style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居左、居右、居中。使用HSSFCellStyle自帶的參數:HSSFCellStyle.VERTICAL_CENTER or VERTICAL_LEFT or VERTICAL_RIGHT
style.setWrapText(true);//自動換行
HSSFFont hssfFont = workbook.createFont();//創建字體
hssfFont.setFontName(font);//字體樣式:黑體、宋體等
hssfFont.setFontHeightInPoints((short)size);//字體大小,short格式
hssfFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//設置粗體,不需要可不設
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);//設置左邊框
style.setBorderBottom(HSSFCellStyle.BORDER_THIN);//設置下邊框
style.setBorderRight(HSSFCellStyle.BORDER_THIN);//設置右邊框
style.setBorderTop(HSSFCellStyle.BORDER_THIN);//設置上邊框
style.setDataFormat(HSSFDataFormat.getBuiltinFormat("text"));//設置數據格式:文本、貨幣、日期,百分比等
HSSFDataFormat.getBuiltinFormat("(#,##0.00_);[Red](#,##0.00)")//創建數字格式,負數則為紅色顯示。傳入的值必須為double等數字類型
HSSFDataFormat.getBuiltinFormat("text")//創建文本格式
HSSFDataFormat.getBuiltinFormat("yyyy-m-d")//創建日期格式,該方式展示的數據必須轉為String類型,同時制作出來的excel表仍展示為文本類型,需要雙擊數據格才轉為日期格式。建議采用下一種方法。
HSSFDataFormat.getBuiltinFormat("0.00%")//創建百分比格式
//創建日期格式數據,該方法傳入的參數為Date類型,制作excel展示出去即為日期格式。
HSSFDataFormat format= wb.createDataFormat();
style.setDataFormat(format.getFormat("yyyy/m/d"));//括號中參數為指定的日期類型的格式。