jxl从html中的table中导出数据到execl

4 篇文章 0 订阅
3 篇文章 0 订阅

第一步:js从table中拿到数据传回服务器处理
function createJson(tag){
   var name = ["cardId","name","roomId","roomName","startTime","endTime"];
    var array = new Array();
    var tr = $(tag+" tr");
    for(var i=0;i<tr.length-1;i++){
      var td = $(tr.get(i)).find("td");
      var json = {};
      for(var j=0;j<td.length;j++){
        json[name[j]] = $(td.get(j)).text();
      }
      array[i] = json;
    }
    return array;
  }
    
  $(function(){
    var ctx = '${ctx}';
    $("#daochu").click(function(){
       var array = createJson("#infoTable");
      
       for(var i=0;i<array.length;i++){
          if(i==array.length-1){
             array[i]["last"] = 1;
          }
            $.ajax({
            type: "POST",
            async:false,  // 设置同步方式
            url: ctx+"/data/toExel.action",
            data:array[i],
            success:function(data){
             if(data==1){
                location.href=ctx+"/data/dowload.action";
               }
                    }
            });
            }
            });
                                
                     
    });
页面内容:

第二步:将ajax传来的数据通过jxl转换成InputStream,见ToExelAction.java中的execute方法和ToExelUtil1.java


ToExelAction.java

package neu.qinfang.action.data.sxqin;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ModelDriven;

import neu.qinfang.action.BaseAction;
import neu.qinfang.pojo.Demo;
import neu.qinfang.pojo.Manageteacher;
import neu.qinfang.util.ToExelUtil1;

public class ToExelAction extends BaseAction implements ModelDriven<Object>{

	private static final long serialVersionUID = -8659819060990529242L;
	
	private Demo demo = new Demo();
    private int flag = 0;
    private static List<Demo> demos = new ArrayList<Demo>();
    private static InputStream inputStream;
	public Demo getDemo() {
		return demo;
	}


	public void setDemo(Demo demo) {
		this.demo = demo;
	}


	public int getFlag() {
		return flag;
	}


	public void setFlag(int flag) {
		this.flag = flag;
	}
    


	public String execute() throws Exception{
		demos.add(demo);
		if(demo.getLast()==1){
			String[] titleName = {"卡号","姓名","房间号","房间名","开始时间","结束时间"};
			String[] proName = {"cardId","name","roomId","roomName","startTime","endTime"};
			int[] size = {10,10,10,10,20,20};
			inputStream = ToExelUtil1.writeExcel(demos,titleName,proName,size);
						flag = 1;
						demos.removeAll(demos);
		}
		
		
		return Action.SUCCESS;
	}
	


    private String filename;

    public String () throws Exception {
       
        return Action.SUCCESS;
    }

    public InputStream getInputStream() throws Exception {
    	Manageteacher mt = (Manageteacher) session1.getAttribute("manageteacher");
        filename = mt.getManageTeaNo()+".xls";
    	return inputStream;
    }

    /**
     * @return the filename
     */
    public String getFilename() {
        return filename;
    }

    /**
     * @param filename
     *            the filename to set
     */
    public void setFilename(String filename) {
        this.filename = filename;
    }

    /**
     * @param directory
     *            the directory to set
     */


	public Object getModel() {
		return demo;
	}



}


ToExelUtil1.java


package neu.qinfang.util;
import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;

import jxl.Workbook;
import jxl.format.UnderlineStyle;
import jxl.write.Label;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;


public class ToExelUtil1 {
             /**
                                  参数说明
              re:实体类组成的list数组
              titleName:导出的exel的表头的名字组成的数组
              proName:你需要导出到exel中的实体类的属性,主要要和titleName顺序一致
              size:exel每一列的长度
              */   
    public static InputStream writeExcel(List re,
    		             String[] titleName,String[] proName,int[] size){    
    	Workbook wb = null;
        WritableWorkbook wwb = null;   
        WritableSheet ws = null;  
       ByteArrayOutputStream os = new ByteArrayOutputStream();
        try {    
        	
            //首先要使用Workbook类的工厂方法创建一个可写入的工作薄(Workbook)对象    
              
				wwb = Workbook.createWorkbook(os);
			
               //如果文件不存在则创建一个可写入的工作表    
               //Workbook的createSheet方法有两个参数,第一个是工作表的名称,第二个是工作表在工作薄中的位置    
               ws = wwb.createSheet("sheet1", 0);  
               WritableFont titleFont = new WritableFont(WritableFont.ARIAL, 15, WritableFont.BOLD, false, UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.BLACK);   
               WritableCellFormat titleFormat = new WritableCellFormat (titleFont);
               Label label = new Label(0,0,"序号",titleFormat);
			    ws.addCell(label);
               for(int i=1;i<=titleName.length;i++){
            	   label = new Label(i,0,titleName[i-1],titleFormat);
					ws.addCell(label);
               }
               int column=0;   
               ws.setColumnView(column++, 10); 
               for(int i=1;i<size.length;i++){
            	   ws.setColumnView(column++, size[i-1]); 
               }
           
        }catch (RowsExceededException e) {
			e.printStackTrace();
		} catch (WriteException e) {
			e.printStackTrace();
		}catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}    
        if(wwb!=null){    
            //下面开始添加单元格    
        	for(int i=0;i<re.size();i++){
        	   int row = wwb.getSheet(0).getRows();
        	   addLabel(ws,re.get(i),row,proName);
        	}
        	
            try {    
                //从内存中写入文件中    
                wwb.write();    
                //关闭资源,释放内存    
                wwb.close();    
            } catch (IOException e) {    
                e.printStackTrace();    
            } catch (WriteException e) {    
                e.printStackTrace();    
            }    
        }    
       return new ByteArrayInputStream(os.toByteArray()); 
    } 
    private static void addLabel(WritableSheet ws,Object obj,int row,String[] proName) {
    	Class type = obj.getClass();
    	Field[]fields = type.getDeclaredFields();
      try{
    	Label label = new Label(0,row,row+"");
		ws.addCell(label);
    	for(int i=1;i<=proName.length;i++){
				String proType = "";
				String str = "";
				PropertyDescriptor descriptor = new PropertyDescriptor(proName[i-1],type);
				Method getMethod = 	descriptor.getReadMethod();
				for(int j=0;j<fields.length;j++){
					
					String fname = fields[j].getName();
					if(proName[i-1].equals(fname)){
						proType = fields[j].getType().toString();
						if("class java.sql.Timestamp".equals(proType)){
							String s = getMethod.invoke(obj).toString();
							str = s.substring(0,19);
						}else{
							str = getMethod.invoke(obj).toString();
						}
					}
				}
					label = new Label(i, row, str);
						ws.addCell(label);
				
    	}
         }catch (IllegalArgumentException e) {
		     e.printStackTrace();
	      } catch (IllegalAccessException e) {
		     e.printStackTrace();
	     } catch (InvocationTargetException e) {
		     e.printStackTrace();
	     } catch (RowsExceededException e) {
		     e.printStackTrace();
	     } catch (WriteException e) {
		     e.printStackTrace();
	     } catch (IntrospectionException e1) {
		     e1.printStackTrace();
	     }


    }
    
}

第三步:下载上面生成的InputStream到本地代码见上面ToExelAction.java的dowload()和getInputStream()以及struts配置文件


<!-- 导出数据到exel -->
		<action name="toExel" class="neu.qinfang.action.data.sxqin.ToExelAction">
		    <result type="json">
		      <param name="root">flag</param>
		    </result>
		</action>
		
		<action name="dowload" class="neu.qinfang.action.data.sxqin.ToExelAction"  method="dowload">
        <result name="success" type="stream">
        <!-- 指定下载文件的内容类型,text/plain是默认类型 -->
        <param name="contentType">application/excel</param>
        <!-- inputName默认值是inputStream,如果action中用于读取下载文件内容的属性名是inputStream,那么可以省略这个参数 -->
        <param name="inputName">inputStream</param>
        <!--动态获取文件名,从Action中的取得filename-->
        <param name="contentDisposition">
            attachment;filename="${filename}"
        </param>
        <param name="bufferSize">2048</param>
       </result>
       </action>


最后导出的execl文件



搞定,这是花了好几天的成果!哎,技术还是不够成熟啊!希望多多交流!



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java可以使用EasyExcel组件来导出数据Excel表格。EasyExcel是阿里巴巴开源的一个优秀的Java解析和生成Excel的框架。相对于其他框架如Apache POI和JXL,EasyExcel具有更低的内存消耗,能够处理大型Excel文件而不会导致内存溢出的问题。EasyExcel提供了简单易用的API,使得导出Excel变得简单方便。你可以通过访问EasyExcel的官方网站(https://easyexcel.opensource.alibaba.com)或者GitHub地址(https://github.com/alibaba/easyexcel)来了解更多关于EasyExcel的详细信息和使用方法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Java使用easyexcel导出数据Excel表格](https://blog.csdn.net/weixin_45536587/article/details/124751757)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Java导出Excel文件合集(easyExcel)](https://blog.csdn.net/weixin_42555014/article/details/131853805)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值