用存储过程将excel转置导出

运用存储过程将excel转置导出

下面是存储过程

DELIMITER $$

USE `cstzjusf`$$

DROP PROCEDURE IF EXISTS `getTaskInfo`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `getTaskInfo`(IN Task_id INT)
    READS SQL DATA
BEGIN
SET @sql = NULL;
SET @Task_id = Task_id;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'MAX(IF(cti.Taskinfo_name = ''',
      cti.Taskinfo_name,
      ''', ctu.value, NULL)) AS ''',
      cti.Taskinfo_name, ''''
    )
  ) INTO @sql
FROM cst_task_info cti WHERE cti.Task_id = @Task_id;
SET @sql = CONCAT('Select DISTINCT(ct.Task_id),ct.Task_name,cu.student_id,cu.student_name,', @sql, 
                        ' From cst_taskinfo_user  ctu 
                       LEFT JOIN cst_task ct ON ctu.Task_id = ct.Task_id
    LEFT JOIN cst_task_info cti ON ctu.taskInfo_id = cti.Taskinfo_id
  
    LEFT JOIN cst_users cu ON ctu.user_id = cu.student_id  
                        ');
 
 
 SET @sql = CONCAT(@sql,'Where ct.Task_id = ''',@Task_id,''' ');
 SET @sql = CONCAT(@sql, ' Group by cu.student_id');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
    END$$

DELIMITER ;
在java代码中运用如下,进行调用

 /**
     * 获取数据库连接
     * @return Connection对象
     */
    public Connection getConnection()
    {
        Connection conn = null;   //数据库连接
        try
        {
            Class.forName("com.mysql.jdbc.Driver"); //加载数据库驱动,注册到驱动管理器
            /*数据库链接地址*/
            String url = "jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=UTF-8";
            String username = "root";
            String password = "root";
            /*创建Connection链接*/
            conn = DriverManager.getConnection(url, username, password); 
            
        }
        catch (ClassNotFoundException e){
            
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return conn;  //返回数据库连接
        
    }
    /**
     * 通过存储过程查询数据
     * @return List<Book>
     */
    public List findTaskInfoByTaskId(String TaskId) 
    {
      //  List <CstTaskinfoUserEx> list = new ArrayList<CstTaskinfoUserEx>(); //实例化List对象
    	List list = new ArrayList();
        Connection conn = getConnection();  //创建数据库连接
        try
        {
            //调用存储过程
            CallableStatement cs = conn.prepareCall("{call getTaskInfo(?)}");
            cs.setInt(1, Integer.parseInt(TaskId));
            ResultSet rs = cs.executeQuery(); //执行查询操作,并获取结果集
            ResultSetMetaData md = rs.getMetaData();
            int columnCount = md.getColumnCount();
            while(rs.next())
            {
            	 Map<String,Object> rowData = new HashMap<String,Object>();
            	for(int i = 1; i <= columnCount;i++){
            		rowData.put(md.getColumnName(i), rs.getObject(i));
            	}
            	list.add(rowData);
            }
            
        }catch(Exception e)
        {
            e.printStackTrace();
        }        
        return list;     //返回list
    }
	
	@Override
	public void exportExcel2(String TaskId,
			OutputStream out) {
		HashMap map = new HashMap<>();
		List<String> listOfTitle = new ArrayList<String>();  
		List<String> listOfFinal = new ArrayList<String>();
		listOfTitle.add("任务编号");  
		listOfTitle.add("任务名称");  
		listOfTitle.add("学号");  
		listOfTitle.add("学生姓名");  
		listOfFinal.add("Task_id");
		listOfFinal.add("Task_name");
		listOfFinal.add("student_id");
		listOfFinal.add("student_name");
	//	map.put("queryQarameterSQL", this.setQueryValue(cstTask));

		//List<CstTaskinfoUserEx> list = cstTaskinfoUserMapperEx.selectByExample2(map);
		List<CstTaskinfoUserEx> list = this.findTaskInfoByTaskId(TaskId);
		List listKey = new ArrayList();
		Map mapResult = (Map)list.get(0);
		Set mapKeySet = mapResult.keySet();
		String listHead = "";
		String keyOfListMapKey = "";
		Iterator iteratorKey = mapKeySet.iterator();
		String listValue = "";
		while(iteratorKey.hasNext()){
			listHead = iteratorKey.next()+"";
			listKey.add(listHead);
		}
		for(int i = 0;i < listKey.size();i ++){
			if(!"Task_name".equals(listKey.get(i))&& !"student_name".equals(listKey.get(i)) && !"student_id".equals(listKey.get(i)) && !"Task_id".equals(listKey.get(i))){
				listOfTitle.add((String) listKey.get(i));
				listOfFinal.add((String) listKey.get(i));
			//	listOfFinal.add(list.get(i).);
			}
		//	listOfTitle.add(list.get(i));
		//	listOfFinal.add("value");
		}
		String[] headTitle = listOfTitle.toArray(new String[listOfTitle.size()]);
		String[] finalValue = listOfFinal.toArray(new String[listOfFinal.size()]);
		ExportExcel<CstTaskinfoUserEx> exportExcel = new ExportExcel<CstTaskinfoUserEx>();
		exportExcel.exportExcel1("导出正在进行任务信息", headTitle,finalValue, list, out,"yyyy-MM-dd");
	}
下面是导出函数
/**
    * 这是一个通用的方法,利用了JAVA的反射机制,可以将放置在JAVA集合中并且符号一定条件的数据以EXCEL 的形式输出到指定IO设备上
    *
    * @param title
    *            表格标题名
    * @param headers
    *            表格属性列名数组
    * @param fieldNames
    *			定义需要导出的javabean的属性数组         
    * @param dataset
    *            需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的
    *            javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)
    * @param out
    *            与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中
    * @param pattern
    *            如果有时间数据,设定输出格式。默认为"yyy-MM-dd"
    */
   @SuppressWarnings("unchecked")
   public void exportExcel1(String title, String[] headers,String[] fieldNames,
         List dataset, OutputStream out, String pattern) {
      // 声明一个工作薄
      HSSFWorkbook workbook = new HSSFWorkbook();
      // 生成一个表格
      HSSFSheet sheet = workbook.createSheet(title);
      // 设置表格默认列宽度为15个字节
      sheet.setDefaultColumnWidth((short) 15);
    
      // 生成一个样式
      HSSFCellStyle style = workbook.createCellStyle();
      HSSFFont font3 = workbook.createFont();
      font3.setColor(HSSFColor.BLUE.index);
      // 设置这些样式
      style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);
      style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
      style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
      style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
      style.setBorderRight(HSSFCellStyle.BORDER_THIN);
      style.setBorderTop(HSSFCellStyle.BORDER_THIN);
      style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
      // 生成一个字体
      HSSFFont font = workbook.createFont();
      font.setColor(HSSFColor.VIOLET.index);
      font.setFontHeightInPoints((short) 12);
      font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
      
      // 把字体应用到当前的样式
      style.setFont(font);
      // 生成并设置另一个样式
      HSSFCellStyle style2 = workbook.createCellStyle();
      style2.setFillForegroundColor(HSSFColor.LIGHT_YELLOW.index);
      style2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
      style2.setBorderBottom(HSSFCellStyle.BORDER_THIN);
      style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);
      style2.setBorderRight(HSSFCellStyle.BORDER_THIN);
      style2.setBorderTop(HSSFCellStyle.BORDER_THIN);
      style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);
      style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
      style2.setWrapText(true);//设置自动换行
      // 生成另一个字体
      HSSFFont font2 = workbook.createFont();
      font2.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
      // 把字体应用到当前的样式
      style2.setFont(font2);
     
      // 声明一个画图的顶级管理器
      HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
      // 定义注释的大小和位置,详见文档
      HSSFComment comment = patriarch.createComment(new HSSFClientAnchor(0, 0, 0, 0, (short) 4, 2, (short) 6, 5));
      // 设置注释内容
      comment.setString(new HSSFRichTextString("可以在POI中添加注释!"));
      // 设置注释作者,当鼠标移动到单元格上是可以在状态栏中看到该内容.
      comment.setAuthor("leno");
 
      //产生表格标题行
      HSSFRow row = sheet.createRow(0);
      for (short i = 0; i < headers.length; i++) {
         HSSFCell cell = row.createCell(i);
         
         cell.setCellStyle(style);
         HSSFRichTextString text = new HSSFRichTextString(headers[i]);
         cell.setCellValue(text);
      }
      //遍历集合数据,产生数据行
      Iterator<T> it = dataset.iterator();
      int index = 0;
      int flag = 0;
      int size = dataset.size();
      Map mapResult = null;
      while (it.hasNext()) {
         index++;
        
         row = sheet.createRow(index);
         T t = (T) it.next();
         if(flag<size){
          mapResult = (Map)dataset.get(flag++);
         }
       //  T t = (T) it.next();
         //利用反射,根据javabean属性的先后顺序,动态调用getXxx()方法得到属性值
//         Field[] fields = t.getClass().getDeclaredFields();
         
         for (short i = 0; i < fieldNames.length; i++) {
            HSSFCell cell = row.createCell(i);
            cell.setCellStyle(style2);
//            Field field = fields[i];
           /* String fieldName = fieldNames[i];
            String getMethodName = "get"
                   + fieldName.substring(0, 1).toUpperCase()
                   + fieldName.substring(1);*/
            try {
            	Object value = mapResult.get(fieldNames[i]);
              /*  Class tCls = t.getClass();
                Method getMethod = tCls.getMethod(getMethodName,
                      new Class[] {});
                Object value = getMethod.invoke(t, new Object[] {});*/
                //判断值的类型后进行强制类型转换
                String textValue = null;
//              if (value instanceof Integer) {
//                 int intValue = (Integer) value;
//                 cell.setCellValue(intValue);
//              } else if (value instanceof Float) {
//                 float fValue = (Float) value;
//                 textValue = new HSSFRichTextString(
//                       String.valueOf(fValue));
//                 cell.setCellValue(textValue);
//              } else if (value instanceof Double) {
//                 double dValue = (Double) value;
//                 textValue = new HSSFRichTextString(
//                       String.valueOf(dValue));
//                 cell.setCellValue(textValue);
//              } else if (value instanceof Long) {
//                 long longValue = (Long) value;
//                 cell.setCellValue(longValue);
//              }
                if (value instanceof Boolean) {
                   boolean bValue = (Boolean) value;
                   textValue = "男";
                   if (!bValue) {
                      textValue ="女";
                   }
                } else if (value instanceof Date) {
                   Date date = (Date) value;
                   SimpleDateFormat sdf = new SimpleDateFormat(pattern);
                    textValue = sdf.format(date);
                }  else if (value instanceof byte[]) {
                   // 有图片时,设置行高为60px;
                   row.setHeightInPoints(60);
                   // 设置图片所在列宽度为80px,注意这里单位的一个换算
                   sheet.setColumnWidth(i, (short) (35.7 * 80));
                   // sheet.autoSizeColumn(i);
                   byte[] bsValue = (byte[]) value;
                   HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0,
                         1023, 255, (short) 6, index, (short) 6, index);
                   anchor.setAnchorType(2);
                   patriarch.createPicture(anchor, workbook.addPicture(
                         bsValue, HSSFWorkbook.PICTURE_TYPE_JPEG));
                } else{
                   //其它数据类型都当作字符串简单处理
                   textValue = value == null?"":value.toString();
                }
                //如果不是图片数据,就利用正则表达式判断textValue是否全部由数字组成
                if(textValue!=null){
                   Pattern p = Pattern.compile("^//d+(//.//d+)?$");  
                   Matcher matcher = p.matcher(textValue);
                   if(matcher.matches()){
                      //是数字当作double处理
                      cell.setCellValue(Double.parseDouble(textValue));
                   }else{
                      HSSFRichTextString richString = new HSSFRichTextString(textValue);
                      richString.applyFont(font3);
                      cell.setCellValue(richString);
                   }
                }
            } catch (SecurityException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
           /* } catch (NoSuchMethodException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();*/
            } catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
         /*   } catch (IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();*/
            } finally {
                //清理资源
            }
         }
 
      }
      try {
         workbook.write(out);
      } catch (IOException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }
 
   }



以上

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值