2013-03-07 2 views
10

У меня есть веб-приложение с конфигурацией на основе Spring java с (jsp) view resolver. Теперь я хочу показать лист excel с некоторыми данными, когда пользователь нажимает на значок excel в приложении. По всему интернету я нашел только конфигурацию Spring на основе xml для просмотра excel, с которой я не знаком. Я до некоторой степени расшифровал и пришел довольно близко, чтобы выполнить мою задачу. Вот что я получил.Весна Java config for excel view resolver

У меня есть подобный контроллер и домашнюю страницу согласно приведенной ниже ссылке:

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

}

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

}

передний конец Код:

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. Я уверен, что viewversion превращает его в jsp view. Может кто-нибудь указать, как я могу это исправить.

EDIT

Я видел этот 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 конфиги

Редактировать (Вот мой код после внесения изменений, как вы сказали)

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 Код: выход

@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 

EDIT:

заголовка ответа:

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, изменить как ваши бобы соединены вместе, создают какую-либо услугу или что-нибудь. Просто создайте экземпляр своего пользовательского представления, передайте все, что вам нужно, чтобы создать таблицу, а затем установите представление в ModelAndView. Просто как тот.

EDIT - Вы должны это сделать ...

Вам нужно изменить вызов 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

+1

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

+0

Я видел этот учебник. Там он использует xml view resolver. Я использую конфигурацию Spring java. поэтому я хочу что-то эквивалентное java config. – javaMan

Смежные вопросы