天天看點

JAVA整合Flex導出資料庫中的資料 (續)

根據上一章的介紹,如果有新的需求來了怎麼辦,比如說要從伺服器端的檔案中寫,然後輸出至用戶端呢,沒關系。其實也思路明白啦,也很簡單,如下所示:

1. 在伺服器中組裝資料

1.1 組裝Excel的包裝類,如下所示:

package cn.ac.iscas.gz.sems.web.common.dataimport;

import java.io.FileInputStream;
import java.io.InputStream;

import javax.servlet.http.HttpServletResponse;

import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;

/**
 * Excel操作類(職責:組裝資料,設定樣式等)
 * 2013-08-22
 */
public class ExcelFileAssembly {
	
  /** 使用單例模式 **/
  public static ExcelFileAssembly excelFileAssembly = new ExcelFileAssembly();
  
  public static ExcelFileAssembly getInstance(){
	  if(excelFileAssembly == null){
		  excelFileAssembly = new ExcelFileAssembly();
	  }
	  return excelFileAssembly;
  }
  
/**
 * 組裝資料至excel檔案中
 * @param path
 * @param filename
 * @param response
 * @param sample_data
 * @throws Exception
 */
  public  void assembleData(String path, String filename, HttpServletResponse response,
		  					Object[][] sample_data) throws Exception {
	  
	  InputStream inputStream = new FileInputStream(path + filename);
	  
	  //從流中得到Workbook
	  Workbook wb = WorkbookFactory.create(inputStream);
	  
	  //得到第一個sheet
	  Sheet sheet = wb.getSheetAt(0);

      //設定資料
      for (int i = 0; i < sample_data.length; i++) {
          Row row = sheet.getRow(1 + i);
          for (int j = 0; j < sample_data[i].length; j++) {
              if(sample_data[i][j] == null) continue;

              if(sample_data[i][j] instanceof String) {
                  row.getCell(j).setCellValue((String)sample_data[i][j]);
              } else if(sample_data[i][j] instanceof Double){
                  row.getCell(j).setCellValue((Double)sample_data[i][j]);
              }else if(sample_data[i][j] instanceof Long){
                  row.getCell(j).setCellValue((Long)sample_data[i][j]);
              }else if(sample_data[i][j] instanceof Integer){
                  row.getCell(j).setCellValue((Integer)sample_data[i][j]);
              }
          }
      }

      // Write the output to a response object
      wb.write(response.getOutputStream());
  }

}
           

1.2 輸出至controller層,其隻要是以流的形式,發送至用戶端,它的部分代碼,如下所示:

@RequestMapping(params ="action=exportExcel", method = {RequestMethod.GET, RequestMethod.POST, RequestMethod.HEAD})
    public void excel(HttpServletRequest request, HttpServletResponse response)  throws Exception{
		 String filename = "節點控制器";	 
		 String isTemplate = request.getParameter("isTemplate");
		 int isTemplateNum = Integer.parseInt(isTemplate);
		 
		 String concentUID = request.getParameter("concentUID");
		 String groupMaintainId = request.getParameter("groupMaintainId");

		 Object[][] nodeDevice_datas = {{}};
		
		 
		try{
			List<NodeDevice> nodeDeviceList;
			 if(isTemplateNum == SemsConstants.IS_TEMPLEATE){
				 filename = "節點控制器資料導入模闆.xls";
			 }
			 if(isTemplateNum == SemsConstants.IS_NOT_TEMPLEATE){
				if(("0").equals(groupMaintainId)){
					nodeDeviceList = nodeDeviceService.findAllNodeDeviceByConcentUid(concentUID);
					filename += "("  + concentUID + ")" +".xls";
				}else{
					Long groupId = Long.parseLong(groupMaintainId);
				   nodeDeviceList = nodeDeviceService.findAllNodeDeviceByGroupMaintainId(groupId);
				   GroupMaintainEntity entity = groupMaintainService.get(GroupMaintainEntity.class, groupId);
				   filename += "("  + entity.getName() + ")" + ".xls";
				}
			
				 if(nodeDeviceList != null){
					 nodeDevice_datas = new Object[nodeDeviceList.size()][];
					//包裝資料
					for (int i = 0 ; i < nodeDeviceList.size(); i++){
						NodeDevice nodeDevice = nodeDeviceList.get(i);
						Object [] itemObject = {String.valueOf(i+1), nodeDevice.getUid(), nodeDevice.getName(),
								  Integer.parseInt(nodeDevice.getType()),  Double.parseDouble(nodeDevice.getLongitude()),
								  Double.parseDouble(nodeDevice.getLatitude()),
								  nodeDevice.getLocationDesc(), nodeDevice.getRemark()
						}; 
						nodeDevice_datas[i] = itemObject;
					}
			     }
			}
			 
			 //設定輸出的檔案名稱,支援中文
			 HttpWebUtil.responseExportExcelConfig(response, filename);
			 
			 //讀取其路徑
			 String nodeDevicePath = servletContext.getRealPath("/") + "flex4\\tpl\\" ;
			 
			 
			  //導出資料至Excel表格中
			  ExcelFileAssembly.getInstance().assembleData(
					   nodeDevicePath,"節點控制器資料導入模闆.xls",
					   response, 
					   nodeDevice_datas);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
           

1.3.用戶端的代碼無變化,如果要輸出至本頁面,可以将其改成

/**
			 * 模闆下載下傳
			 **/ 
			protected function templeateButton_clickHandler(event:MouseEvent):void
			{
				var url:String = getFileAddress(areaSelecter.selectedItem.id, concSelecter.selectedItem.label, groupSelecter.selectedItem.id, 1);
				var u:URLRequest = new URLRequest(url);
				
				u.method = URLRequestMethod.POST;
				navigateToURL(u,"_self");
			}
           

(完,待續...............................)

繼續閱讀