2013-03-07 9 views
10

Tôi có ứng dụng web dựa trên cấu hình java mùa xuân với trình giải quyết chế độ xem (jsp). Bây giờ tôi muốn hiển thị một bảng excel với một số dữ liệu khi người dùng nhấp vào biểu tượng excel trong ứng dụng. Tất cả qua internet tôi chỉ tìm thấy cấu hình mùa xuân dựa trên xml cho xem excel mà tôi không quen thuộc với. Tôi giải mã ở một mức độ nào đó và đến khá gần để hoàn thành nhiệm vụ của mình. Dưới đây là những gì tôi nhận được.Cấu hình Java mùa xuân cho trình phân giải chế độ xem excel

Tôi có điều khiển tương tự và chủ theo liên kết dưới đây:

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

}

Xem Code:

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

}

Giao diện người dùng Code:

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

Dưới đây là những gì tôi thấy trong nhật ký:

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 

Tôi không biết cách tránh chuyển tiếp nó tới xl.jsp. Tôi chắc chắn rằng trình phân giải chế độ xem đang biến nó thành chế độ xem jsp. Ai đó có thể chỉ ra cách tôi có thể sửa nó.

EDIT

tôi thấy xml này cấu hình tương đương trực tuyến. Bạn không chắc chắn làm thế nào để làm cho nó cấu hình 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> 

tôi đã cố gắng chuyển đổi nó theo cách dưới đây:

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

Tôi không biết những gì để đặt vào vị trí. Tôi không thể cho chuỗi. tôi không có quan điểm.xml như tôi sử dụng configs java

Sửa (Đây là mã của tôi sau khi thực hiện những thay đổi như bạn nói)

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

khiển 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; 
} 
    } 

Log đầu ra:

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:

đáp ứng Tiêu đề:

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 

Trả lời

9

Bạn có thể trả về một ModelAndView từ phương pháp điều khiển của bạn, thiết lập các View đến một instance của AbstractExcelView. Sau đó, bạn không cần phải gây rối với XML của bạn cả.

Chỉnh sửa: Thêm một số thông tin bổ sung: Tôi đã thực hiện phương pháp tiếp cận Chế độ xem tùy chỉnh nhiều lần để xử lý tải xuống CSV.

Trước tiên, bạn cần tạo một bản tóm tắt của AbstractExcelView. Bạn sẽ làm như vậy bằng cách ghi đè phương thức buildExcelDeocument(). Bạn sẽ cần thư viện POI, vì tôi tin rằng nó là bắt buộc. Ví dụ:

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

Tiếp theo, bạn cần phải sửa đổi các phương pháp điều khiển

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

Không cần chỉnh sửa XML ngữ cảnh của bạn, sửa đổi cách đậu của bạn được nối với nhau, tạo ra bất kỳ dịch vụ, hoặc bất cứ điều gì. Chỉ cần tạo một thể hiện của Chế độ xem tùy chỉnh của bạn, chuyển vào bất kỳ thứ gì bạn cần để tạo bảng tính, sau đó đặt chế độ xem trên ModelAndView. Đơn giản như thế.

EDIT - Bạn cần phải làm điều này ...

Bạn cần thay đổi cuộc gọi AJAX của bạn để bạn có thể nói nếu được thực hiện hoặc đã có một lỗi của nó. Bạn đang bay mù ngay bây giờ:

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

Bạn có thể trỏ đến một số ví dụ hoặc hiển thị một số mã. Cảm ơn – javaMan

+1

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

+0

Tôi đã xem hướng dẫn đó. Hiện anh đang sử dụng trình xem xml. tôi đang sử dụng cấu hình java mùa xuân. vì vậy tôi muốn một cái gì đó tương đương với cấu hình java. – javaMan