`
zheng_liming
  • 浏览: 8401 次
  • 性别: Icon_minigender_1
  • 来自: 湖北宜昌
社区版块
存档分类
最新评论

文件传输之数据导入到excel表(基于java反射原理)

 
阅读更多

       第三部分:数据导入到excel

       数据是由sql语句从数据库查出来的,最初想到的是直接写方法执行sql语句查出数据,然后写入excel,但是由于需要做成通用的公共方法,因此查数据的方法是动态的,无法确定,所以就用到了java的反射机制,首先写好服务层的方法,然后在前台将服务层注入的bean名称,与方法名传给后台,后台利用反射调用取数据,然后写入excel。

       导入excel表需要用到poi的jar包:jar包如下:

              poi-3.9-20121203.jar
              xmlbeans-2.3.0.jar
              poi-ooxml-3.9-20121203.jar
              poi-examples-3.9-20121203.jar
              poi-excelant-3.9-20121203.jar
              poi-ooxml-schemas-3.9-20121203.jar
              poi-scratchpad-3.9-20121203.jar

@Controller
public class FileTransferController extends BaseController{
	
	//临时文件存放目录
	public String tempPath = FileUtil.getProjectPath()+"\\temp\\";
	
	/**
	 * 数据导出到excle表中
	 * @author zheng_liming
	 * @param request
	 * @param response
	 * @return
	 */
	@SuppressWarnings("rawtypes")
	@RequestMapping(value = "/fileTransfer/exportToExcle", method = RequestMethod.POST)
	public void exportToExcle(HttpServletRequest request,HttpServletResponse response) throws Exception{
		DynamicForm dynamicForm =(DynamicForm) PlatformContext.getRequestAttribute(SystemConstants.DYNAMICFORM);
		//反射调用方法
    	List<Map<String, Object>> resultList = reflect(dynamicForm);
		
		String fileType = "xlsx";
		//创建工作文档对象
        Workbook wb = null;
        HSSFFont xlsFont = null;
    	HSSFCellStyle xlsStyle = null;
    	XSSFFont xlsxFont = null;
    	XSSFCellStyle xlsxStyle = null;
        if (fileType.equals("xls")) {
        	wb = new HSSFWorkbook();
        	xlsFont = (HSSFFont) wb.createFont();//字体
        	xlsFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//字体加粗
        	
        	xlsStyle = (HSSFCellStyle) wb.createCellStyle();//样式
        	xlsStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
        	xlsStyle.setFont(xlsFont);//单元格字体
        }else if(fileType.equals("xlsx")){
        	wb = new XSSFWorkbook();
        	xlsxFont = (XSSFFont) wb.createFont();//字体
        	xlsxFont.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);//字体加粗
        	
        	xlsxStyle = (XSSFCellStyle) wb.createCellStyle();//样式
        	xlsxStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);//水平居中
        	xlsxStyle.setFont(xlsxFont);//单元格字体
        }else{
            System.out.println("您的文档格式不正确!");
            return;
        }
        
        //创建sheet对象
        Sheet sheet1 = (Sheet) wb.createSheet("sheet1");
        int headNum = 0;//表头从0开始
        int rowNum = 1;//行数据从1开始
        int totalCellNum = 0;
        //创建表头的行
        Row head = (Row) sheet1.createRow(headNum);
        //循环写入行数据
        for (Map<String, Object> map : resultList) {
        	int cellNum = 0;
        	Row row = (Row) sheet1.createRow(rowNum);
			Iterator it = map.keySet().iterator();
			//循环写入列数据
			while (it.hasNext()) {
				String key = (String) it.next();
				//第一次外循环的时候将表头数据写入
				if(rowNum==1){
					Cell headCell = head.createCell(cellNum);
					headCell.setCellValue(key.equals("rn")?"序号":key);
					//表头样式
					headCell.setCellStyle(xlsStyle==null?xlsxStyle:xlsStyle);
				}
				//将行数据写入
				Cell cell = row.createCell(cellNum);
				cell.setCellValue(map.get(key).toString());
				cellNum = cellNum+1;
			}
			totalCellNum = cellNum;
			rowNum = rowNum+1;
        }
        //自动调整列宽
        for (int i=0;i<totalCellNum;i++) {
			sheet1.autoSizeColumn(i);
        }
        String timeStr = DateUtil.dateToDateString(new Date(),"yyyyMMddHHmmss");
		File file = new File(tempPath);
        if (!file.exists()) {
			file.mkdirs();
        }
        //创建文件流
        OutputStream stream = new FileOutputStream(tempPath+timeStr+"."+fileType);
        //写入文件并保存到工程目录下
        wb.write(stream);
        //关闭文件流
        stream.close();
        //将工程目录下的文件下载到客户端
    	downFile(tempPath,timeStr+"."+fileType);
    	//删除工程目录下文件
    	FileUtil.removeAllFile(tempPath);
    	FileUtil.removeFolder(tempPath);
	}
	
	/**
	 * 将服务器上的文件下载到客户端
	 * @author zheng_liming
	 * @param filePath 文件路径
	 * @param fileName 文件名称
	 */
	public void downFile(String filePath,String fileName) throws Exception{
		FileInputStream fis = new FileInputStream(new File(filePath+fileName));
		//设置响应头和保存文件名
		HttpServletResponse response = getResponse();
		response.setContentType("APPLICATION/OCTET-STREAM");
		response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));
		//写出流信息
		int b = 0;
		PrintWriter out = response.getWriter();
		while((b=fis.read())!=-1) {
			out.write(b);
		}
		//关闭
		fis.close();
		out.close();
	}
	
	/**
	 * 反射调用类方法
	 * @author zheng_liming
	 * @param className 类名
	 * @param methodName 方法名
	 * @return List<Map<String, Object>> 调用的方法返回值
	 */
	@SuppressWarnings("unchecked")
	public List<Map<String, Object>> reflect(DynamicForm dynamicForm) throws Exception{
		String className = dynamicForm.getString("className");
		String methodName = dynamicForm.getString("methodName");
		//初始化
		MethodInvoker methodInvoker = new MethodInvoker();
		methodInvoker.setTargetObject(SpringContext.getBean(className));
		methodInvoker.setTargetMethod(methodName);
		//设置参数
		methodInvoker.setArguments(new Object[]{dynamicForm});
		//准备方法
		methodInvoker.prepare();
		Object result = methodInvoker.invoke();
		Map<String, Object> resultMap = (Map<String, Object>) result;
		List<Map<String, Object>> resultList = (List<Map<String, Object>>) resultMap.get("rows");
		return resultList;
	}
}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics