2013-03-07 74 views
10

我有一个基于spring java配置的web应用程序与(jsp)视图解析器。 现在,我想在用户单击应用程序中的Excel图标时显示一些Excel数据表。 所有通过互联网我只发现基于XML的春天配置为我不熟悉的Excel视图。我在某种程度上进行了解码,并且非常接近完成我的任务。以下是我得到的。春天的Java配置的Excel视图解析器

我也有类似的控制器和网页下面的链接如下:

http://static.springsource.org/spring/docs/3.0.0.M3/reference/html/ch17s06.html

Controlle代码:

@Controller 
public class ExcelController extends AbstractController { 

@Override 
@RequestMapping(value = "/Excel", method = RequestMethod.POST) 
protected ModelAndView handleRequestInternal(HttpServletRequest request, 
     HttpServletResponse response) throws Exception { 
    BufferedReader in = null; 
    try { 
      URL oracle = new URL("example.com"); 
      URLConnection yc =null; 
       yc = oracle.openConnection(); 
        in = new BufferedReader(
         new InputStreamReader(
         yc.getInputStream())); 
    } 
    catch(Exception e){ 
     System.err.println(e); 
    } 
    Map map = new HashMap(); 
    map.put("input", in); 

    return new ModelAndView("xl", map); 
} 

}

查看代码:

public class ExcelReportView extends AbstractExcelView{ 

@Override 
protected void buildExcelDocument(Map model, HSSFWorkbook workbook, 
    HttpServletRequest request, HttpServletResponse response) 
    throws Exception { 
     HSSFSheet sheet; 
     HSSFRow row; 
     HSSFCell cell; 
    try { 
      BufferedReader in = (BufferedReader) model.get("input");    
      sheet=workbook.createSheet("spring"); 

        String inputLine; 
        int rowNum =0; 
         while ((inputLine = in.readLine()) != null) { 
          row = sheet.createRow(rowNum++); 
          String[] coloumns = inputLine.split("\t"); 
          int cellNum =0; 
          for(String coloumn: coloumns){ 
            cell = row.createCell(cellNum++); 
            cell.setCellValue(coloumn); 
          } 
          System.out.println(inputLine); 
       } 
         in.close(); 
         System.out.println("Excel written successfully.."); 

       } catch (IOException e) { 
        e.printStackTrace(); 
       } 

} }

view.properties

xl.class=package.ExcelReportView 

WebAppConfig.java

@Configuration 
@EnableWebMvc 
@ComponentScan(basePackages = "package") 
public class WebAppContextConfig extends WebMvcConfigurerAdapter { 
// Resolve logical view names to .jsp resources in /WEB-INF/views directory 

@Bean 
public InternalResourceViewResolver configureInternalResourceViewResolver() { 
    InternalResourceViewResolver resolver = new InternalResourceViewResolver(); 
    resolver.setPrefix("/WEB-INF/jsp/"); 
    resolver.setSuffix(".jsp"); 
    return resolver; 
} 

@Override 
public void addResourceHandlers(ResourceHandlerRegistry registry) { 
    registry.addResourceHandler("/scripts/**").addResourceLocations(
      "/scripts/"); 
    registry.addResourceHandler("/css/**").addResourceLocations("/css/"); 
    registry.addResourceHandler("/img/**").addResourceLocations("/img/"); 
} 

}

前端代码:

function AjaxCallForExcel(){ 
    $.ajax({ 
     type: 'POST', 
     url: location.href + '/Excel', 
     data: ({name:name }) 
     }); 
    } 

下面是我看到日志:

DispatcherServlet with name 'appServlet' processing POST request for [/App/Excel] 
Looking up handler method for path /App/Excel 
Returning handler method [protected org.springframework.web.servlet.ModelAndView package.ExcelController.handleRequestInternal(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) throws java.lang.Exception] 
Returning cached instance of singleton bean 'excelController' 
Invoking afterPropertiesSet() on bean with name 'xl' 
Rendering view [org.springframework.web.servlet.view.JstlView: name 'xl'; URL [**/WEB-INF/jsp/xl.jsp**]] in DispatcherServlet with name 'appServlet' 
Added model object 'org.springframework.validation.BindingResult.input' of type [org.springframework.validation.BeanPropertyBindingResult] to request in view with name 'xl' 
Added model object 'input' of type [java.io.BufferedReader] to request in view with name 'xl' 
Forwarding to resource [/WEB-INF/jsp/xl.jsp] in InternalResourceView 'xl' 
Successfully completed request 

我不知道如何避免它转发它xl.jsp。我相信视图解析器正在把它变成jsp视图。有人可以指出我该如何修复它。

编辑

我在网上看到这个等价的xml配置。不知道如何使它Java的配置:

<bean id="excelViewResolver" class="org.springframework.web.servlet.view.XmlViewResolver"> 
    <property name="order" value="1"/> 
    <property name="location" value="/WEB-INF/views.xml"/> 
</bean> 

我尝试以下方式将其转换:

@Bean 
public XmlViewResolver configureXmlViewResolver(){ 
    XmlViewResolver resolver = new XmlViewResolver(); 
    resolver.setOrder(1); 
    resolver.setLocation(**WHAT SHOULD BE HERE**); 
} 

我不知道要放什么位置。我不能给字符串。我没有意见。由于我的XML用java CONFIGS

编辑(这里是我的代码进行更改后,就像你说的)

public class ExcelReportView extends AbstractExcelView{ 
BufferedReader in; 
ExcelReportView(BufferedReader in){ 
this.in = in; 
} 

@Override 
protected void buildExcelDocument(Map model, HSSFWorkbook workbook, 
    HttpServletRequest request, HttpServletResponse response) 
    throws Exception { 
     HSSFSheet sheet; 
     HSSFRow row; 
     HSSFCell cell; 
     response.setHeader("Content-Type", "application/octet-stream"); 
     response.setHeader("Content-Disposition", "attachment; filename=MyExcelSpreadsheet.xls"); 

    try { 
      //BufferedReader in = (BufferedReader) model.get("input");   
      sheet=workbook.createSheet("spring"); 

        String inputLine; 
        int rowNum =0; 
         while ((inputLine = in.readLine()) != null) { 
          row = sheet.createRow(rowNum++); 
          String[] coloumns = inputLine.split("\t"); 
          int cellNum =0; 
          for(String coloumn: coloumns){ 
            cell = row.createCell(cellNum++); 
            cell.setCellValue(coloumn); 
          } 
          System.out.println(inputLine); 
       } 
         in.close(); 
         System.out.println("Excel written successfully.."); 

       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
    OutputStream outStream = null; 

     try { 
      outStream = response.getOutputStream(); 
      workbook.write(outStream); 
      outStream.flush(); 
     } finally { 
      outStream.close(); 
     }  
    } 
    } 

控制器代码:

@Controller 
    public class ExcelController { 

@RequestMapping(value = "/Excel", method = RequestMethod.POST) 
protected ModelAndView generateCSV(HttpServletRequest request, 
     HttpServletResponse response) throws Exception { 
    BufferedReader in = null; 
    try { 
      URL oracle = new URL("http://service.com"); 
      URLConnection yc =null; 
       yc = oracle.openConnection(); 
        in = new BufferedReader(
         new InputStreamReader(
         yc.getInputStream())); 
    } 
    catch(Exception e){ 
     System.err.println(e); 
    } 
    ModelAndView mav = new ModelAndView(); 
    mav.setView(new ExcelReportView(in)); 
    return mav; 
} 
    } 

日志输出:

DispatcherServlet with name 'appServlet' processing POST request for [/App/Excel] 
    Looking up handler method for path /App/Excel 
    Returning handler method [protected org.springframework.web.servlet.ModelAndView com.package.ExcelController.generateCSV(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) throws java.lang.Exception] 
    Returning cached instance of singleton bean 'excelController' 
    Rendering view [com.package.controllers.ExcelReportView: unnamed] in DispatcherServlet with name 'appServlet' 
    Created Excel Workbook from scratch 
    Title Id required 
    Excel written successfully.. 
    Successfully completed request 

编辑:

响应头:

HTTP/1.1 200 OK 
Server: Apache-Coyote/1.1 
Pragma: private 
Cache-Control: private, must-revalidate 
Content-Disposition: attachment; filename=MyExcelSpreadsheet.xls 
Content-Type: application/octet-stream;charset=ISO-8859-1 
Content-Language: en-US 
Transfer-Encoding: chunked 
Date: Tue, 12 Mar 2013 16:36:52 GMT 

回答

9

您可以从您的控制器方法返回一个ModelAndView,该View设置的AbstractExcelView一个实例。那么你根本不需要搞砸你的XML。

编辑:添加一些附加信息: 我已经完成了多次自定义View方法来处理CSV下载。

首先,您需要创建AbstractExcelView的实例化。你可以通过覆盖buildExcelDeocument()方法来实现。您将需要POI库,因为我相信这是必需的。例如:

@Override 
public void buildExcelDocument(Map<String, Object> model, HSSFWorkbook workbook, 
           HttpServletRequest request, HttpServletResponse response) 
           throws Exception { 
    // Set the headers 
    response.setHeader("Content-Type", "application/octet-stream"); 
    response.setHeader("Content-Disposition", "attachment; filename=MyExcelSpreadsheet.xls"); 

    // Here is where you will want to put the code to build the Excel spreadsheet 

    OutputStream outStream = null; 

    try { 
     outStream = response.getOutputStream(); 
     workbook.write(outStream); 
     outStream.flush(); 
    } finally { 
     outStream.close(); 
    }  
} 

接下来,您需要修改控制器方法

@RequestMapping(params = "actionMethod="+Constants.ACTION_METHOD_REPORT) 
public ModelAndView generateCSV( 
     @ModelAttribute(Constants.REPORT_FORMBEAN_MODEL_ATTRIBUTE) FormBean formBean, 
     ModelAndView mav, 
     HttpServletRequest request, 
     HttpServletResponse response) { 
    mav.setView(new MyExcelView(/* modify your constructor to pass in your data so the view can build the output */)); 

    return mav; 
} 

无需编辑您的上下文XML,修改你的bean是如何连接在一起,创建任何服务,或任何东西。只需创建一个自定义视图的实例,传递您需要的任何内容以构建电子表格,然后在ModelAndView上设置视图。就那么简单。

编辑 - 你需要做到这一点...

你需要改变你的AJAX调用,这样就可以告诉我们,如果它做或有错误。你现在正在盲目飞行:

function AjaxCallForExcel(){ 
    $.ajax({ 
     type: 'POST', 
     url: location.href + '/Excel', 
     data: ({name:name }), 
     complete: function(jqXHR,textStatus) { 
           alert("Complete: "+textStatus); 
          }, 
     error: function(jqXHR,textStatus,errorThrown) { 
          alert("Status: "+textStatus+"\nerror: "+errorThrown); 
          } 
     }); 
    } 
+0

你可以指点一些例子或者显示一些代码。谢谢 – javaMan 2013-03-08 14:59:39

+1

http://www.mkyong.com/spring-mvc/spring-mvc-export-data-to-excel-file-via-abstractexcelview/ – CodeChimp 2013-03-08 20:43:24

+0

我看到了教程。他在那里使用XML视图解析器。我正在使用spring java配置。所以我想要一些Java配置等效。 – javaMan 2013-03-08 21:04:37