2013-03-07 8 views
10

Ich habe eine Feder Java-Config-basierte Web-App mit (jsp) Ansicht Resolver. Jetzt möchte ich mit einigen Daten, die eine Excel-Tabelle zeigen, wenn Benutzer auf Excel-Symbol in App klickt. Überall im Internet fand ich nur Xml basierte Federkonfiguration für Excel-Ansicht, mit der ich nicht vertraut bin. Ich entschlüsselte etwas und kam mir ziemlich nahe, um meine Aufgabe zu erledigen. Unten ist was ich habe.Frühjahr Java Config für Excel-Ansicht Resolver

Ich habe Ähnliche Controller und Homepage nach dem untenstehenden Link:

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

Controlle Code:

@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); 
} 

}

Code anzeigen:

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/"); 
} 

}

Front-End-Code:

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

Im Folgenden finden Sie, was ich sehe in Protokollen:

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 

Ich weiß nicht, wie es zu vermeiden, deren Weiterleitung an xl.jsp. Ich bin mir sicher, dass View Resolver es in die Jsp-Ansicht verwandelt. Kann jemand darauf hinweisen, wie ich es beheben kann?

EDIT

habe ich diesen xml Online-Äquivalent-Konfig. Nicht sicher, wie es Java-Config machen:

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

Ich versuchte es die folgende Art und Weise umzuwandeln:

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

Ich weiß nicht, was in Position zu bringen. Ich kann keine Saite geben. Ich habe keine Aussicht.xml wie ich benutze bin java configs

bearbeiten (Hier ist mein Code ändert, nachdem Sie wie Sie gesagt haben)

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-Code:

@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; 
} 
    } 

Protokollausgabe:

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 

EDIT:

Response-Header:

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 

Antwort

9

Sie können eine ModelAndView von Ihrem Controller-Methode zurückzukehren, die View auf eine Instanz AbstractExcelView Einstellung. Dann müssen Sie sich nicht mit Ihrem XML-Code herumschlagen.

Bearbeiten: Fügen Sie einige zusätzliche Informationen hinzu: Ich habe die benutzerdefinierte Ansicht Ansatz viele Male CSV-Downloads zu behandeln.

Zuerst müssen Sie eine Instanziierung von AbstractExcelView erstellen. Sie würden dies tun, indem Sie die buildExcelDecument() -Methode überschreiben. Sie werden die POI-Bibliotheken benötigen, da ich glaube, dass es erforderlich ist. Zum Beispiel:

@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(); 
    }  
} 

Als nächstes müssen Sie den Controller Methode

@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; 
} 

Es besteht keine Notwendigkeit ändern, um Ihre Kontext XML zu bearbeiten, ändern, wie Sie Ihre Bohnen zusammen verdrahtet sind, erstellen Sie alle Dienste, oder irgendetwas. Erstellen Sie einfach eine Instanz Ihrer benutzerdefinierten Ansicht, übergeben Sie alles, was Sie benötigen, um die Tabelle zu erstellen, und legen Sie dann die Ansicht auf ModelAndView fest. So einfach ist das.

EDIT - Sie müssen dies tun, ...

Sie benötigen eine AJAX-Aufruf zu ändern, damit Sie sagen können, wenn sie einen Fehler gemacht oder hatten. Sie fliegen gerade blind:

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

Können Sie auf ein Beispiel zeigen oder Code zeigen. Danke – javaMan

+1

http://www.mkyong.com/spring-mvc/spring-mvc-export-data-to-excel-file-via-abstractexcelview/ – CodeChimp

+0

Ich sah dieses Tutorial. Dort benutzt er den xml view resolver. Ich benutze Spring Java Config. also möchte ich etwas java config gleichwertig. – javaMan