java实现web的table导出到excel的3种方法分析

web里面的table导出excel方法:
1,纯粹用js实现,仅限本机有安装excel的情况直接在excel中打开
优点:实现简单,几行js即可实现
缺点:用户体验不好且兼容性差
实现方法:
//js代码 //导出到excel 
function AutomateExcel(){
var elTable = document.getElementById("table"); //要导出的table id。
var oRangeRef = document.body.createTextRange();  
oRangeRef.moveToElementText(elTable); 
oRangeRef.execCommand("Copy"); 
var appExcel = new ActiveXObject("Excel.Application"); 
appExcel.Workbooks.Add().Worksheets.Item(1).Paste(); 
appExcel.Visible = true;  
appExcel = null; 
}
//将此方法挂到导出按钮即可
2,导出用后台方法实现基本思想是:获取要导出的数据自己创建excel表格将数据写入excel表里面保存到服务器,然后客户端访问时将服务器里面的文件下载到客户端并将服务器里面的文件删除
优点:前台操作体验很好,能保证数据的完整性并可以自定义导出格式
缺点:在服务器生成的文件需要下载后清除,没有实际的存储意义
实现方法:
step1:页面导出方法直接访问后台
function openwd(){
document.getElementById("form2").action="<%=jspUsePath%>"+"/setting/downJxhglPm";
document.getElementById("form2").submit();
}
step2:控制器方法(主要实现方法)
/**
* 后台菜单说明导出excel图表
*/
public void doDownJxhglPm(RunData data)throws ControllerException{
HttpServletResponse response=data.getResponse();
//获取所有的菜单说明
String me = getClass().getName() + ".doMenuExplain(RunData data)";
//根据menu取得设定的说明
List explainList=new ArrayList();
MenuExplainService explainService=DbMenuExplainService.getInstance(servlet());
//取得menu设定
Menu mainMenu = NursingMenuConfigService.getInstance(servlet()).getMenu();
for(int i = 0 ; i < mainMenu.getItemList().size() ; i++){
String objClass = null;
Object obj = (Object) mainMenu.getItemList().get(i);
if(obj instanceof MenuItem){
objClass = "MenuItem";
}else if(obj instanceof Folder){
objClass = "Folder";
}
if("MenuItem".equals(objClass)){
MenuItem item = (MenuItem)mainMenu.getItemList().get(i);
// System.out.println(item.getId()+";"+item.getName());
//取出数据库里对应的数据
MenuExplain ex1=new MenuExplain();
ex1=explainService.selelctMenuExplain(item.getPageNo());
if(ex1.is_use==null||ex1.is_use==""){
ex1.setMenu_id(item.getPageNo());
if(item.getName()==null){
ex1.setMenu_level1name("");
}else{
ex1.setMenu_level1name(item.getName());
}
ex1.setMenu_name("");
ex1.setMenu_explain("");
ex1.setIs_use("N");
}else{
if(ex1.getMenu_name()==null){
ex1.setMenu_name("");
}else{
ex1.setMenu_name(ex1.getMenu_name());
}
}
explainList.add(ex1);

}
if("Folder".equals(objClass)){
Folder sub = ((Folder)mainMenu.getItemList().get(i));
for(int j = 0 ; j < sub.getItemList().size() ; j++) {
MenuBaseObj menuItem = (MenuBaseObj) sub.getItemList().get(j);
MenuItem item = (MenuItem) sub.getItemList().get(j);
String menuName = menuItem.getName();
// System.out.println(sub.getName()+";"+menuItem.getId()+";"+menuName);
MenuExplain e2=new MenuExplain();
e2=explainService.selelctMenuExplain(menuItem.getPageNo());
if(e2.is_use==null||e2.is_use==""){
e2.setMenu_id(menuItem.getPageNo());
if(sub.getName()==null){
e2.setMenu_level1name("");
}else{
e2.setMenu_level1name(sub.getName());
}
if(menuName==null){
e2.setMenu_name("");
}else{
e2.setMenu_name(menuName);
}
e2.setMenu_explain("");
e2.setIs_use("N");
}
explainList.add(e2);
}

}
}
//以上按照自己的业务逻辑生成自己数据集合
WritableWorkbook wbook=null;
try 

        String tmptitle = "菜单说明"; // 标题           
        Calendar cal=Calendar.getInstance();
        String nowDate=DateUtils.format(cal.getTime(), "yyyyMMdd");
        File f=new File("d:\\菜单说明"+nowDate+".xls");//根据文件位置和文件名在服务器中创建文件
        wbook = Workbook.createWorkbook(f); // 建立excel文件          
        WritableSheet wsheet = wbook.createSheet(tmptitle, 0); // sheet名称      
wsheet.setColumnView(0,5); //宽度
wsheet.setColumnView(1,10); //宽度
wsheet.setColumnView(2,10); //宽度
wsheet.setColumnView(3,30); //宽度
wsheet.setColumnView(4,10); //宽度
// 开始生成主体内容      
wsheet.addCell(new Label(0, 0, "编号"));   
wsheet.addCell(new Label(1, 0, "一级菜单"));   
wsheet.addCell(new Label(2, 0, "二级菜单"));  
wsheet.addCell(new Label(3, 0, "说明"));
wsheet.addCell(new Label(4, 0, "是否启用"));  

int count=explainList.size();
if(count>0){  判断集合是否不为0
MenuExplain explain=null;
for(int i=0;i explain=(MenuExplain)explainList.get(i);
wsheet.addCell(new Label(0, i+1, explain.getMenu_id().toString()));
wsheet.addCell(new Label(1, i+1, explain.getMenu_level1name().toString()));
wsheet.addCell(new Label(2, i+1, explain.getMenu_name().toString()));
wsheet.addCell(new Label(3, i+1, explain.getMenu_explain().toString()));
wsheet.addCell(new Label(4, i+1, explain.getIs_use().toString()));
}

wbook.write(); // 写入文件  
wbook.close();
//返回到客户端下载
exportFile(response, f, true);
}
catch(Exception ex) 

ex.printStackTrace(); 
}


}
step3:客户端下载方法
//将服务器文件下载到本地
public static void exportFile(HttpServletResponse response, File file, boolean isDel) throws IOException {
 OutputStream out = null;
 InputStream in = null;  
 // 获得文件名
 String filename = URLEncoder.encode(file.getName(), "UTF-8"); //此处为IE处理方法避免弹出文件下载框时文件名出现乱码
 // 定义输出类型(下载)
   response.setContentType("application/force-download"); 
   response.setHeader("Location", filename);
    // 定义输出文件头
 response.setHeader("Content-Disposition", "attachment;filename=" + filename); 
 out = response.getOutputStream();
 in = new FileInputStream(file.getPath());    
 byte[] buffer = new byte[1024];
 int i = -1;
 while ((i = in.read(buffer)) != -1) {
   out.write(buffer, 0, i);
 }  
 in.close();
 out.close();    
}
3,基本实现思想与2一致,区别是此方法并不写入文件到服务器,直接放在流里面
优点:简化代码,防止了文件在服务器的冗余与重复操作
缺点:有时流被占用可能会下载失败
step1:页面导出方法直接访问后台
function openwd(){
document.getElementById("form2").action="<%=jspUsePath%>"+"/setting/downJxhglPm";
document.getElementById("form2").submit();
}
step2:控制器方法(主要实现方法)
/**
* 后台菜单说明导出excel图表
*/
public void doDownJxhglPm(RunData data)throws ControllerException{
HttpServletResponse response=data.getResponse();
//获取所有的菜单说明
String me = getClass().getName() + ".doMenuExplain(RunData data)";
//根据menu取得设定的说明
List explainList=new ArrayList();
MenuExplainService explainService=DbMenuExplainService.getInstance(servlet());
//取得menu设定
Menu mainMenu = NursingMenuConfigService.getInstance(servlet()).getMenu();
for(int i = 0 ; i < mainMenu.getItemList().size() ; i++){
String objClass = null;
Object obj = (Object) mainMenu.getItemList().get(i);
if(obj instanceof MenuItem){
objClass = "MenuItem";
}else if(obj instanceof Folder){
objClass = "Folder";
}
if("MenuItem".equals(objClass)){
MenuItem item = (MenuItem)mainMenu.getItemList().get(i);
// System.out.println(item.getId()+";"+item.getName());
//取出数据库里对应的数据
MenuExplain ex1=new MenuExplain();
ex1=explainService.selelctMenuExplain(item.getPageNo());
if(ex1.is_use==null||ex1.is_use==""){
ex1.setMenu_id(item.getPageNo());
if(item.getName()==null){
ex1.setMenu_level1name("");
}else{
ex1.setMenu_level1name(item.getName());
}
ex1.setMenu_name("");
ex1.setMenu_explain("");
ex1.setIs_use("N");
}else{
if(ex1.getMenu_name()==null){
ex1.setMenu_name("");
}else{
ex1.setMenu_name(ex1.getMenu_name());
}
}
explainList.add(ex1);

}
if("Folder".equals(objClass)){
Folder sub = ((Folder)mainMenu.getItemList().get(i));
for(int j = 0 ; j < sub.getItemList().size() ; j++) {
MenuBaseObj menuItem = (MenuBaseObj) sub.getItemList().get(j);
MenuItem item = (MenuItem) sub.getItemList().get(j);
String menuName = menuItem.getName();
// System.out.println(sub.getName()+";"+menuItem.getId()+";"+menuName);
MenuExplain e2=new MenuExplain();
e2=explainService.selelctMenuExplain(menuItem.getPageNo());
if(e2.is_use==null||e2.is_use==""){
e2.setMenu_id(menuItem.getPageNo());
if(sub.getName()==null){
e2.setMenu_level1name("");
}else{
e2.setMenu_level1name(sub.getName());
}
if(menuName==null){
e2.setMenu_name("");
}else{
e2.setMenu_name(menuName);
}
e2.setMenu_explain("");
e2.setIs_use("N");
}
explainList.add(e2);
}

}
}
//以上按照自己的业务逻辑生成自己数据集合
OutputStream os=null;  
        WritableWorkbook wbook=null;  
        try   
        {   
        os = new BufferedOutputStream(response.getOutputStream());//得到输出流的语句   
         //response.getOutputStream();// 取得输出流     
        response.reset();// 清空输出流     
         String tmptitle = "菜单说明"; // 标题           
        Calendar cal=Calendar.getInstance();
        String nowDate=DateUtils.format(cal.getTime(), "yyyyMMdd");    
        response.setHeader("Content-disposition", "attachment; filename="+new String(tmptitle.getBytes(),"iso8859-1")+nowDate+".xls");// 设定输出文件头火狐浏览器写法IE要用上面的方法转码     
        response.setContentType("application/vnd.ms-excel");// 定义输出类型   
         wbook = Workbook.createWorkbook(os); // 建立excel文件     
        WritableSheet wsheet = wbook.createSheet(tmptitle, 0); // sheet名称    
        // 设置excel标题  
        WritableFont wfont = new WritableFont(WritableFont.ARIAL, 16,WritableFont.BOLD,false,UnderlineStyle.NO_UNDERLINE,Colour.BLACK); //设置表格样式    
        WritableCellFormat wcfFC = new WritableCellFormat(wfont);   
        //wcfFC.setBackground(Colour.AQUA);  
        Label label=new Label(0, 0, tmptitle, wcfFC);      
        WritableCellFormat cellFormat=new WritableCellFormat();       
        cellFormat.setAlignment(jxl.format.Alignment.CENTRE);       
            cellFormat.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);   
        cellFormat.setWrap(true);    
        //cellFormat.setBackground(Colour.AQUA);  
        cellFormat.setFont(wfont);  
        label.setCellFormat(cellFormat);         
        wsheet.addCell(label);  
        //wsheet.addCell(new Label(0, 0, tmptitle, wcfFC));  
        wsheet.setRowView(0,500); //第一行高度  
        wsheet.mergeCells(0, 0, 6, 1);  //合并单元格(第一列的第一行和第七列的第二行合并)      
        //wsheet.mergeCells(0, 1, 9, 1);      
//      wsheet.mergeCells(0, 2, 0, 4);       
//      wsheet.mergeCells(1, 2, 3, 2);       
//      wsheet.mergeCells(4, 2, 6, 2);       
//      wsheet.mergeCells(7, 2, 9, 2);       
        wsheet.setColumnView(0,10); //宽度  
        wsheet.setColumnView(1,25); //宽度  
        wsheet.setColumnView(2,10); //宽度  
        wsheet.setColumnView(3,10); //宽度  
        wsheet.setColumnView(4,10); //宽度  
        wsheet.setColumnView(5,10); //宽度  
        // 开始生成主体内容         
        wfont = new jxl.write.WritableFont(WritableFont.ARIAL, 14,WritableFont.BOLD,false, UnderlineStyle.NO_UNDERLINE,Colour.BLACK);     
        wcfFC = new WritableCellFormat(wfont);  
        wsheet.addCell(new Label(0, 2, "名次",wcfFC));     
        wsheet.addCell(new Label(1, 2, "驾校名称",wcfFC));     
        wsheet.addCell(new Label(2, 2, "科目一",wcfFC));    
        wsheet.addCell(new Label(3, 2, "科目二",wcfFC));  
        wsheet.addCell(new Label(4, 2, "科目三",wcfFC));   
        wsheet.addCell(new Label(5, 2, "合格率",wcfFC));    
          
            int count=jxhelpmList.size();  
                if(count>0){  判断集合是否不为0  
                    TjJxkshgl tjhgl=null;  
                    for(int i=0;i                         tjhgl=(TjJxkshgl)jxhelpmList.get(i);  
                        wsheet.addCell(new Label(0, i+3, (i+1)+""));  
                        wsheet.addCell(new Label(1, i+3, tjhgl.getJxmc()));  
                        wsheet.addCell(new Label(2, i+3, tjhgl.getKm1hgl()));  
                        wsheet.addCell(new Label(3, i+3, tjhgl.getKm2hgl()));  
                        wsheet.addCell(new Label(4, i+3, tjhgl.getKm3hgl()));  
                        wsheet.addCell(new Label(5, i+3, tjhgl.getAvghgl()));  
                        }  
                    }     
                    wbook.write(); // 写入文件    
                }  
                catch(Exception ex)   
                {   
                    ex.printStackTrace();   
                }finally{  
                    if(os!=null){  
                        try {  
                            os.close();  
                        } catch (IOException e) {  
                            // TODO Auto-generated catch block  
                            e.printStackTrace();  
                        }  
                    }if(wbook!=null){  
                        try {  
                            wbook.close();  
                        } catch (WriteException e) {  
                            // TODO Auto-generated catch block  
                            e.printStackTrace();  
                        } catch (IOException e) {  
                            // TODO Auto-generated catch block  
                            e.printStackTrace();  
                        }  
                    }  
                      
                }   
                  
                  
            }  

//此方法为借鉴网上的方法用流暂时储存然后写入下载到本地,里面涉及对Excel的格式等的设计

2,3方法的前台弹出窗效果如下:

java实现web的table导出到excel的3种方法分析_第1张图片

你可能感兴趣的:(技术类)