java web下载excel样例(selvet)

在日常网页中点击按钮下载excel的例子很多,下面就是完成此功能的关键步骤。

1.在html页面添加按钮用来点击触发下载excel 的事件。

2.给按钮绑定事件,js代码

    var elemIF = document.createElement("iframe");//创建dom对象
    elemIF.src =  "http://localhost:8080:excelTest/downExcel.do";//下载excel的后台请求地址
    elemIF.style.display = "none";//此元素不会被显示
    document.body.appendChild(elemIF);

3.通过请求跳转到后台代码,下面为生成excel的代码。


    /**
     * 数据写入excle,
     * @param fileName    文件名
     * @param list<map>        excel中的数据
     * @param titleRow  excel第一行
     * @param beanName    list中map中的key值,此处beanName和titleRow一一对应
     * @return
     * @throws IOException
     */
    public Workbook writer(String fileName,List<Map<String, Object>> list,String titleRow[],String beanName[]) throws IOException {  
        Workbook wb = new HSSFWorkbook();  
        Sheet sheet =(Sheet) wb.createSheet("sheet1");
        CellStyle style = wb.createCellStyle(); // 样式对象      
        // 设置单元格的背景颜色为淡蓝色  
        style.setFillForegroundColor(HSSFColor.PALE_BLUE.index);             
        style.setAlignment(HorizontalAlignment.LEFT);// 水平剧中 
        style.setWrapText(true);// 指定当单元格内容显示不下时自动换行
        
        Row row = sheet.createRow(0);    //创建第一行    
        Cell cell = row.createCell(0);
        for(int i = 0;i < titleRow.length;i++){  
            cell = row.createCell(i);  
            cell.setCellValue(titleRow[i]); 
            cell.setCellStyle(style); // 样式,居中
            sheet.setColumnWidth(i, 20 * 256); 
        }  
        row.setHeight((short) 540); 
        
        //循环写入行数据   
        for (int i = 1; i < list.size()+1; i++) {                                                
                            
                row = (Row) sheet.createRow(i);  
                row.setHeight((short) 500);
                
                for (int j = 0; j < beanName.length; j++) {
                    Cell celldate = row.createCell(j);
                    celldate.setCellStyle(style);
                    celldate.setCellValue(list.get(i-1).get(beanName[j])+"");
                        
                }
        
        }  
        
        return wb;
    }
 

 

4.selvet把上面方法生成的excel返回前台。

Workbook wb =  public Workbook writer(fileName,list,titleRow,beanName)            
outputStream = response.getOutputStream();
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("application/x-msdownload");
log.info("attachment;filename="+filename+"");
response.addHeader("Content-Disposition", "attachment;filename="+filename+"");//filename为excel文件的名
wb.write(outputStream);
response.getOutputStream().close();
log.info("下载excel结束"); 

生成并下载excel的关键步骤到这里就结束了。 

import目录:

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;

需要的jar包:poi-3.17.jar

参考数据: 

生成excel方法writer的参数样例:

String[] titleRow = {"交易日期","平台订单号","支付机构订单号"};
String[] beanName = {"tran_date","out_trade_no","trans_id"};
String fileName="测试excel.xls";
List<Map<String, Object>> list = new ArrayList<Map<String,Object>>();
Map<String,Object> map = new HashMap<String,Object>();
map.put("tran_date", "123");
map.put("out_trade_no", "1231111");
map.put("trans_id", "123333");
list.add(map);

生成excel样例:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您提供一段基于Java语言的代码,实现异步的Servlet代理。 首先,我们需要在web.xml中配置一个过滤器(Filter),用于拦截所有的HTTP请求。在这个过滤器中,我们可以使用Java Servlet API提供的异步特性,将请求转发给目标服务,并在异步回调中将响应返回给客户端。 以下是示例代码: ```java import java.io.IOException; import java.util.concurrent.Future; import javax.servlet.AsyncContext; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.eclipse.jetty.client.HttpClient; import org.eclipse.jetty.client.api.ContentResponse; import org.eclipse.jetty.client.api.Request; import org.eclipse.jetty.client.util.BufferingResponseListener; import org.eclipse.jetty.http.HttpFields; import org.eclipse.jetty.http.HttpMethod; import org.eclipse.jetty.http.HttpVersion; import org.eclipse.jetty.util.ssl.SslContextFactory; public class AsyncServletProxy implements Filter { private HttpClient client; @Override public void init(FilterConfig filterConfig) throws ServletException { // 初始化Jetty的HTTP客户端 SslContextFactory sslContextFactory = new SslContextFactory(); client = new HttpClient(sslContextFactory); try { client.start(); } catch (Exception e) { throw new ServletException("Failed to start Jetty HTTP client", e); } } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 异步处理HTTP请求 HttpServletRequest httpRequest = (HttpServletRequest) request; HttpServletResponse httpResponse = (HttpServletResponse) response; AsyncContext asyncContext = httpRequest.startAsync(); asyncContext.setTimeout(0); // 禁用超时 asyncContext.addListener(new AsyncHandler(client, chain, asyncContext)); } @Override public void destroy() { // 关闭Jetty的HTTP客户端 try { client.stop(); } catch (Exception e) { // 忽略异常 } } private static class AsyncHandler implements javax.servlet.AsyncListener { private final HttpClient client; private final FilterChain chain; private final AsyncContext asyncContext; private Request proxyRequest; public AsyncHandler(HttpClient client, FilterChain chain, AsyncContext asyncContext) { this.client = client; this.chain = chain; this.asyncContext = asyncContext; } @Override public void onTimeout(javax.servlet.AsyncEvent event) throws IOException { // 处理超时事件 event.getAsyncContext().complete(); } @Override public void onError(javax.servlet.AsyncEvent event) throws IOException { // 处理异常事件 event.getAsyncContext().complete(); } @Override public void onStartAsync(javax.servlet.AsyncEvent event) throws IOException { // 处理异步开始事件 try { // 创建异步HTTP请求 HttpServletRequest httpRequest = (HttpServletRequest) event.getAsyncContext().getRequest(); String targetUrl = httpRequest.getRequestURI(); HttpFields headers = new HttpFields(); httpRequest.getHeaderNames().asIterator().forEachRemaining(name -> { httpRequest.getHeaders(name).asIterator().forEachRemaining(value -> { headers.put(name, value); }); }); HttpMethod method = HttpMethod.fromString(httpRequest.getMethod()); ContentResponseListener listener = new ContentResponseListener(); proxyRequest = client.newRequest(targetUrl) .method(method) .version(HttpVersion.fromString(httpRequest.getProtocol())) .headers(headers) .contentListener(listener); if (httpRequest.getContentLength() > 0) { proxyRequest.content(httpRequest.getInputStream()); } Future<ContentResponse> future = proxyRequest.send(listener); asyncContext.addListener(new FutureHandler(future, asyncContext)); } catch (Exception e) { throw new IOException("Failed to create proxy request", e); } } @Override public void onComplete(javax.servlet.AsyncEvent event) throws IOException { // 处理异步完成事件 try { // 获取异步HTTP响应并返回给客户端 ContentResponse proxyResponse = proxyRequest.get(); HttpServletResponse httpResponse = (HttpServletResponse) event.getAsyncContext().getResponse(); httpResponse.setStatus(proxyResponse.getStatus()); proxyResponse.getHeaders().forEach(header -> { httpResponse.addHeader(header.getName(), header.getValue()); }); httpResponse.getOutputStream().write(proxyResponse.getContent()); httpResponse.getOutputStream().flush(); } catch (Exception e) { throw new IOException("Failed to process proxy response", e); } finally { asyncContext.complete(); } } } private static class ContentResponseListener extends BufferingResponseListener { @Override public void onComplete(Result result) { // 忽略异步HTTP响应的完成事件 } } private static class FutureHandler implements javax.servlet.AsyncListener { private final Future<ContentResponse> future; private final AsyncContext asyncContext; public FutureHandler(Future<ContentResponse> future, AsyncContext asyncContext) { this.future = future; this.asyncContext = asyncContext; } @Override public void onTimeout(javax.servlet.AsyncEvent event) throws IOException { // 处理超时事件 future.cancel(true); event.getAsyncContext().complete(); } @Override public void onError(javax.servlet.AsyncEvent event) throws IOException { // 处理异常事件 future.cancel(true); event.getAsyncContext().complete(); } @Override public void onStartAsync(javax.servlet.AsyncEvent event) throws IOException { // 忽略异步开始事件 } @Override public void onComplete(javax.servlet.AsyncEvent event) throws IOException { // 忽略异步完成事件 } } } ``` 在这个示例代码中,我们使用了Jetty的HTTP客户端来实现异步的Servlet代理。在过滤器中,我们将HTTP请求转换为异步处理,并在异步回调中将请求转发给目标服务。在转发请求时,我们使用了Jetty的HTTP客户端发送异步HTTP请求,并在异步回调中获取HTTP响应并返回给客户端。同时,在异步处理过程中,我们禁用了超时机制,以确保异步处理不会被中断。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值