如题,我想写一个通用的导出查询结果为excel表的代码,我把查询结果放入了一个list,然后将list放进了一个session.写了一个类来得到这个list导出为excel表.
  因为这个类是任何语句查询到的结果都能调用,所以不能确定list中的字段,请问怎样才能按顺序得到list中某一行的所有数据呢?

解决方案 »

  1.   

    不知几行几列的数据都可以这样存取:
    用一个java.util.List对象存各行数据,再把些List对象add到另一个java.util.List对象中即可
      

  2.   

    String data1 = list.get(0)
    String data2 = list.get(1)
    ......String datan = list.get(n-1);
      

  3.   

    为什么要放在session里,这样不是很好,搂住的意思可用嵌套ArrayList解决,每行一个ArrayList,每行里的ArrayList存你的字段
    如:
    ArrayList al_list=new ArrayList();
    ArrayList al_row=new ArrayList();
    al_row.add(字段1);
    al_row.add(字段2);
    .
    .
    al_list.add(al_row);
      

  4.   

    字段不知道的话
    可以getclass
    然后拿它的classmetadata
      

  5.   

    String data1 = list.get(0)
    String data2 = list.get(1)
    ......String datan = list.get(n-1);
    这种情况下因为每行不止一个数据,发布之后执行会报错.
    为什么要放在session里,这样不是很好,搂住的意思可用嵌套ArrayList解决,每行一个ArrayList,每行里的ArrayList存你的字段
    如:
    ArrayList al_list=new ArrayList();
    ArrayList al_row=new ArrayList();
    al_row.add(字段1);
    al_row.add(字段2);
    .
    .
    al_list.add(al_row);
    因为我的导出功能是在显示页面调用,不包含产生list的过程,所以考虑在产生list的时候把list放在session里.我回去改改产生list的过程,用这个方法试试.
      

  6.   

    /*
    字段不知道的话
    可以getclass
    然后拿它的classmetadata
    */可以写几句简单的代码看看么
      

  7.   

    ClassMetadata classMetadata = HibernateUtil.getSessionFactory()
                .getClassMetadata( propClass );
    我错了
    好像只有hibernate里才有额……
      

  8.   

    The import Trace cannot be resolved
    这个问题怎么解决,先谢谢啊!
      

  9.   

    ArrayList al_list=new ArrayList();
    ArrayList al_row=new ArrayList();
    al_row.add(字段1);
    al_row.add(字段2);
    .
    .
    al_list.add(al_row);
    我在产生list的页面按照上面生成了list的嵌套
    但是碰到了个这样的问题
    在导出excel的类中          List list_list=(List)session.getAttribute("list_list");

    try
    {

             jxl.write.WritableWorkbook   wwb   =   Workbook.createWorkbook(new File("d:\\测试.xls")); 
             jxl.write.WritableSheet   ws   =   wwb.createSheet("sheet1",0);   
             Iterator iterate =list_list.iterator(); 
             List list_row = new ArrayList();
             int i=0;
             while(iterate.hasNext()){
      for(int   j=0;j<numberOfColumns;j++)   
               {   
            //在这里我怎么样让现在定义的list_row得到以前嵌套的list_row的值呢
                    int   column   =   j+1;   
                  String dataValue = (String)list_row.get(column);   
                  jxl.write.Label labelC = new jxl.write.Label(j,i,dataValue);   
                  ws.addCell(labelC);   
               }                 
               i=i+1;
        
    }
      

  10.   

    /*
    知道几行几列可以用Object[][]
    */
    可以简单写几句代码看看么?
      

  11.   

    //在这里我怎么样让现在定义的list_row得到以前嵌套的list_row的值呢
    这样得到
    for(int i=0;i<list_list.size();i++)
    {
     ArrayList list_row=(ArrayList)list_list.get(i)
    }
      

  12.   

    /*
    知道几行几列可以用Object[][]
    */
    class example
    {
      int a;
      int b; 
    }
    example[][] arr=new example[row][colum];
      

  13.   

    for(int i=0;i<list_list.size();i++)
    {
     ArrayList list_row=(ArrayList)list_list.get(i)
    }用这种方法,在执行   
    ArrayList list_row=(ArrayList)list_list.get(i);
    的时候报错java.lang.ClassCastException
    at action.OutExcel.execute(WriteExcel.java:72)
    at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)
    at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
    at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
    at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
    at weblogic.servlet.internal.ServletStubImpl$ServletInvocationAction.run(ServletStubImpl.java:1006)
    at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:419)
    at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:315)
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:6718)
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
    at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121)
    at weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServletContext.java:3764)
    at weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.java:2644)
    at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:219)
    at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:178)我在之前也尝试过这样写
          List list_row=(List)list_list.get(i);
    报同样错误....
      

  14.   

    at action.OutExcel.execute(WriteExcel.java:72),应该是WriteExcel这错了
    你这个不是ArrayList list_row=(ArrayList)list_list.get(i)引起的,
    把代码全部贴出来我看看
      

  15.   

    package action;
    import java.sql.*;
    import java.io.*;
    import jxl.*;
    import jxl.write.*;
    import jxl.format.*;
    import java.util.*;
    import java.awt.Color;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    import java.lang.String;
    import org.apache.struts.action.Action;
    import org.apache.struts.action.ActionForm;
    import org.apache.struts.action.ActionForward;
    import org.apache.struts.action.ActionMapping;
    import javax.servlet.http.*;
    import java.lang.Integer; 
    public class OutExcel extends Action{ 
    public ActionForward execute(
    ActionMapping mapping,
    ActionForm form,
          HttpServletRequest request,
    HttpServletResponse response) {

    HttpSession session = request.getSession();
    List Cxjg=(List)session.getAttribute("Cxjg");   //从session得到查询结果的list
    String zd=(String)session.getAttribute("zds");
    Integer zds=Integer.valueOf(zd);                //这里得到字段数目

    try
    {

    jxl.write.WritableWorkbook   wwb   =   Workbook.createWorkbook(new File("d:\\测试.xls")); 
    jxl.write.WritableSheet   ws   =   wwb.createSheet("sheet1",0);   
    Iterator iterate =Cxjg.iterator(); 

    int i=0;
    while(iterate.hasNext()){

    int   numberOfColumns   =   zds.intValue();
         for(int   j=0;j<numberOfColumns;j++)   
         {   
          List cxjgrow=(List)Cxjg.get(i);
              
             String dataValue = (String)cxjgrow.get(j);   
             jxl.write.Label labelC = new jxl.write.Label(j,i,dataValue);   
             ws.addCell(labelC);   
         }                 
        i=i+1;
        
    }


                    wwb.write();   
                    wwb.close();   
           

    }catch(Exception e) {
    e.printStackTrace();
    return mapping.findForward("faild");
    }
    return mapping.findForward("success");
    }

    }
      

  16.   

    在ecilipse里面,运行后提示错误时,点击那个提示的错误,
    会定位到List cxjgrow=(List)Cxjg.get(i);这一行上.
      

  17.   

    应写成for(int i=0;i<Cxjg.size();i++)
    {
       List cxjgrow=(List)Cxjg.get(i);
        for(int   j=0;j<numberOfColumns;j++)   
         {              
             String dataValue = (String)cxjgrow.get(j);   
             jxl.write.Label labelC = new jxl.write.Label(j,i,dataValue);   
             ws.addCell(labelC);   
         }      
    }
    或则
    while(iterate.hasNext()){

                 List cxjgrow=(List)iterate.next();
        for(int   j=0;j<cxjgrow.size();j++)   
         {   
                   
             String dataValue = (String)cxjgrow.get(j);   
             jxl.write.Label labelC = new jxl.write.Label(j,i,dataValue);   
             ws.addCell(labelC);   
         }                 
        
    }没有iterate.next();死循环i++,就溢出了
      

  18.   

    iterate.next()开始我是写了的,这段时间一直修改,没注意改没了
    两种写法我都试了下
    但同样都在
    List cxjgrow=(List)Cxjg.get(i);
    List cxjgrow=(List)iterate.next();
    这里报错,报的错误和以前一样
    下面是我现在的代码package action;
    import java.sql.*;
    import java.io.*;
    import jxl.*;
    import jxl.write.*;
    import jxl.format.*;
    import java.util.*;
    import java.awt.Color;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    import java.lang.String;
    import org.apache.struts.action.Action;
    import org.apache.struts.action.ActionForm;
    import org.apache.struts.action.ActionForward;
    import org.apache.struts.action.ActionMapping;
    import javax.servlet.http.*;
    import java.lang.Integer; 
    public class OutExcel extends Action{ 
    public ActionForward execute(
    ActionMapping mapping,
    ActionForm form,
          HttpServletRequest request,
    HttpServletResponse response) {

    HttpSession session = request.getSession();
    List Cxjg=(List)session.getAttribute("Cxjg");
    try
    {

    jxl.write.WritableWorkbook   wwb   =   Workbook.createWorkbook(new File("d:\\测试.xls")); 
    jxl.write.WritableSheet   ws   =   wwb.createSheet("sheet1",0);   
    Iterator iterate =Cxjg.iterator(); 

    int i=0;
    while(iterate.hasNext()){

    List cxjgrow=(List)iterate.next();
    for(int   j=0;j<cxjgrow.size();j++)   
         {   
                   
             String dataValue = (String)cxjgrow.get(j);   
             jxl.write.Label labelC = new jxl.write.Label(j,i,dataValue);   
             ws.addCell(labelC);   
         }                 
        i=i+1;
        
    }


                    wwb.write();   
                    wwb.close();   
           

    }catch(Exception e) {
    e.printStackTrace();
    return mapping.findForward("faild");
    }
    return mapping.findForward("success");
    }

    }
      

  19.   

    谢谢啦,非常感谢,现在做好了,任意查询结果用同一个类导出
    最后得到列数据那段是按照
    while(iterate.hasNext()){

                 List cxjgrow=(List)iterate.next();
        for(int   j=0;j<cxjgrow.size();j++)   
         {   
                   
             String dataValue = (String)cxjgrow.get(j);   
             jxl.write.Label labelC = new jxl.write.Label(j,i,dataValue);   
             ws.addCell(labelC);   
         }                 
        
    }写的。
    非常感谢~~~!!