`
dtt3401885
  • 浏览: 17178 次
文章分类
社区版块
存档分类
最新评论
收藏列表
标题 标签 来源
邮件收发
package org.davidfang.mail;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;
import javax.mail.BodyPart;
import javax.mail.Flags;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Part;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.URLName;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;
public class ReciveMail {
    
    private MimeMessage msg = null;
    private String saveAttchPath = "";
    private StringBuffer bodytext = new StringBuffer();
    private String dateformate = "yy-MM-dd HH:mm";
    
    public ReciveMail(MimeMessage msg){
        this.msg = msg;
        }
    public void setMsg(MimeMessage msg) {
        this.msg = msg;
    }
    
    /**
     * 获取发送邮件者信息
     * @return
     * @throws MessagingException
     */
    public String getFrom() throws MessagingException{
        InternetAddress[] address = (InternetAddress[]) msg.getFrom();
        String from = address[0].getAddress();
        if(from == null){
            from = "";
        }
        String personal = address[0].getPersonal();
        if(personal == null){
            personal = "";
        }
        String fromaddr = personal +"<"+from+">";
        return fromaddr;
    }
    
    /**
     * 获取邮件收件人,抄送,密送的地址和信息。根据所传递的参数不同 "to"-->收件人,"cc"-->抄送人地址,"bcc"-->密送地址
     * @param type
     * @return
     * @throws MessagingException
     * @throws UnsupportedEncodingException
     */
    public String getMailAddress(String type) throws MessagingException, UnsupportedEncodingException{
        String mailaddr = "";
        String addrType = type.toUpperCase();
        InternetAddress[] address = null;
        
        if(addrType.equals("TO")||addrType.equals("CC")||addrType.equals("BCC")){
            if(addrType.equals("TO")){
                address = (InternetAddress[]) msg.getRecipients(Message.RecipientType.TO);
            }
            if(addrType.equals("CC")){
                address = (InternetAddress[]) msg.getRecipients(Message.RecipientType.CC);
            }
            if(addrType.equals("BCC")){
                address = (InternetAddress[]) msg.getRecipients(Message.RecipientType.BCC);
            }
            
            if(address != null){
                for(int i=0;i<address.length;i++){
                    String mail = address[i].getAddress();
                    if(mail == null){
                        mail = "";
                    }else{
                        mail = MimeUtility.decodeText(mail);
                    }
                    String personal = address[i].getPersonal();
                    if(personal == null){
                        personal = "";
                    }else{
                        personal = MimeUtility.decodeText(personal);
                    }
                    String compositeto = personal +"<"+mail+">";
                    mailaddr += ","+compositeto; 
                }
                mailaddr = mailaddr.substring(1);
            }
        }else{
            throw new RuntimeException("Error email Type!");
        }
        return mailaddr;
    }
    
    /**
     * 获取邮件主题
     * @return
     * @throws UnsupportedEncodingException
     * @throws MessagingException
     */
    public String getSubject() throws UnsupportedEncodingException, MessagingException{
        String subject = "";
        subject = MimeUtility.decodeText(msg.getSubject());
        if(subject == null){
            subject = "";
        }
        return subject;
    }
    
    /**
     * 获取邮件发送日期
     * @return
     * @throws MessagingException
     */
    public String getSendDate() throws MessagingException{
        Date sendDate = msg.getSentDate();
        SimpleDateFormat smd = new SimpleDateFormat(dateformate);
        return smd.format(sendDate);
    }
    
    /**
     * 获取邮件正文内容
     * @return
     */
    public String getBodyText(){
        
        return bodytext.toString();
    }
    
    /**
     * 解析邮件,将得到的邮件内容保存到一个stringBuffer对象中,解析邮件 主要根据MimeType的不同执行不同的操作,一步一步的解析
     * @param part
     * @throws MessagingException
     * @throws IOException
     */
    public void getMailContent(Part part) throws MessagingException, IOException{
        
        String contentType = part.getContentType();
        int nameindex = contentType.indexOf("name");
        boolean conname = false;
        if(nameindex != -1){
            conname = true;
        }
        System.out.println("CONTENTTYPE:"+contentType);
        if(part.isMimeType("text/plain")&&!conname){
            bodytext.append((String)part.getContent());
        }else if(part.isMimeType("text/html")&&!conname){
            bodytext.append((String)part.getContent());
        }else if(part.isMimeType("multipart/*")){
            Multipart multipart = (Multipart) part.getContent();
            int count = multipart.getCount();
            for(int i=0;i<count;i++){
                getMailContent(multipart.getBodyPart(i));
            }
        }else if(part.isMimeType("message/rfc822")){
            getMailContent((Part) part.getContent()); 
        }
        
    }
    
    /**
     * 判断邮件是否需要回执,如需回执返回true,否则返回false
     * @return
     * @throws MessagingException
     */
    public boolean getReplySign() throws MessagingException{
        boolean replySign = false;
        String needreply[] = msg.getHeader("Disposition-Notification-TO");
        if(needreply != null){
            replySign = true;
        }
        return replySign;
    }
    
    /**
     * 获取此邮件的message-id
     * @return
     * @throws MessagingException
     */
    public String getMessageId() throws MessagingException{
        return msg.getMessageID();
    }
    
    /**
     * 判断此邮件是否已读,如果未读则返回false,已读返回true
     * @return
     * @throws MessagingException
     */
    public boolean isNew() throws MessagingException{
        boolean isnew = false;
        Flags flags = ((Message)msg).getFlags();
        Flags.Flag[] flag = flags.getSystemFlags();
        System.out.println("flags's length:"+flag.length);
        for(int i=0;i<flag.length;i++){
            if(flag[i]==Flags.Flag.SEEN){
                isnew = true;
                System.out.println("seen message .......");
                break;
            }
        }
        
        return isnew;
    }
    
    /**
     * 判断是是否包含附件
     * @param part
     * @return
     * @throws MessagingException
     * @throws IOException
     */
    public boolean isContainAttch(Part part) throws MessagingException, IOException{
        boolean flag = false;
        
        String contentType = part.getContentType();
        if(part.isMimeType("multipart/*")){
            Multipart multipart = (Multipart) part.getContent();
            int count = multipart.getCount();
            for(int i=0;i<count;i++){
                BodyPart bodypart = multipart.getBodyPart(i);
                String dispostion = bodypart.getDisposition();
                if((dispostion != null)&&(dispostion.equals(Part.ATTACHMENT)||dispostion.equals(Part.INLINE))){
                    flag = true;
                }else if(bodypart.isMimeType("multipart/*")){
                    flag = isContainAttch(bodypart);
                }else{
                    String conType = bodypart.getContentType();
                    if(conType.toLowerCase().indexOf("appliaction")!=-1){
                        flag = true;
                    }
                    if(conType.toLowerCase().indexOf("name")!=-1){
                        flag = true;
                    }
                }
            }
        }else if(part.isMimeType("message/rfc822")){
            flag = isContainAttch((Part) part.getContent());
        }
        
        return flag;
    }
    
    /**
     * 保存附件
     * @param part
     * @throws MessagingException
     * @throws IOException
     */
    public void saveAttchMent(Part part) throws MessagingException, IOException{
        String filename = "";
        if(part.isMimeType("multipart/*")){
            Multipart mp = (Multipart) part.getContent();
            for(int i=0;i<mp.getCount();i++){
                BodyPart mpart = mp.getBodyPart(i);
                String dispostion = mpart.getDisposition();
                if((dispostion != null)&&(dispostion.equals(Part.ATTACHMENT)||dispostion.equals(Part.INLINE))){
                    filename = mpart.getFileName();
                    if(filename.toLowerCase().indexOf("gb2312")!=-1){
                        filename = MimeUtility.decodeText(filename);
                    }
                    saveFile(filename,mpart.getInputStream());
                }else if(mpart.isMimeType("multipart/*")){
                    saveAttchMent(mpart);
                }else{
                    filename = mpart.getFileName();
                    if(filename != null&&(filename.toLowerCase().indexOf("gb2312")!=-1)){
                        filename = MimeUtility.decodeText(filename);
                    }
                    saveFile(filename,mpart.getInputStream());
                }
            }
            
        }else if(part.isMimeType("message/rfc822")){
            saveAttchMent((Part) part.getContent());
        }
    }
    /**
     * 获得保存附件的地址
     * @return
     */
    public String getSaveAttchPath() {
        return saveAttchPath;
    }
    /**
     * 设置保存附件地址
     * @param saveAttchPath
     */
    public void setSaveAttchPath(String saveAttchPath) {
        this.saveAttchPath = saveAttchPath;
    }
    /**
     * 设置日期格式
     * @param dateformate
     */
    public void setDateformate(String dateformate) {
        this.dateformate = dateformate;
    }
    /**
     * 保存文件内容
     * @param filename
     * @param inputStream
     * @throws IOException
     */
    private void saveFile(String filename, InputStream inputStream) throws IOException {
        String osname = System.getProperty("os.name");
        String storedir = getSaveAttchPath();
        String sepatror = "";
        if(osname == null){
            osname = "";
        }
        
        if(osname.toLowerCase().indexOf("win")!=-1){
            sepatror = "//";
            if(storedir==null||"".equals(storedir)){
                storedir = "d://temp";
            }
        }else{
            sepatror = "/";
            storedir = "/temp";
        }
        
        File storefile = new File(storedir+sepatror+filename);
        System.out.println("storefile's path:"+storefile.toString());
        
        BufferedOutputStream bos = null;
        BufferedInputStream bis = null;
        
        try {
            bos = new BufferedOutputStream(new FileOutputStream(storefile));
            bis = new BufferedInputStream(inputStream);
            int c;
            while((c= bis.read())!=-1){
                bos.write(c);
                bos.flush();
            }
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            bos.close();
            bis.close();
        }
        
    }
    
    public void recive(Part part,int i) throws MessagingException, IOException{
        System.out.println("------------------START-----------------------");
        System.out.println("Message"+i+" subject:" + getSubject());
        System.out.println("Message"+i+" from:" + getFrom());
        System.out.println("Message"+i+" isNew:" + isNew());
        boolean flag = isContainAttch(part);
        System.out.println("Message"+i+" isContainAttch:" +flag);
        System.out.println("Message"+i+" replySign:" + getReplySign());
        getMailContent(part);
        System.out.println("Message"+i+" content:" + getBodyText());
        setSaveAttchPath("c://temp//"+i);
        if(flag){
            saveAttchMent(part);
        }
        System.out.println("------------------END-----------------------");
    }
    
    
    public static void main(String[] args) throws MessagingException, IOException {
        Properties props = new Properties();
        props.setProperty("mail.smtp.host", "smtp.sina.com");
        props.setProperty("mail.smtp.auth", "true");
        Session session = Session.getDefaultInstance(props,null);
        URLName urlname = new URLName("pop3","pop.qq.com",110,null,"715881036","kingsoft");
        
        Store store = session.getStore(urlname);
        store.connect();
        Folder folder = store.getFolder("INBOX");
        folder.open(Folder.READ_ONLY);
        Message msgs[] = folder.getMessages();
        int count = msgs.length;
        System.out.println("Message Count:"+count);
        ReciveMail rm = null;
        for(int i=0;i<count;i++){
            rm = new ReciveMail((MimeMessage) msgs[i]);
            rm.recive(msgs[i],i);;
        }
        
        
    }
    
}
java
大小写转换:
String str=asdHJHSJH
//转换大写
 String aa=str.toUpperCase()
System.out.println aa
ASDHJHSJH
//转换小写
String bb=str.toLowerCase()
去除字符中的空格
String cc=str.replace('\\s','');
省市县三级联查
 页面:
<tr>
         
          <select id="province" onchange="findCity()">
     <option value="0">----选择省份----</option>
     <g:each in="${pp}" var="p">
      <option value="${p.ID }">${p.NAME }</option>
    </g:each>
    </select>
    <select id="city" onchange="findDistrict()">
     <option value="0">----选择城市----</option>
    </select>
    <select id="district">
     <option value="0">----选择县区----</option>
    </select>
       </tr>
 js:
function findCity(){
            $("#city").empty();
            $("#city").append("<option value='0'>---选择城市1---</option>")
            $("#district").empty();
            $("#district").append("<option value='0'>---选择市县1---</option>")
             $.ajax({
                 type:"post",
                 url:"${request.getContextPath()}/names/province",
                 data: "op=district&pid="+$("#city").val(), 
                 dataType: "json",   
                 success:function (data){
              var arr=data;
              var options = "";
                     for (var i = 0; i< arr.length; i++){
                    	
                         options+='<option value="'+arr[i].CID+'">'+arr[i].CNAME+'</option>';
                         }
                     $("#city").append(options);
                       }
                      });
       	            }
		function findDistrict(){
			$("#district").empty();
            $("#district").append("<option value='0'>---选择市县2---</option>")
            $.ajax({
             type:"post",
             url:"${request.getContextPath()}/names/province1",
             data: "op=findCity&pid="+$("#province").val(), 
             dataType: "json",
             success:function (data){
              var ayy=data;
              var options="";
              for (var i = 0; i< ayy.length; i++){
              	
                  options+='<option value="'+ayy[i].CID+'">'+ayy[i].CNAME+'</option>';
                  }
              $("#district").append(options);
                 }

                })

			}	 

控制器:
private List Sql_total(String sqlStatement){
		def resultSet
		if(sqlStatement){
		 Sql sql = new Sql(dataSource)
		resultSet=sql.rows(sqlStatement)
		}
		return  resultSet
	   }
def province={
		
		def sql="select t.name cname ,t.id cid from CITIES t  where t.parent_id=2"
		def pp= Sql_total(sql)

		render pp as JSON
	}
	def province1={
		
		def sql="select t.name cname ,t.id cid from CITIES t  where t.parent_id=2"
		def pp= Sql_total(sql)

		render pp as JSON
	}
java冒泡法 按顺序排序数字
def aa=[0,11,9,8,7,45,20,1444,14,10,10,10,12]
			def tem
			for(int i=0;i<aa.size();i++){
				
				for(int j=aa.size()-1;j>i;--j){
				
					if(aa[j]<aa[j-1]){
						tem=aa[j]
						aa[j]=aa[j-1]
						aa[j-1]=tem
					}
				}
			}
页面引入饼状图柱状图
首先引入js:
       <script src="${resource(dir:'fusionCharts', file:'FusionCharts.js') }"></script>
页面中柱状图div:
<div id="chartXml1" ></div>
柱状图js代码:
<script type="text/javascript">
						var myChart = new FusionCharts("${request.getContextPath()}/fusionCharts/Column3D.swf","myChartId2" ,"100%", "280", "0", "1" );//SWF为SWF文件的url、ID为用以表示该对象。
	            		 		myChart.setDataXML("${chartXml}");//引入XML文件、、
	           		 			myChart.render("chartXml1");//显示到页面的div中
					</script>
 页面饼状图div:
<div id="chartXml" ></div>
饼状图JS代码:
<script type="text/javascript">
						var myChart = new FusionCharts("${request.getContextPath()}/fusionCharts/Pie3D.swf","myChartId3" ,"100%", "280", "0", "1" );
	            		 		myChart.setDataXML("${chartXml}");
	           		 			myChart.render("chartXml");
				   </script>
				    </td>
传回的XML代码:
			def chartXml ="<chart baseFontSize='14' caption='\u90E8\u95E8\u8D44\u4EA7\u7EDF\u8BA1' >"//设置图形上边的标题
			  chartXml+="<set label='"+名称+"'  value='"+数量+"'link='${request.getContextPath()}/assetBasic/assetDepart?id="+depart[i].id+"' />"
//link为超连接。可选。
chartXml+="</chart>"
导入excel
def ufile = FileUploadUtil.upload(request, "batchfile")
			def out = 0
			def j = 0
			def failDevice = ''
				try{
					def wb = Workbook.getWorkbook(ufile.file)
					def sheet = wb.getSheet(0)
					def rows = sheet.getRows()
					
					for (int i = 1; i < rows; i++){
						def serverfaults=new ServerFaults()
						def cell = sheet.getRow(i)
						if(cell[0].getContents()!=null&&cell[0].getContents()!=""){
							def report1=cell[0].getContents()
							
							def report2=U.findByUserRealName(report1)
							serverfaults.reporter=report2
							serverfaults.type=cell[1].getContents()
							serverfaults.describe=cell[2].getContents()
							serverfaults.record=cell[3].getContents()
							serverfaults.satus=cell[4].getContents()
							
							serverfaults.createtime=new SimpleDateFormat("yyyy/MM/dd").parse(cell[5].getContents())//转换月份
						
							serverfaults.save()
							
						}
						
						
					}
					
					wb.close()
}catch(Exception e){
e.printStackTrace()
				}
Dhtml 中的分布显示
首先还是先引入JS:
		<link rel="stylesheet" type="text/css" href="${request.getContextPath() }/js/dhtmlxLayout/skins/dhtmlxlayout_dhx_web.css">
//背景皮肤样式
		<script  src="${request.getContextPath() }/js/dhtmlxLayout/dhtmlxcommon.js"></script>
<script  src="${request.getContextPath() }/js/dhtmlxLayout/dhtmlxcommon.js"></script>
		<g:include view="/dhtmlxWin.gsp"/>
		<script src="${request.getContextPath() }/js/dhtmlxLayout/dhtmlxlayout.js"></script>
		<script src="${request.getContextPath() }/js/dhtmlxLayout/dhtmlxcontainer.js"></script>
JS代码:
<script type="text/javascript">
        	var  webBar,dhxLayout,dhxLayout2,tree,postionTree,tabbar,toolbar2,dhxToolbar1,attachGrid1,dhxToolbar2,roleTree,attachtreea2,attachtreea3,attachtreea3,win,dhxWins= new dhtmlXWindows(),dhxLayoutfora3,postionTree3,toolbar3;
        	
        	dhxLayout = new dhtmlXLayoutObject(document.body, "3j","dhx_blue");//设置界面分块
        	dhxLayout.setSkin("dhx_web");//设置背景皮肤
        	 dhxLayout.cells("a").setHeight(60);//设置“a”快的高
        
        	 dhxLayout.cells("a").setText("组织机构");//给"a"的标头设置标题
        	 //dhxLayout.cells("a").collapse();//默认"a"合并
        	 dhxLayout.cells("a").attachObject("objId");//在"a"中取页面id="objId"的div 
        	 dhxLayout.setCollapsedText("a", "Main Page");//理论上合并"a"后显示的字段,但是没显示
            dhxLayout.cells("c").setWidth(300);//给"c"设置宽
        	dhxLayout.cells("c").setText("组织机构");
        	dhxLayout.cells("c").fixSize(true,true);
        	dhxLayout.cells("c").hideHeader();//设置“c”的标头隐藏
        	tree = dhxLayout.cells("c").attachTree();//在“c”中附加一个树形结构

        	var a=$("#company").val()//取得页面中DIV id=company的value属性。
        	tree.setImagePath("${request.getContextPath()}/js/dhtmlxTree/imgs/");
        //加入树形结构的图片样式
        	
       
        	setProgress(tree,"c");   
               	
        	tree.loadXML("${request.getContextPath()}/department/departmentTree/?company="+a+"&&" + new Date().valueOf());//加入树形结构的XML地址。
        	tree.attachEvent("onClick",function(id){
            	var selectedItem = tabbar.getActiveTab();//获得当前活动标签的引用

            	if(selectedItem=="a1"){
            		attachGrid1.clearAndLoad("${request.getContextPath()}/department/showdepartment/"+id);
                }else if(selectedItem=="a2"){   
                	attachtreea2.deleteChildItems(0);//删除所有子节点
                	attachtreea2.loadXML("${request.getContextPath()}/department/showusers/"+id+"?level="+tree.getLevel(tree.getSelectedItemId()));
                }else if(selectedItem=="a4"){ 
                    if(isDepartment()){
                    	postionTree.deleteChildItems(0);
                    	var selectedItem = tree.getSelectedItemId()//返回选定项id
                    	postionTree.loadXML("${request.getContextPath()}/department/showposition/"+selectedItem+"?r=" + new Date().valueOf());
                    } 
                }else if(selectedItem=="a3"){
                    var selectedItem = tree.getSelectedItemId()
                    if(tree.getLevel(selectedItem)==1){ 
                    	postionTree3.deleteChildItems(0);
                    	postionTree3.loadXML("${request.getContextPath()}/department/showallposition/"+selectedItem+"?r=" + new Date().valueOf());
                    }
                }else{
					alert(selectedItme);
                } 
    	    });               
        	function setProgress(src, itemId){
    			if(dhxLayout != null){
    				src.attachEvent("onXLS", function(tree,id){dhxLayout.cells(itemId).progressOn()});
    				src.attachEvent("onXLE", function(tree,id){dhxLayout.cells(itemId).progressOff()});
    			}     
    		} 
 
        	tabbar = dhxLayout.cells("b").attachTabbar();//在“C”中加入
    		tabbar.setImagePath("${request.getContextPath() }/js/dhtmlxtabbar/imgs/");
			
        	tabbar.addTab("a1","部门管理","100px");
    		tabbar.setTabActive("a1"); 
    		
            tabbar.addTab("a2","部门人员管理","100px");
            tabbar.addTab("a3","职位管理","100px");
            tabbar.addTab("a4","职位人员管理","100px");

            
            //tab1
            dhxToolbar1 = tabbar.cells("a1").attachToolbar();
            dhxToolbar1.setIconsPath("${request.getContextPath()}/resources/toolbarXml/icons/");
            dhxToolbar1.loadXML("${request.getContextPath() }/resources/toolbarXml/departmenttoolbar.xml?rt=" + new Date().valueOf());
            dhxToolbar1.attachEvent("onClick",function(id){
            	toAction(id);
    	    });

            attachGrid1 = tabbar.cells("a1").attachGrid();
            attachGrid1.setImagePath("${request.getContextPath()}/js/dhtmlxGrid/skins/");
            attachGrid1.enableEditEvents(false,false,false);
            attachGrid1.setHeader(",");
            attachGrid1.setInitWidths("100,*");  
            attachGrid1.init();

            function toAction(id){
				if(id=="newCompany"){
					createWin(id,"新增公司",600,600,"${request.getContextPath()}/company/create")
				} 

				if(id=="newDepartment"){
					if(tree.getSelectedItemId() != 0 && tree.getSelectedItemId() != ""){
						createWin(id,"新增部门",600,245,"${request.getContextPath()}/department/createByAdmin/") 
					}else{  
						alert("请选择一个公司或者一个部门!");
					}  			 		
				}
				
				if(id=="editDepartment"){ 
					if(tree.getSelectedItemId() != 0 && tree.getSelectedItemId() != ""){
						if(tree.getLevel(tree.getSelectedItemId())==1){ 
							alert("您选择的是公司,请选择一个部门!");
						}else{
							createWin(id,"编辑部门",600,245,"${request.getContextPath()}/department/createByAdmin/"+tree.getSelectedItemId())
						}
					}else{
						alert("请选择一个部门(从第二级开始)!");
					}   					
				}
				if(id=="deleDepartment"){
					if(tree.getSelectedItemId() != 0 && tree.getSelectedItemId() != ""){
						if(tree.getLevel(tree.getSelectedItemId())==1){ 
							alert("您选择的是公司,请选择一个部门!");
						}else{
							var params = new Object();
		                    params["id"] = tree.getSelectedItemId();
		                    if(confirm("你确定要删除吗?")){
			                    jQuery.post("${request.getContextPath()}/department/deleteById", params, function(data){
			    					if(data.result == true){
			    						alert("删除成功!");       
			    						tree.deleteItem(tree.getSelectedItemId(),false);
			    					}else{
			    						alert("删除失败!");
			    					}
			    				}, "json"); 
		                    }
						}	
	                }else{
	                	alert("请选择一个部门(从第二级开始)!");
	                }
				}     

				if(id=='refreshDepartment'){ 
					setProgress(tree, "a"); 
	    			tree.deleteChildItems(0);
	    			tree.loadXML("${request.getContextPath()}/department/departmentTree?" + new Date().valueOf());
				}

				if(id=="updateUser"){
					if(attachtreea2.getAllChecked()==''||attachtreea2.getAllChecked()==null){
						alert("请至少选择一个人员!");
					}else{
						if(isDepartment()){  
							if(confirm("你确定要更新吗?")){
								var params = new Object();
			                    params["departmentId"] = tree.getSelectedItemId();
			                    params["person"] = attachtreea2.getAllChecked();
				                jQuery.post("${request.getContextPath()}/department/updateUser", params, function(data){
				    				if(data.result == true){
				    					alert("更新成功!");       
				    					//tree.deleteItem(tree.getSelectedItemId(),false);
				    				}else{
				    					alert("更新失败!");
				    				}
				    			}, "json");
							} 
						}
					}
				}

				if(id=='createUser'){
					if(isDepartment()){
						createWin(id,"新增人员",600,600,"${request.getContextPath()}/u/create");
					}
				} 

				if(id=='newPosition'){
					if(isDepartment()){
						var dId = tree.getSelectedItemId();
						var pId = postionTree3.getSelectedItemId();
						createWin(id,"新增职位",600,245,"${request.getContextPath()}/position/createForWin")
					} 
				}

				if(id=='editPosition'){
					if(postionTree3.getSelectedItemId() != 0 && postionTree3.getSelectedItemId() != ""){
						createWin(id,"编辑职位",600,245,"${request.getContextPath()}/position/createForWin/"+postionTree3.getSelectedItemId())
					}else{
						alert("请选择一个职位!");
					}
				}

				if(id=='refreshPosition'){
					if(attachtreea3.getAllChecked()==''||attachtreea3.getAllChecked()==null){
						alert("请至少选择一个人员!");
					}else{
							if(confirm("你确定要更新吗?")){
								var params = new Object();
			                    params["positionId"] = postionTree.getSelectedItemId(); 
			                    params["person"] = attachtreea3.getAllChecked();
				                jQuery.post("${request.getContextPath()}/department/updateUser2", params, function(data){
				    				if(data.result == true){
				    					alert("更新成功!");       
				    					//tree.deleteItem(tree.getSelectedItemId(),false);
				    				}else{
				    					alert("更新失败!");
				    				}
				    			}, "json");
							} 
					}
				}

				if(id=='delePosition'){
					if(postionTree3.getSelectedItemId() != 0 && postionTree3.getSelectedItemId() != ""){
							var params = new Object();
		                    params["id"] = postionTree3.getSelectedItemId();
		                    if(confirm("你确定要删除吗?")){
			                    jQuery.post("${request.getContextPath()}/position/deleteById2", params, function(data){
			    					if(data.result == true){
			    						alert("删除成功!");     
			    						postionTree3.deleteItem(postionTree3.getSelectedItemId(),false);
			    					}else{     
			    						alert("删除失败!");
			    					}
			    				}, "json"); 
		                    }
	                }else{
	                	alert("请选择一个部门(从第二级开始)!");
	                }
				}
				if(id=="updateRole"){
					if(roleTree.getAllChecked()==''||roleTree.getAllChecked()==null){
						alert("请至少选择一个角色!");
					}else{
							if(confirm("你确定要更新吗?")){
								var params = new Object();
			                    params["positionId"] = postionTree3.getSelectedItemId(); 
			                    params["roles"] = roleTree.getAllChecked();
				                jQuery.post("${request.getContextPath()}/position/updaterole", params, function(data){
				    				if(data.result == true){
				    					alert("更新成功!");
				    					//tree.deleteItem(tree.getSelectedItemId(),false);
				    				}else{
				    					alert("更新失败!");
				    				}
				    			}, "json");
							} 
					}
				}
            }

            function isDepartment(){
                var islabel = true;
            	if(tree.getLevel(tree.getSelectedItemId())==1){
					alert("您选择的是公司,请选择一个部门!");
					islabel = false;
				}
				return islabel;
            }
            function isCompany(){
                var islabel = true;
            	if(tree.getLevel(tree.getSelectedItemId())!=1){ 
					alert("您选择的是部门,请选择一个公司!");
					islabel = false;
				}
				return islabel;
            }	
            dhxWins.setSkin('dhx_black');
            function createWin(id, title, width, height, url){
            	win = dhxWins.createWindow(id, 0,0, width, height);
            	dhxWins.window(id).keepInViewport(true);
            	dhxWins.window(id).denyPark();
            	dhxWins.window(id).setModal(true);
            	dhxWins.window(id).setText(title);
            	dhxWins.window(id).attachURL(url);
            	dhxWins.window(id).center();
            	dhxWins.window(id).show();
            } 
            
            function closeWin(){
                if(win != null){
                    win.close();
                }
            }

            function doSaveDepartment(name,remark){
                if(name==''||name==null){
					alert("请输入部门名称!");
                }else{
                    var params = new Object();
                    params["parentId"] = tree.getSelectedItemId();
                    params["level"] = tree.getLevel(tree.getSelectedItemId());
                    params["depname"] = name;
                    params["depdesc"] = remark;

                    jQuery.post("${request.getContextPath()}/department/saveNew", params, function(data){
    					if(data.result == true){     
    						alert("添加成功!");
    						tree.insertNewChild(tree.getSelectedItemId(),data.newdpt.id,data.newdpt.depname);
    						closeWin();
    					}else{
    						alert("添加失败!");
    					}
    				}, "json"); 
                } 
            }

            function doSavePosition(name,remark){
                if(name==''||name==null){
					alert("请输入职位名称!");
                }else{
                    var params = new Object();
                    params["dId"] = tree.getSelectedItemId();
                    params["pId"] = postionTree3.getSelectedItemId();
                    params["posname"] = name;
                    params["posdesc"] = remark;
                    
                    jQuery.post("${request.getContextPath()}/position/saveNew", params, function(data){
    					if(data.result == true){
    						alert("添加成功!");
    						postionTree3.insertNewChild(postionTree3.getSelectedItemId(),data.newpsn.id,data.newpsn.posname);
    						closeWin(); 
    					}else{
    						alert("添加失败!");
    					}
    				}, "json"); 
                } 
            }
            
            function doEditDepartment(id,name,remark){
            	if(name==''||name==null){
					alert("请输入部门名称!");
                }else{
                    var params = new Object();
                    params["id"] = id;
                    params["depname"] = name;
                    params["depdesc"] = remark;
                    
                    jQuery.post("${request.getContextPath()}/department/updateDepartment", params, function(data){
    					if(data.result == true){     
    						alert("修改成功!");
    						tree.setItemText(tree.getSelectedItemId(),data.newdpt.depname);
    						closeWin();
    					}else{
    						alert("修改失败!");
    					}
    				}, "json"); 
                } 
            }

            function doEditPosition(id,name,remark){
            	if(name==''||name==null){
					alert("请输入职位名称!");
                }else{
                    var params = new Object();
                    params["id"] = id;
                    params["posname"] = name;
                    params["posdesc"] = remark;
                    
                    jQuery.post("${request.getContextPath()}/position/updatePosition", params, function(data){
    					if(data.result == true){
    						alert("修改成功!");
    						postionTree3.setItemText(postionTree3.getSelectedItemId(),data.newpsn.posname);
    						closeWin();
    					}else{
    						alert("修改失败!");
    					}
    				}, "json");
                } 
            }
            //tab2
            dhxToolbar2 = tabbar.cells("a2").attachToolbar();
            dhxToolbar2.setIconsPath("${request.getContextPath()}/resources/toolbarXml/icons/");
            dhxToolbar2.loadXML("${request.getContextPath() }/resources/toolbarXml/departmenttoolbar2.xml?rt=" + new Date().valueOf());
            dhxToolbar2.attachEvent("onClick",function(id){
            	toAction(id);

    	    });
			
            attachtreea2 = tabbar.cells("a2").attachTree();
            attachtreea2.setImagePath("${request.getContextPath()}/js/dhtmlxTree/imgs/");
            attachtreea2.enableCheckBoxes(true);  
        	attachtreea2.enableThreeStateCheckboxes(true);
            
			//tab3
			dhxLayoutfora3 = tabbar.cells("a3").attachLayout("2U");
			dhxLayoutfora3.cells("a").setWidth(200);
			dhxLayoutfora3.cells("a").setText("职位(选择公司刷新)");
			dhxLayoutfora3.cells("a").fixSize(true,true);
			
			postionTree3 = dhxLayoutfora3.cells("a").attachTree();
        	postionTree3.setImagePath("${request.getContextPath()}/js/dhtmlxTree/imgs/");
        	setProgress(postionTree3,"a");
			postionTree3.attachEvent("onClick",function(id){
            	roleTree.deleteChildItems(0);
                roleTree.loadXML("${request.getContextPath()}/position/showroles/"+id);
    	    });
			
        	dhxLayoutfora3.cells("b").setText("职位角色管理");
        	dhxLayoutfora3.cells("b").fixSize(true,true);

        	toolbar3 = dhxLayoutfora3.cells("b").attachToolbar();

        	toolbar3.setIconsPath("${request.getContextPath()}/resources/toolbarXml/icons/");
        	toolbar3.loadXML("${request.getContextPath() }/resources/toolbarXml/departmenttoolbar3.xml?rt=" + new Date().valueOf());
        	toolbar3.attachEvent("onClick",function(id){
            	toAction(id);
    	    });
			
			roleTree = dhxLayoutfora3.cells("b").attachTree();
            roleTree.setImagePath("${request.getContextPath()}/js/dhtmlxTree/imgs/");
            roleTree.enableCheckBoxes(true);  
        	roleTree.enableThreeStateCheckboxes(true);
			
			//tab4
        	dhxLayout2 = tabbar.cells("a4").attachLayout("2U");
            
        	dhxLayout2.cells("a").setWidth(200);
        	dhxLayout2.cells("a").setText("职位信息(请选择部门)");
        	dhxLayout2.cells("a").fixSize(true,true);
        	postionTree = dhxLayout2.cells("a").attachTree();
        	postionTree.setImagePath("${request.getContextPath()}/js/dhtmlxTree/imgs/");
        	setProgress(postionTree,"a");   
        	//tree.loadXML("${request.getContextPath()}/department/departmentTree/115101?" + new Date().valueOf());
        	//tree.loadXML("${request.getContextPath()}/department/departmentTree/5120?" + new Date().valueOf());
        	    
        	//tree.loadXML("${request.getContextPath()}/department/departmentTree?" + new Date().valueOf());
        	postionTree.attachEvent("onClick",function(id){
            	var selectedItem = postionTree.getSelectedItemId();
            	attachtreea3.deleteChildItems(0);
            	attachtreea3.loadXML("${request.getContextPath()}/department/showusers2/"+selectedItem+"?departmentId="+tree.getSelectedItemId());
    	    });
    	    
        	dhxLayout2.cells("b").setText("职位人员");
        	dhxLayout2.cells("b").fixSize(true,true); 
        	
        	toolbar2 = dhxLayout2.cells("b").attachToolbar();

        	toolbar2.setIconsPath("${request.getContextPath()}/resources/toolbarXml/icons/");
        	toolbar2.loadXML("${request.getContextPath() }/resources/toolbarXml/departmenttoolbar4.xml?rt=" + new Date().valueOf());
        	toolbar2.attachEvent("onClick",function(id){
            	toAction(id);
    	    });

        	attachtreea3 = dhxLayout2.cells("b").attachTree();
            attachtreea3.setImagePath("${request.getContextPath()}/js/dhtmlxTree/imgs/");
            attachtreea3.enableCheckBoxes(true);  
        	attachtreea3.enableThreeStateCheckboxes(true);
    	    
        </script>
页面中html代码 (a中引用的div):
 <div id="objId" class="paginateButtons" >
    <div style="margin: 3px 5px 3px 5px;">
    		 <form action="tree" method="post">
    		 <strong style="font-size: 12px;font-weight:normal;">输入公司名称:</strong>
             <input type="text" name="company" id="company" value="${params?.company }" style="width: 140px;"/>
             
             <input type="submit" class="searchb" value="搜索" />
             </form>
    </div>
   </div>
dhtml 异步下拉菜单选项
jsp 中用DIV 的id控制位置
<table>
<tr><td>列表:  </td>
<td><div id="client_comp_id" style="float:left; margin-top:5px;"></div>
<span style="float:left; color:#666;"></span></td>
<td class="value2"><select id="sel_client" name="operator.id" style=" margin-top:5px;">
 <option value="">请先选择发起人公司</option>
</select> </td>
然后JS控制。这里需要DHtML的插件所以需要引入JS
<script>
	window.dhx_globalImgPath="${request.getContextPath()}/js/dhtmlxCombo/imgs/";
</script>
<link rel="STYLESHEET" type="text/css" href="${resource(dir:'js/dhtmlxCombo', file:'dhtmlxcombo.css') }">
<script src="${resource(dir:'js/dhtmlxCombo', file:'dhtmlxcommon.js') }"></script>
<script src="${resource(dir:'js/dhtmlxCombo', file:'dhtmlxcombo.js') }"></script>
然后JS代码为:
<script type="text/javascript">
	    
	    	 var z = new dhtmlXCombo("client_comp_id", "", 300);
	    
	         z.enableFilteringMode(true, "<%=request.getContextPath()%>/names/loadAllCompXML");
	    
	         z.attachEvent("onChange",function(){
	              var mask=z.getSelectedValue();//取得页面select的属性。
	              getclit(mask,"sel_client");//走getclit方法
	             });//很多dhtml都有.attachEvent方法
	       function getclit(mask,operid){
	            var operid= "#" + operid;
	            if(mask != null && mask != ''){
	            	jQuery.post("${request.getContextPath()}/names/getclit",
	                {
	                    mask:mask},
	            
	               function(data){
	                    var arr=data;
	                   if(arr.length > 0){
	                       $(operid).empty();
	                       $(operid).append('<option value="">请选择</option>');
	                       var options = "";
	                     for (var i = 0; i< arr.length; i++){
	                         options+='<option value="'+arr[i].id+'">'+arr[i].userRealName+'</option>';
	                         }
	                     $(operid).append(options);
	                    
	                       }
	                
	                   },"json");//jqury的post方法。
	            } else{
	                	$(operid).empty();
						$(operid).append('<option value="">请先选择公司</option>');
	                    }
	            }
			
        </script>
这里调用2个方法返回XML:
def loadAllCompXML={
		
		response.setCharacterEncoding("UTF-8")
		response.setContentType("text/xml");
		def mask = "%" + params.mask?.trim() + "%"
		def cc = Company.createCriteria()
		def comps = cc.list{
			like("fullname", mask)
			order("fullname", "asc")
		}
		def xml = "";
		xml += "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
		xml += "<complete>"
		for(def c : comps){
			xml += "<option value=\"" + c.id + "\">"
			xml += c.fullname
			xml += "</option>"
		}
		xml += "</complete>"
		render xml
	
	}
def getclit={
      def depts = Department.findAllByCompany(Company.get(params.int('mask')))//取得传过来的mask的所在公司的所有部门
	
		def c = U.createCriteria();
		def result = c.list {
			'in'("department", depts);
			 eq("enabled",true)
		}
		render result as JSON
	
			

	}

java 在线人数统计
JavaWeb中的Session

•在JavaWeb中使用HttpSession(以下简称session)对象来表示一个会话。

•Session的创建(代表会话周期的开始):第一次调用request.getSession()方法时,会创建一个session对象。 
•Session的销毁(代表会话周期的结束):在某个请求周期内调用了Session.invalidate()方法,此请求周期结束后,session被销毁;或者是session超时后自动销毁。 
•对于JSP,如果指定了<%@ page session="false"%>,则在JSP中无法直接访问内置的session变量,同时也不会主动创建session,因为此时JSP未自动执行request.getSession()操作获取session。 
•在session对象刚创建的第一个请求周期内,调用session.isNew()方法将得到true。 
•可以在web.xml文件中配置session默认的超时时间(分钟):

<session-config>
    <session-timeout>10</session-timeout>
</session-config>
也可以调用session. setMaxInactiveInterval()方法设置session超时时间(分钟) 
SessionListener

•通过SessionListenr可以监听session的创建和销毁,步骤:
1.写一个类MySessionListener,实现javax.servlet.http.HttpSessionListener接口及其sessionCreated()、sessionDestroyed()方法
2.在web.xml中配置SessionListener:

<listener>
    <listener-class>MySessionListener类全名</listener-class>
</listener>
•当session 被创建和销毁时,容器会分别调用SessionListener的sessionCreated()方法和sessionDestroyed()方法,这 两个方法中传入了一个参数对象HttpSessionEvent,可以通过此对象的getSession()方法获取session对象。 
应用:在线人数统计

import java.util.HashSet;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
 
public class MySessionListener implements HttpSessionListener {
 
       public void sessionCreated(HttpSessionEvent event) {
              HttpSession session = event.getSession();
              ServletContext application = session.getServletContext();
              
              // 在application范围由一个HashSet集保存所有的session
              HashSet sessions = (HashSet) application.getAttribute("sessions");
              if (sessions == null) {
                     sessions = new HashSet();
                     application.setAttribute("sessions", sessions);
              }
              
              // 新创建的session均添加到HashSet集中
              sessions.add(session);
              // 可以在别处从application范围中取出sessions集合
              // 然后使用sessions.size()获取当前活动的session数,即为“在线人数”
       }
 
       public void sessionDestroyed(HttpSessionEvent event) {
              HttpSession session = event.getSession();
              ServletContext application = session.getServletContext();
              HashSet sessions = (HashSet) application.getAttribute("sessions");
              
              // 销毁的session均从HashSet集中移除
              sessions.remove(session);
       }
}

controller取得sessions方法
def sessions = request.getSession().getServletContext().getAttribute("sessions");
servlet
public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		response.setContentType("text/html");
		request.setCharacterEncoding("gb2312");
		HttpSession session=request.getSession();
		String requestPath=request.getServletPath();
		System.out.println("request.getServletPath()="+requestPath);
		if(requestPath.equals("/ADD")){
			String name=request.getParameter("name");//取得name属性
			String address=request.getParameter("address");
			Student sdb=new Student();//Student中bean了属性直接调用set、get方法
			sdb.setName(name);
			sdb.setAddress(address);
			session.setAttribute("student", sdb);
			request.getRequestDispatcher("/show.jsp").forward(request, response);
			
		}
	
	}


  public class DoGet extends HttpServlet { 
            public void doGet(HttpServletRequest request.HttpServletResponse response )throws ServletException,IoException{ 
    doGet(request, response)//一般不用doGet方法。
  response.setContentType("text/html;charset=GBK"); //设置字符集,处理中文字符 
  PrintWriter out=response.getWriter(); //创建一个输出流 
      out.println(""); //输出信息
orcal语句
分页
select f.* from   
( select e.*,rownum rowno from (   
     ........(你的sql)   
) e where rownum <= end 
) f where f.rowno >=star
 
star 与end分别为传入的要展示的页数。。为页面传回的参数。。  
创建:
create table TYPE1
(
  id               NUMBER(19) not null,
  parts_type_id    NUMBER(19),
  sn               VARCHAR2(255 CHAR),
  place            VARCHAR2(255 CHAR),
  product_types_id NUMBER(19),
  parts_spe_id     NUMBER(19),
  type_sum         NUMBER(19),
  beake_type_sum   NUMBER(19),
  last_updated     TIMESTAMP(6)
)
创建 关联表 插入
create table TYPE1_PARTS_TYPE (
 TYPE1_id NUMBER(19),
 PARTS_TYPE_id number(19)
)

alter table TYPE1_PARTS_TYPE
  add constraint FKC80A323423423423w0EBBB foreign key (TYPE1_id)
  references TYPE1 (ID);
alter table TYPE1_PARTS_TYPE
  add constraint FKC80A32ew23423w0EBBB foreign key (PARTS_TYPE_id)
  references PARTS_TYPE (ID);
报错:ORA-02270: 此列列表的唯一或主键不匹配
如果第一个报错,可以给TYPE1_PARTS_TYPE 改下主键可以执行下面语句 
alter table TYPE1_PARTS_TYPE
add constraint  MAIN_TABLE_PK primary key (ID);

execute、executeQuery和executeUpdate用法
UEventStateOrder.executeUpdate("delete from UEventStateOrder c where c.u = :u", [u:loginUser])
UEventStateOrder为一个表名:
方法executeQuery 
用于产生单个结果集的语句,例如 SELECT 语句。 被使用最多的执行 SQL 语句的方法是 executeQuery。这个方法被用来执行 SELECT 语句,它几乎是使用最多的 SQL 语句。 

方法executeUpdate 
用于执行 INSERT、UPDATE 或 DELETE 语句以及 SQL DDL(数据定义语言)语句,例如 CREATE TABLE 和 DROP TABLE。INSERT、UPDATE 或 DELETE 语句的效果是修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一个整数,指示受影响的行数(即更新计数)。对于 CREATE TABLE 或 DROP TABLE 等不操作行的语句,executeUpdate 的返回值总为零。 

使用executeUpdate方法是因为在 createTableCoffees 中的 SQL 语句是 DDL (数据定义语言)语句。创建表,改变表,删除表都是 DDL 语句的例子,要用 executeUpdate 方法来执行。你也可以从它的名字里看出,方法 executeUpdate 也被用于执行更新表 SQL 语句。实际上,相对于创建表来说,executeUpdate 用于更新表的时间更多,因为表只需要创建一次,但经常被更新。
i
--添加一条记录   
INSERT INTO tableName(col1,col2,col3) VALUES (1,2,3)   
  
--添加多条记录   
INSERT INTO tableName(col1,col2,col3)   
SELECT 3,4,5   
UNION ALL  
SELECT 6,7,8   
  
--从另外的一张表中读取多条数据添加到新表中   
INSERT INTO tableName(col1,col2,col3)    
SELECT a,b,c FROM tableA   
  
--从其他的多张表中读取数据添加到新表中   
INSERT INTO tableName(col1,col2,col3)   
SELECT a,b,c FROM tableA WHERE a=1   
UNION ALL  
SELECT a,b,c FROM tableB WHERE a=2  
上边代码中的into都可以省略!
实现sql方法
  /*在开始定义 def=dataSource
   * 用给固定的SQL语句进行查询
   * 需要的参数是:传入要查询的sql字符串
   */
  private List Sql_total(String sqlStatement){
	  def resultSet
	  if(sqlStatement){
		  Sql sql = new Sql(dataSource)
		  resultSet=sql.rows(sqlStatement)
	  }
	  return  resultSet
  }
java时间增加
Date date = new Date()
Calendar c = Calendar.getInstance();
c.setTime(date);
//30为增加的天数
c.add(Calendar.DATE,30);
Date newDate = c.getTime();
//判断日期前后。 
dd.before(newDate1)&&dd.after(newDate)
导出excel
OutputStream os = response.getOutputStream();
	   response.reset();
	   response.setHeader("Content-disposition", "attachment; filename=fine.xls");
	   response.setContentType("application/msexcel");
	   WritableWorkbook wbook = Workbook.createWorkbook(os);
	/**
		 * 设置背景
		 */
		WritableFont grayfont = new WritableFont(WritableFont.TAHOMA, 13);
		WritableCellFormat gray = new WritableCellFormat (grayfont);
        gray.setBackground(Colour.GRAY_25);//hui
	   String excelName = "\u90E8\u95E8\u8D44\u4EA7\u7EDF\u8BA1";
	 //设置excel标题
            WritableSheet wsheet = wbook.createSheet(excelName, 0);
	   wsheet.addCell(new Label(0, 0, "\u90E8\u95E8\u8D44\u4EA7\u7EDF\u8BA1"));
	   wsheet.mergeCells(0, 0, 4, 0);
	   /**
		* 生成标头
		* */
	   wsheet.addCell(new Label(0, 1, "\u90E8\u95E8\u540D\u79F0" ));
	   wsheet.addCell(new Label(1, 1, "\u8D44\u4EA7\u540D\u79F0" ));
	   wsheet.addCell(new Label(2, 1, "\u8D44\u4EA7\u5C5E\u6027" ));
	   wsheet.addCell(new Label(3, 1, "\u8D44\u4EA7\u7F16\u53F7" ));
	   wsheet.addCell(new Label(4, 1, "\u8D44\u4EA7\u4F7F\u7528\u4EBA" ));
	//循环生成表格内容  表格内容为String类型不是的话加“”+内容+“”来转换 
      for(int i=0;i<cc.size();i++){
      def aa=cc[i]
        for(int k=0;k<aa.size();k++){
            wsheet.addCell(new Label(0, t,""+aa[k].useDepartment+""  ));
			wsheet.addCell(new Label(1, t,""+aa[k].name+""  ));
			wsheet.addCell(new Label(2, t,""+aa[k].assetType+""  ));
			wsheet.addCell(new Label(3, t,""+aa[k].assetno+""  ));
			wsheet.addCell(new Label(4, t,""+aa[k].assetUser+""  ));
			     	} 
     }  
	  wbook.write();
	  wbook.close();
	  os.close();

//wsheet.mergeCells(0,0,0,0);合并行列
Global site tag (gtag.js) - Google Analytics