最近在幫人家做一個查詢的功能,需要用到poi導出excel表格,之前一直也沒有用過,不知道是什麼情況,後來在網上找了些資料看下,也就那麼一回事。希望可以給大家一些思路吧。
首先是創建一個sheet,然後再往裏面添加單元格,如果手動輸出過表格的話,原理其實是差不多的。
來一個完整的方法:
- /**
- * 導出excel表
- * @throws IOException
- */
- public void showExcel() throws IOException {
- String [] headers= {"設備編碼","設備種類","設備名稱","所屬總站","品牌","規格型號","提供商","設備價格","用途","出廠編號","責任人","生產日期","採購日期","啓用日期","建檔日期","保修日期","報廢期至","備註"};
- String fileName = exportExcels(headers, ServletActionContext.getRequest());
- HttpServletResponse response=ServletActionContext.getResponse();
- response.setContentType("application/vnd.ms-excel; charset=utf-8");
- response.setHeader("Content-Disposition", "attachment;filename="+fileName);
- byte[] buffered = new byte[1024];
- BufferedInputStream input = new BufferedInputStream(new FileInputStream(ServletActionContext.getRequest().getRealPath("/export")+"/"+fileName));
- DataOutputStream output = new DataOutputStream(response.getOutputStream());
- while (input.read(buffered,0,buffered.length) != -1) {
- output.write(buffered,0,buffered.length);
- }
- input.close();
- output.close();
- }
- /**
- * 創建行
- * @param cells
- * @param rowIndex
- * @param demoSheet
- */
- public static void createTableRow(List<String> cells, short rowIndex, HSSFSheet demoSheet) {
- // 創建第rowIndex行
- HSSFRow row = demoSheet.createRow((short) rowIndex);
- for (short i = 0; i < cells.size(); i++) {
- // 創建第i個單元格
- HSSFCell cell = row.createCell((short) i);
- cell.setCellValue(cells.get(i));
- }
- }
- /**
- * 創建sheet
- * @param tableHeader
- * @return
- */
- public HSSFSheet createExcelSheet(String [] tableHeader,HSSFWorkbook demoWorkBook) {
- List<Device> devices=deviceService.findAllDevices();
- HSSFSheet demoSheet = demoWorkBook.createSheet("devices");
- HSSFHeader header = demoSheet.getHeader();
- header.setCenter("全部設備表");
- HSSFRow headerRow = demoSheet.createRow((short) 0);
- for (int i = 0; i < tableHeader.length; i++) {
- HSSFCell headerCell = headerRow.createCell((short) i);
- headerCell.setCellValue(tableHeader[i]);
- }
- for (int j = 1; j < devices.size(); j++) {
- List<String> list = new ArrayList<String>();
- list.add(devices.get(j).getDev_no()!=null?devices.get(j).getDev_no():"");
- list.add(devices.get(j).getCategory().getCat_name()!=null?devices.get(j).getCategory().getCat_name():"");
- list.add(devices.get(j).getDev_name()!=null?devices.get(j).getDev_name():"");
- list.add(devices.get(j).getDepartment().getDep_name()!=null?devices.get(j).getDepartment().getDep_name():"");
- list.add(devices.get(j).getDev_brand()!=null?devices.get(j).getDev_brand():"");
- list.add(devices.get(j).getDev_spec()!=null?devices.get(j).getDev_spec():"");
- list.add(String.valueOf(devices.get(j).getDev_fac())!=null?String.valueOf(devices.get(j).getDev_fac()):"");
- list.add(String.valueOf(devices.get(j).getDev_price())!=null?String.valueOf(devices.get(j).getDev_price()):"");
- list.add(devices.get(j).getDev_purpose()!=null?devices.get(j).getDev_purpose():"");
- list.add(devices.get(j).getDev_bookid()!=null?devices.get(j).getDev_bookid():"");
- list.add(devices.get(j).getUser().getUser_name()!=null?devices.get(j).getUser().getUser_name():"");//責任人
- list.add(devices.get(j).getDev_protime()!=null?devices.get(j).getDev_protime():"");
- list.add(devices.get(j).getDev_booktime()!=null?devices.get(j).getDev_booktime():"");
- list.add(devices.get(j).getDev_usetime()!=null?devices.get(j).getDev_usetime():"");
- list.add(devices.get(j).getDev_settime()!=null?devices.get(j).getDev_settime():"");
- list.add(devices.get(j).getDev_retime()!=null?devices.get(j).getDev_retime():"");
- list.add(devices.get(j).getDev_dumptime()!=null?devices.get(j).getDev_dumptime():"");
- list.add(devices.get(j).getDev_remark()!=null?devices.get(j).getDev_remark():"");
- createTableRow(list, (short) j,demoSheet);
- }
- return demoSheet;
- }
- /**
- * 輸出
- * @param os
- * @param tableHeader
- * @throws IOException
- */
- public void exportExcel(OutputStream os,String [] tableHeader,HSSFWorkbook demoWorkBook) throws IOException {
- HSSFSheet sheet = createExcelSheet(tableHeader,demoWorkBook);
- sheet.setGridsPrinted(true);
- HSSFFooter footer = sheet.getFooter();
- footer.setRight("Page " + HSSFFooter.page() + " of " + HSSFFooter.numPages());
- demoWorkBook.write(os);
- }
- public String exportExcels(String[] tableHeader,HttpServletRequest request) {
- HSSFWorkbook demoWorkBook = new HSSFWorkbook();
- //SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");
- String fileName="devicess.xls";
- request=ServletActionContext.getRequest();
- FileOutputStream fos = null;
- try {
- fos = new FileOutputStream(request.getRealPath("/export")+"/"+fileName);
- exportExcel(fos,tableHeader,demoWorkBook);
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- try {
- fos.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- return fileName;
- }
這個例子是直接在struts2的action上面實現的。首先是創建一個sheet,在sheet裏面創建第一行作爲表頭,表頭裏面的文字作爲一個字符串數組參數傳出去,可以不停的更換。然後就是創建單元格和往單元格里面放數值,device是我這個例子用到的實體類,這個就不給出來了,實際上隨便放一個字符串或者其他都是可以的。組裝成一個完整的excel表格,那麼就要寫入到項目裏面(這裏文件名是固定的),例子是寫到export這個目錄上面的,然後就是寫個下載的方法去調用就OK了。