当前位置: 首页 > 工具软件 > EXCEL-UTIL4J > 使用案例 >

web导出excel--------java导出文件弹出下载框让用户选择路径

方祺
2023-12-01



实现导出文件时 弹出下载框 主要是 设置成 文件流  stream 类型的response. 浏览器就会识别出 文件下载弹出 下载框。


这里总结三个方式

web-sturts框架中弹出

详见  

java通过struts实现web中的文件下载

其中关键的设置是

<struts>        
   <package name="struts2" extends="struts-default">        
       <action name="FileDownload" class="com.struts2.filedownload.FileDownload">  
           <result name="success" type="stream">  
               <param name="contentType">text/plain</param>  
               <param name="contentDisposition">attachment;fileName="${fileName}"</param>  
               <param name="inputName">downloadFile</param>  
               <param name="bufferSize">1024</param>  
           </result>  
       </action>  
     
   </package>  
     
</struts>  



web-SpringMvc等非struts框架中弹出

在response中设置头

response.addHeader("Content-Disposition", "attachment;filename="+ new String(filename.getBytes()));  
           OutputStream os= new BufferedOutputStream(response.getOutputStream());  
           response.setContentType("application/vnd.ms-excel;charset=gb2312");  
           os.write(buffer);  
           os.flush();  
           os.close();  

例如:

jsp页面 使用js    提交 post  form

    $(document).ready(function() {    
    	var $searchForm = $('#search_form').on('submit',function(){
        	$dt.DataTable().searchEx( {} ).draw();
        	return false;
        }).on('click', 'button.export', function(){ 
        var searchData={};
        searchData.search=$('#search_form').formGet();  
          console.log(searchData);
           post('/order/list/export',searchData);        	
        });
              
              
      function post(URL, PARAMS) {        
        var temp = document.createElement("form");        
        temp.action = URL;        
        temp.method = "post";        
        temp.style.display = "none";        
        for (var x in PARAMS.search) {        
           var opt = document.createElement("textarea"); 
           if(x=="id"||x=="expressNumber"||x=="payStatus"){      
             opt.name = x;        
             opt.value = PARAMS.search[x];
             temp.appendChild(opt);  
           }       
        }        
        document.body.appendChild(temp);        
        temp.submit(); 
      }  
}

后端接受参数后查询出数据,把生成的excel写入excel,返回文件流

	@RequestMapping("/list/export")
	public Object export(@RequestParam String id,@RequestParam  String expressNumber,@RequestParam String payStatus,HttpServletResponse response) {
		PagerRequest<Map> req=new PagerRequest<Map>();
		req.setLength(0);
		req.setOffset(0);
		HashMap<String, String> search=new HashMap<String, String>();
		search.put("id", id);
		search.put("expressNumber", expressNumber);
		search.put("payStatus", payStatus);
		req.setSearch(search);
		List<Order> orders = new ArrayList<Order>();
		if (req.getSearch() == null||req.getSearch().size()==0) {
			orders = (List<Order>) orderRepository.findAll();
		} else {
			Page<Order> page = orderRepository.listWithSearch(new PageRequest(
					0,(int) orderRepository.count()), req
					.getSearch());
			orders = page.getContent();
		}
		if (productService.exportOrders(orders,response)) {
			return null;
		}
		return null; 

	}


	@Override
		public boolean exportOrders(List<Order> orders, HttpServletResponse response) {
			try {

				ArrayList<String[]> contentsArrayList = new ArrayList<String[]>();
				String[] titles = new String[14];
				titles[0] = "订单日期";
				titles[1] = "订单支付日期";
				titles[2] = "订单编号";
				titles[3] = "产品名称";
				titles[4] = "产品类型";
				titles[5] = "单价";
				titles[6] = "购买数量";
				titles[7] = "总金额";
				titles[8] = "付款状态";
				titles[9] = "收件人名称";
				titles[10] = "收件人电话";
				titles[11] = "配送地址";
				titles[12] = "配送日期";
				titles[13] = "发票信息";
				contentsArrayList.add(titles);
				for (int i = 0; i < orders.size(); i++) {
					List<BuyList> butlists = orders.get(i).getBuyList();
					for (BuyList buyList : butlists) {
						String[] content = new String[14];
						content[0] = orders.get(i).getCreateDate();
						content[1] = orders.get(i).getPayDate();
						content[2] = orders.get(i).getId();
						content[3] = buyList.getProductName();
						content[4] = buyList.getProductTypeStr();
						if(buyList.getProductPrice()!=null){
							content[5]=buyList.getProductPrice().toString();	
						}						
						content[6] = String.valueOf(buyList.getProductCount());
						content[7] = orders.get(i).getTotalMoney();
						content[8] = orders.get(i).getPayStatus() == Order.PAY_PAIY ? "已付款"
								: "未付款";
						content[9] = orders.get(i).getName();
						content[10] = orders.get(i).getMobile();
						content[11] = orders.get(i).getAddress();
						OrderStatus orderStatus=orders.get(i).getOrderStatus();
						if(orderStatus!=null){
							HistoryStatus historyStatus=orderStatus.getCurrent();
							if(historyStatus!=null){
								if(historyStatus.getStatus()==OrderStatus.STATUS_SEND_OUT){
								content[12] =historyStatus.getDatetime();	
								}
							}
						}
						content[13] = orders.get(i).isHasInvoice() == true ? "是"
								: "否";
						contentsArrayList.add(content);
					}
				}
				String[][] contents = ExcelUtils.changeToArray(contentsArrayList);				
				String fileName = ExcelUtils.writeExcel(contents, "订单",response);
			    return true;
			} catch (Exception e) {
				e.printStackTrace();

			}
			return false;
		}

public static String writeExcel(String[][] titles, String title, HttpServletResponse response) throws IOException {
		String fileName =title
				+ Calendar.getInstance().getTimeInMillis();
		response.setContentType("application/vnd.ms-excel;charset=utf-8");
        response.setHeader("Content-Disposition", "attachment;filename="+ new String((fileName + ".xls").getBytes(), "iso-8859-1"));
        //根据传进来的file对象创建可写入的Excel工作薄  
        OutputStream os = response.getOutputStream();  
			WritableWorkbook wwb = null;
			try {
				// 首先要使用Workbook类的工厂方法创建一个可写入的工作薄(Workbook)对象

				wwb = Workbook.createWorkbook(os);
			} catch (IOException e) {
				e.printStackTrace();
			}
			if (wwb != null) {
				// 创建一个可写入的工作表
				// Workbook的createSheet方法有两个参数,第一个是工作表的名称,第二个是工作表在工作薄中的位置
				WritableSheet ws = wwb.createSheet(title, 1);

				// 下面开始添加单元格
				for (int row = 0; row < titles.length; row++) {
					// System.out.println(row);
					for (int j = 0; j < titles[row].length; j++) {
						// 这里需要注意的是,在Excel中,第一个参数表示列,第二个表示行
						Label labelC = new Label(j, row, titles[row][j]);

						try {
							// 将生成的单元格添加到工作表中
							ws.addCell(labelC);
						} catch (RowsExceededException e) {
							e.printStackTrace();
						} catch (WriteException e) {
							e.printStackTrace();
						}
					}
				}

				try {
					// 从内存中写入文件中
					wwb.write();			 
					// 关闭资源,释放内存
					wwb.close();
					os.flush();
					os.close();
				} catch (IOException e) {
					e.printStackTrace();
				} catch (WriteException e) {
					e.printStackTrace();
				}
			}
			return fileName;
		}
	

	
	public static String[][] changeToArray(ArrayList<String[]> contentsArrayList) {
		String[][] contents = new String[contentsArrayList.size()][];
		for (int i = 0; i < contentsArrayList.size(); i++) {
			contents[i] = contentsArrayList.get(i);
		}
		return contents;
	}


关键步骤在于

1.传入response

2.设置response的头部文件类型和 把工作簿写入 response的 outputStream中即可。无需特意返回response。

response.setContentType("application/vnd.ms-excel;charset=utf-8");
response.setHeader("Content-Disposition", "attachment;filename="+ new String((fileName + ".xls").getBytes(), "iso-8859-1"));
        //根据传进来的file对象创建可写入的Excel工作薄  
        OutputStream os = response.getOutputStream();  
WritableWorkbook wwb = null;
try {
           首先要使用Workbook类的工厂方法创建一个可写入的工作薄(Workbook)对象
wwb = Workbook.createWorkbook(os);


ps: jsp中请求的action 记得要return null,因为 已经包含了 文件流的response。


如果不是return null的话则会冲突报错。





优化



jsp页面 使用js    提交 post  form

    $(document).ready(function() {    
    	var $searchForm = $('#search_form').on('submit',function(){
        	$dt.DataTable().searchEx( {} ).draw();
        	return false;
        }).on('click', 'button.export', function(){ 
        var searchData={};
        searchData.search=$('#search_form').formGet();  
          console.log(searchData);
           post('/order/list/export',searchData);        	
        });
              
              
      function post(URL, PARAMS) {        
        var temp = document.createElement("form");        
        temp.action = URL;        
        temp.method = "post";        
        temp.style.display = "none";        
        for (var x in PARAMS.search) {        
           var opt = document.createElement("textarea"); 
           if(x=="id"||x=="expressNumber"||x=="payStatus"){      
             opt.name = x;        
             opt.value = PARAMS.search[x];
             temp.appendChild(opt);  
           }       
        }        
        document.body.appendChild(temp);        
        temp.submit(); 
      }  
}




controller.class接收

@RequestMapping("/product-upgrade/list/export")
    public void export(HttpServletRequest request, HttpServletResponse response) {
        Map<String, String> search = new HashMap<>();
        Enumeration<String> parameterNames = request.getParameterNames();
        while (parameterNames.hasMoreElements()) {
            String key = parameterNames.nextElement();
            search.put(key, request.getParameter(key));
        }
        Query query = new Query();
        Criteria criteria = new Criteria();
        criteria.and("upgradeList").exists(true);
        if (!StringUtils.isBlank(search.get("mobile")))
            criteria.and("mobile").is(search.get("mobile"));
        if (!StringUtils.isBlank(search.get("payStatus")))
            criteria.and("payStatus").is(Integer.parseInt(search.get("payStatus")));

        if (!StringUtils.isBlank(search.get("upgradeStatus"))) {
        	if("0".equals(search.get("upgradeStatus"))) {
        		  criteria.orOperator(Criteria.where("upgradeStatus").exists(false), Criteria.where("upgradeStatus").is(0));
        	}else {
            criteria.and("upgradeStatus").is(Integer.parseInt(search.get("upgradeStatus")));
        	}
        } 
   
        if (!StringUtils.isEmpty(search.get("beginTime"))
                || !StringUtils.isEmpty(search.get("endTime"))) {
            criteria = criteria.and("createDate");
            if (!StringUtils.isEmpty(search.get("beginTime")))
                criteria.gte(DateUtils.parse(search.get("beginTime")));
            if (!StringUtils.isEmpty(search.get("endTime")))
                criteria.lte(DateUtils.parse(search.get("endTime")));

        }
        query.addCriteria(criteria);
        query.with(new Sort(Sort.Direction.DESC, "createDate"));
        List<Order> list = mongoTemplate.find(query, Order.class);
        exportProductUpgradeOrder(list, response);
    }





@Override
    public boolean exportProductUpgradeOrder(List<Order> orders, HttpServletResponse response) {
        try {
 
            ArrayList<String[]> contentsArrayList = new ArrayList<>();
            String[] titles = new String[]{
                    "订单编号", "订单名称", "唾液盒编号", "手机", "总金额", "在线支付",
                    "支付状态", "升级状态", "创建时间", "升级备注"};

            Boolean[] titleNumFlags = new Boolean[]{
                    false, false, false, false, true, true,
                    false, false, false, false};// 是否是数值型的标识

            contentsArrayList.add(titles);
            for (Order order : orders) {
                String[] content = new String[titles.length];
                content[0] = order.getId();
                content[1] = order.getOrderName();
                content[2] = order.getUpgradeList().get(0).getBarcode();
                content[3] = order.getMobile();
                content[4] = String.valueOf(order.getTotalMoney());
                content[5] = String.valueOf(order.getPayMoney());
                content[6] = order.getPayStatus() == Order.PAY_UNPAY ? "未付款" : "已付款";
                content[7] = order.getUpgradeStatus() == 1 ? "已处理" : "未处理";
                content[8] = order.getCreateDate();
                content[9] = order.getUpgradeRemark();
                contentsArrayList.add(content);
            }
            ExcelUtils.writeExcel(ExcelUtils.changeToArray(contentsArrayList), "导出", response, titleNumFlags);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }





ExcelUtils.class

package com.mofang.util;

import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Calendar;

import javax.servlet.http.HttpServletResponse;

import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;

/**
 * ExcelUtils 导出excel
 * 
 * @author joe
 * 
 */
public class ExcelUtils {

    /**
     * 生成一个Excel文件
     * 
     * @param title 工作表的名称
     * @param titles 工作表的内容
     */

    public static String writeExcel(String[][] titles, String title,
            HttpServletResponse response, Boolean[] titleNumFlags)
            throws IOException {
        String fileName = title + Calendar.getInstance().getTimeInMillis();
        response.setContentType("application/vnd.ms-excel;charset=utf-8");
        response.setHeader("Content-Disposition", "attachment;filename="
                + new String((fileName + ".xls").getBytes(), "iso-8859-1"));
        // 根据传进来的file对象创建可写入的Excel工作薄
        OutputStream os = response.getOutputStream();
        WritableWorkbook wwb = null;
        try {
            // 首先要使用Workbook类的工厂方法创建一个可写入的工作薄(Workbook)对象

            wwb = Workbook.createWorkbook(os);
        } catch (IOException e) {
            e.printStackTrace();
        }
        if (wwb != null) {
            // 创建一个可写入的工作表
            // Workbook的createSheet方法有两个参数,第一个是工作表的名称,第二个是工作表在工作薄中的位置
            WritableSheet ws = wwb.createSheet(title, 1);
            jxl.write.NumberFormat nf = new jxl.write.NumberFormat("#0.00"); // 设置数字格式
            jxl.write.WritableCellFormat wcfN = new jxl.write.WritableCellFormat(
                    nf); // 设置表单格式
            // 下面开始添加单元格
            for (int row = 0; row < titles.length; row++) {
                // System.out.println(row);
                for (int j = 0; j < titles[row].length; j++) {
                    if (titleNumFlags[j]) {// 当数值型时先转换成double
                        try {
                            double titlesDoubleValue = Double
                                    .parseDouble(titles[row][j]);
                            ws = writeNumberToWs(ws, wcfN, row, j,
                                    titlesDoubleValue);
                        } catch (Exception notnum) {
                            String titlesStringValue = titles[row][j];
                            // 这里需要注意的是,在Excel中,j表示列,row表示行
                            ws = writeStringToWs(ws, row, j, titlesStringValue);
                        }
                    } else {
                        String titlesStringValue = titles[row][j];
                        // 这里需要注意的是,在Excel中,j表示列,row表示行
                        ws = writeStringToWs(ws, row, j, titlesStringValue);
                    }
                }
            }

            try {
                // 从内存中写入文件中
                wwb.write();
                // 关闭资源,释放内存
                wwb.close();
                os.flush();
                os.close();
            } catch (IOException | WriteException e) {
                //e.printStackTrace();
            }
        }
        return fileName;
    }

    private static WritableSheet writeNumberToWs(WritableSheet ws,
            jxl.write.WritableCellFormat wcfN, int row, int j,
            double titlesDoubleValue) {
        jxl.write.Number labelNF = new jxl.write.Number(j, row,
                titlesDoubleValue, wcfN); // 格式化数值
        try {
            ws.addCell(labelNF);
        } catch (WriteException e1) {
            e1.printStackTrace();
        }
        return ws;
    }

    private static WritableSheet writeStringToWs(WritableSheet ws, int row,
            int j, String titlesStringValue) {
        Label labelC = new Label(j, row, titlesStringValue);
        try {
            // 将生成的单元格添加到工作表中
            ws.addCell(labelC);
        } catch (WriteException e) {
            e.printStackTrace();
        }
        return ws;
    }

    public static String[][] changeToArray(ArrayList<String[]> contentsArrayList) {
        String[][] contents = new String[contentsArrayList.size()][];
        for (int i = 0; i < contentsArrayList.size(); i++) {
            contents[i] = contentsArrayList.get(i);
        }
        return contents;
    }

}










桌面程序-swing弹出

swing只会在服务器中弹出,多用于 桌面程序-----如果用在web中则 在页面点击时,选择框在服务器弹出。

swing

public static String writeExcel(String[][] titles, String title) {

		String fileName = "";
		JFileChooser dialog = new JFileChooser();
		dialog.setDialogTitle("保存文件");
		dialog.setFileSelectionMode(JFileChooser.FILES_ONLY);
		FileSystemView fsv = FileSystemView.getFileSystemView();
		System.out.println(fsv.getHomeDirectory()); // 得到桌面路径
		dialog.setCurrentDirectory(fsv.getHomeDirectory()); // 设置默认保存路径为桌面路径
		// dialog.setDialogType(JFileChooser.SAVE_DIALOG);
		dialog.setSelectedFile(new File("订单列表"
				+ Calendar.getInstance().getTimeInMillis() + ".xls")); // 设置默认文件名
		dialog.setFileFilter(new TextFileFilter("*.xls", "文本文档(*.xls)"));
		int result = dialog.showSaveDialog(dialog);
		if (result == JFileChooser.APPROVE_OPTION) {
			File file = dialog.getSelectedFile();
			fileName = file.getAbsolutePath(); // 得到文件全名

			WritableWorkbook wwb = null;
			try {
				// 首先要使用Workbook类的工厂方法创建一个可写入的工作薄(Workbook)对象

				wwb = Workbook.createWorkbook(new File(fileName));
			} catch (IOException e) {
				e.printStackTrace();
			}
			if (wwb != null) {
				// 创建一个可写入的工作表
				// Workbook的createSheet方法有两个参数,第一个是工作表的名称,第二个是工作表在工作薄中的位置
				WritableSheet ws = wwb.createSheet(title, 1);

				// 下面开始添加单元格
				for (int row = 0; row < titles.length; row++) {
					// System.out.println(row);
					for (int j = 0; j < titles[row].length; j++) {
						// 这里需要注意的是,在Excel中,第一个参数表示列,第二个表示行
						Label labelC = new Label(j, row, titles[row][j]);

						try {
							// 将生成的单元格添加到工作表中
							ws.addCell(labelC);
						} catch (RowsExceededException e) {
							e.printStackTrace();
						} catch (WriteException e) {
							e.printStackTrace();
						}
					}
				}

				try {
					// 从内存中写入文件中
					wwb.write();
					// 关闭资源,释放内存
					wwb.close();
				} catch (IOException e) {
					e.printStackTrace();
				} catch (WriteException e) {
					e.printStackTrace();
				}
			}
		}
		return fileName;
	}



 类似资料: