2013-03-07 9 views
10

私は(jsp)viewリゾルバを持つSpring javaコンフィグレーションベースのWebアプリケーションを持っています。 今、私はユーザーがアプリケーションのExcelアイコンをクリックすると、いくつかのデータを含むExcelシートを表示したいと思います。 インターネット上で私は唯一のXMLベースの春の設定を私が慣れていないとExcelビューのために見つかりました。 私はある程度解読し、私の仕事を終わらせるのにかなり近づきました。以下は私が得たものです。spring 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同等の設定を見

EDIT

。それjavaのコンフィグ作成する方法がわからない:私は場所に置くために何を知らない

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

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

私はそれを以下の方法で変換してみました。私は文字列を与えることができません。私は意見がありません。

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

コントローラコードを使用していて

編集:

レスポンスヘッダ:

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

あなたはAbstractExcelViewのインスタンスにViewを設定し、お使いのコントローラメソッドからModelAndViewを返すことができます。それで、あなたのXMLをまったく混乱させる必要はありません。

編集:いくつかの追加情報を追加してください: 私はCSVダウンロードを処理するためにカスタムの表示方法を何度もやりました。

まず、AbstractExcelViewのインスタンスを作成する必要があります。これを行うには、buildExcelDeocument()メソッドを上書きします。 POIライブラリが必要ですが、必要と思われます。たとえば:あなたはコントローラのメソッド

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

を変更する必要が

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

次に、あなたのコンテキスト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リゾルバを使用しています。私は春のJavaの設定を使用しています。だから私は何かjava設定同等のものをしたい。 – javaMan

関連する問題