Rt!
这个该怎么做?
怎么控制流程。网上多是jsp下的资料,求高手!

解决方案 »

  1.   

    JAVA操作Excel文件POI VERSION 3.0.2 Final(下载地址www.apache.org)    在web开发当中,经常用pio组件实现操作excel文件的功能:创建工作薄,工作表,将数据库表数据导出到excel文件或者从excel文件导入到当前web项目的数据库.那么,如何用pio方便实用地生成一个excel录入模板呢?
        b/s结构的系统要求用户端具备上网条件.可现实环境往往导致用户暂时不具备上网条件,这样一来,用excel事先生成一个录入模板就显得尤为重要了.
        首先,用excel制作录入模板有以下几个好处:
        1.excel环境已经相当普遍,用户熟悉操作;
        2.用excel输入数据不需要再安装部署其他软件,符合瘦客户端的设计理念;
        3.移植性强.    录入模板的制作要求:
        1.生成基本的行列表格模式:
         用户在输入数据时,模板要提供一些数据项,供其直观地输入.比如:姓名,性别,住址等.这些条目是灵活的,要求动态生成.
        2.生成含有下拉列表框的输入模式:
         有一些含有数据字典的项目,如:民族,政治面貌等.并且这些数据项目是灵活的,系统要动态生成.
        3.具体布局样式先暂时不考虑    在生成下拉列表框时,有两个方案:    1)写一个动态生成录入界面的vba函数,存入固定的模板文件;
          web服务端在生成exel文件之前,将此含有vba代码的模板文件复制重命名.再用pio功能打开此文件,将基本输入项目从描述系统表的结构表信息中读出,动态写入excel"录入"sheet的单元格;同时将当前待录入项目的数据字典项目写入单独的"代码"sheet当中.用户在实际使用当中,启动此excel文件,vba自动运行并根据事先写入单元格的数据生成录入界面(一些文本框,下拉列表combobox等)    2)不使用vba,直接利用"数据有效性"功能实现基本的下拉列表输入功能.分析:第1)种方案,较复杂,并且用户在实际使用当中可能遭遇"屏蔽宏"功能的情形出现,不易维护;
         第2)种方案,较简单,但通用性强,因为"数据有效性"是excel的基本功能,所以不用运行宏代码.
    结论:决定先执行第2)种方案,时机成熟再试探第1)种方案!步骤:先建立一个生成excel字节流的类,再建立一个action类.示例代码:
    package com.mycom.server.excel;import java.io.ByteArrayOutputStream;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;import org.apache.log4j.Logger;
    import org.apache.poi.hssf.usermodel.HSSFCell;
    import org.apache.poi.hssf.usermodel.HSSFCellStyle;
    import org.apache.poi.hssf.usermodel.HSSFFont;
    import org.apache.poi.hssf.usermodel.HSSFRichTextString;
    import org.apache.poi.hssf.usermodel.HSSFRow;
    import org.apache.poi.hssf.usermodel.HSSFSheet;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.hssf.util.HSSFColor;
    import org.apache.poi.hssf.util.HSSFDataValidation;public class ExcelCreate {
    private static Logger log = Logger.getLogger(ExcelCreate.class.getName());
    //数据位置参数
    private final int startNameRow=7; //待录入字段名称开始行 
    private final short startTitleNameRow=4;
    private final int startTagRow =5; //标志开始行 
    private final int startNameCol=3; //名称开始列(也是标志开始列)//工作薄名称
    private final String SHEET_DATA_NAME="录入";
    private HSSFWorkbook excel_wbook = null; //工作薄
    private HSSFSheet    sheet_data = null; //录入sheet//Excel 列名字母 
    private String[]   englishChar ={"A","B","C","D","E","F",
                "G","H","I","J","K","L",
                "M","N","O","P","Q","R",
                "S","T","U","V","W","X",
                "Y","Z"};
    private String setupColumnName="A";//表示数据有效性来源的excel行列字符名称private static ExcelCreate instance = null;
    private ExcelCreate(){
    }
    public static synchronized ExcelCreate getInstance() {
       if (instance == null){
        instance = new ExcelCreate();
       }
       return instance;
    }
       
    /**
    * 根据传入的XtField列表对象,动态地建立一个可供录入数据的excel字节输出流
    * @return
    * @throws Exception
    */
    public ByteArrayOutputStream ExcelMake(String strTableChineseName,List curFields,Map<String,List> mapVocabulary)throws Exception{
       
       ByteArrayOutputStream baos = new ByteArrayOutputStream();
        try{
          //创建工作薄
        excel_wbook   = new HSSFWorkbook();
        //创建工作表sheet
        sheet_data = excel_wbook.createSheet(SHEET_DATA_NAME);
       
        HSSFRow       row   =null;    //excel一般行(普通行)对象
        HSSFRow       row_setup=null; //excel代码设置行对象
        HSSFDataValidation data_validation=null;//数据有效性对象
        row=sheet_data.createRow((short)startNameRow-1);//先建立一个普通行
    ...
    ...
       
        boolean isColfull=false;
        short FieldColumncount=startNameCol-1; //数据项开始列
        short setupColumn=(short)(startNameCol-1+curFields.size()+6); //代码存放列开始数
        short setupRow=startNameRow-1;    //代码存放行开始数
       
        short tmpDivcol=0; //列数整除后的商数 
        short tmpModcol=0; //列数整除后的余数
       
        //开始写标志信息以及中文名称
    ...
    ...
       
        row_setup=sheet_data.createRow((short)(startTagRow-1));
        cell =row_setup.createCell((short)(startNameCol-1));//写入表标志
        createCell(cell,curTag[0]);    //开始写字段标题
        List curDMBeanList=null;//存放代码对象列表
        Iterator it=curFields.iterator();
        //准备格式
        HSSFFont fieldTitlefont = excel_wbook.createFont();
        fieldTitlefont.setFontHeightInPoints((short) 10); //字体高度
        fieldTitlefont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); //宽度
        HSSFCellStyle fieldTitlecellStyle = excel_wbook.createCellStyle();
        fieldTitlecellStyle.setFont(fieldTitlefont);
        fieldTitlecellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); //边框 
        fieldTitlecellStyle.setBottomBorderColor(HSSFColor.BLACK.index);
       ... ...
       
        while (it.hasNext()){
         curXtField=(XtField)it.next();
         cell =row.createCell((short)FieldColumncount); 
         createCell(cell,curXtField.getFTitle());
         cell.setCellStyle(fieldTitlecellStyle);
         //如果当前数据字段是代码项
         if (curXtField.getFType().equals(VOCABULARY_TAG.toString())
           &&curXtField.getCName().toString()!=null){
           setupRow=startNameRow-1;
           curDMBeanList=mapVocabulary.get(curXtField.getCName());
           if (curDMBeanList==null){
            setupColumn++;
            continue;
           }
           Iterator itV=curDMBeanList.iterator();       //写入代码数据
            while(itV.hasNext()){
            curDMObject=(DMBean)itV.next();
            row_setup=sheet_data.createRow((short)setupRow);
            cell_setup = row_setup.createCell((short)setupColumn); 
            createCell(cell_setup,curDMObject.getTitle());
            //设置当前列的数据有效性,读取列就是sheet_setup里的对应列,起始行到末尾行
            setupRow++;
           }
            //最大列数
            if ( setupColumn>=230){ 
            isColfull=true;
            break;
           }
           //处理字母
          ...
         ...      
           //设置 数据有效性
           log.info("Excel column for vocabulary: "+setupColumnName);
             data_validation = SetDataValidation("$"+setupColumnName+
             "$"+(startNameRow)+":$"+setupColumnName+"$"+setupRow+"",
               (short)(startNameRow),(short)FieldColumncount,
             (short)300,(short)FieldColumncount);
             //指定第几列默认300行,都设置为含有下拉列表的格式        // "$B$1:$B$3"是excel公式的写法,表示第2列第1行到第3行是下拉列表的输入来源,
           // 后面的四个short参数分别是设置该有效性格式的目标单元格.
                                        
           //加入数据有效性到当前sheet对象
             sheet_data.addValidationData(data_validation) ;
              ...
             ....       setupColumn++;
          }// if 结束代码数据写入
           FieldColumncount++;
        }// while
          
        //超过最大列数 230
        if (isColfull){
         return null;
        }
        excel_wbook.write(baos);
        baos.close(); 
        log.info("Excel file bytesarray ok!");
       }catch(Exception re){
        log.error(re.getStackTrace());
        throw re;
       }
       return baos;
    }
    /**[作者:[email protected]]-谢绝转载
    * 设置待产生下拉列表框的有效 cell范围:行,列---行,列
    * @param strFormula example= "$B$1:$B$2"; 下拉框数据来源 ->从第几列几行到 第几列几行 
    * @param firstRow
    * @param firstCol
    * @param endRow
    * @param endCol
    * @return HSSFDataValidation对象
    */
    private HSSFDataValidation SetDataValidation(String strFormula,short firstRow,short firstCol,short endRow,short endCol) 

       HSSFDataValidation data_validation = new HSSFDataValidation((short) 
                 (firstRow),(short)firstCol,(short)(endRow),(short)endCol); 
       data_validation.setDataValidationType 
           (HSSFDataValidation.DATA_TYPE_LIST);
       data_validation.setFirstFormula(strFormula); 
       data_validation.setSecondFormula(null); 
       data_validation.setExplicitListFormula(true); 
       data_validation.setSurppressDropDownArrow(false); 
       data_validation.setEmptyCellAllowed(false); 
       data_validation.setShowPromptBox(false); 
       data_validation.createErrorBox("Invalidate!", "please input again!"); 
       data_validation.createPromptBox("Hi!", "You can select one");
       return data_validation;
    }private void createCell(HSSFCell cell,String value){ 
       if(value == null){
        value = "";
       }
       cell.setCellValue(new HSSFRichTextString(value));
    }}
      

  2.   

    看看这篇java导出Excel表格-by mQney能否对你有所帮助?
      

  3.   

    关键想知道怎么在Struts+Spring+hibernat4e框架下开发,这个比较头疼
      

  4.   

    在哪用都一样,3楼的那个就是个组件,放到哪里都行,放在ssh下就是个功能模块。
      

  5.   

    学习3楼的,楼主也可以试试用Extremtable这个框架,
    它集成了排序、检索、导出excel表等功能,很强大,还不错
      

  6.   

    我昨天才搞定了一个,我用一个jsx的excel的组件,我有一个方法:用struts写了之后就直接转发到excel所在的页面;
    不过读写excel文件是的路径和struts的路径有店不一样所有需要获取用struts获得工程路径;·      
            ActionContext ac = ActionContext.getContext();
            ServletContext sc = (ServletContext) ac.get(ServletActionContext.SERVLET_CONTEXT);
            String path = sc.getRealPath("/");控制路径就好了。我有刚上传一个资源,不过还没有经过验证,还不能下载。
    你可以qq联系我。461819457或者email:[email protected]
    资源蛮小的。