Monday, July 16, 2012

Export to Excel using spring and Apache POI.


First include the poi jar file downloaded from apache poi.

Entry in application-servlet.xml:

<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" />
   
    <bean class="org.springframework.web.servlet.view.XmlViewResolver">
         <property name="location">
             <value>/WEB-INF/spring-excel-views.xml</value>
         </property>
         <property name="order" value="0" />
      </bean>

<bean id="ExcelRevenueSummary"         class="com.application.utility.ExcelRevenueReportView" />


Entry in spring-excel-views.xml :

<beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

      <bean id="ExcelRevenueSummary"
            class="com.application.utility.ExcelRevenueReportView">
      </bean>
</beans>

RevenueReportController.java class :

package com.application.utility;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;

@Controller
@RequestMapping("/exportForClient.htm")
public class RevenueReportController extends AbstractController{

      @Override
      protected ModelAndView handleRequestInternal(HttpServletRequest request,
                  HttpServletResponse response) throws Exception {
           
            //String output = ServletRequestUtils.getStringParameter(request, "output");
           
            //dummy data
            Map<String,String> revenueData = new HashMap<String,String>();
            revenueData.put("Jan/2012", "$10");
            revenueData.put("Feb/2012", "$110,000");
            revenueData.put("Mar/2012", "$130,000");
            revenueData.put("Apr/2012", "$140,000,000");
            revenueData.put("May/2012", "$220,000,000");
           
            System.out.println("RevenueReportController.handleRequestInternal()");
            return new ModelAndView("ExcelRevenueSummary","revenueData",revenueData);
           
      /*    if(output ==null || "".equals(output)){
                  //return normal view
                  return new ModelAndView("RevenueSummary","revenueData",revenueData);
                 
            }else if("EXCEL".equals(output.toUpperCase())){
                  //return excel view
                  return new ModelAndView("ExcelRevenueSummary","revenueData",revenueData);
                 
            }else{
                  //return normal view
                  return new ModelAndView("RevenueSummary","revenueData",revenueData);
                 
            }
      */   
      }
     
}

The commented part can be used to forward your view at different location.

ExcelRevenueReportView.java class :

package com.application.utility;

import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.springframework.web.servlet.view.document.AbstractExcelView;

public class ExcelRevenueReportView extends AbstractExcelView{
     
      @Override
      protected void buildExcelDocument(Map model, HSSFWorkbook workbook,
                  HttpServletRequest request, HttpServletResponse response)
                  throws Exception {
           
           
            Map<String,String> revenueData = (Map<String,String>) model.get("revenueData");
            //create a wordsheet
            HSSFSheet sheet = workbook.createSheet("Data Report");
           
            HSSFRow header = sheet.createRow(0);
            header.createCell(0).setCellValue("Month");
            header.createCell(1).setCellValue("Data");
           
            int rowNum = 1;
            for (Map.Entry<String, String> entry : revenueData.entrySet()) {
                  //create the row data
                  HSSFRow row = sheet.createRow(rowNum++);
                  row.createCell(0).setCellValue(entry.getKey());
                  row.createCell(1).setCellValue(entry.getValue());
                 
        }
      }
}

Call this from your onSubmit method of your controller according to the condition you required.

return "redirect:exportForClient.htm"; 

No comments:

Post a Comment