0

I have a jsp (itemSearch.jsp) to display all items based on user submission. Once the user submits i am calling java method to submit all parameters as shown below

submitItems = itemManager.getProcessedItems(1, itemID, startPage, endPage, fromDate, toDate);

here in getProcessedItems i am fetching data using JDBC connection

public ArrayList getProcessedItems(1, itemID, startPage, endPage, fromDate, toDate) {
ArrayList p_items=new ArrayList();
Connection connection = null;
String sqlStatement = null;

try {
            connection = DBManager.getConnection(DBManager.EPM_DATASOURCE_NAME);
            if(set==1) {

                sqlStatement =  "SELECT I.lineid, I.date,S.STATUS, S.DATETIME, ";
                sqlStatement += "S.TOTAL FROM ITEM I, LITEM LI, ITEM_STATUS S ";
                sqlStatement += "WHERE I.LINEID=LI.ID AND I.ITEMID=? ";

                if (fromDate !=null && toDate!=null){
                    SimpleDateFormat fd = new SimpleDateFormat("MM/dd/yyyy");
                    String fromdateString = fd.format(fromDate);
                    String todateString = fd.format(toDate);
                    sqlStatement += " AND I.PDATE BETWEEN RANGE_DATE('" + fd.format(fromDate) + "','MM/DD/YYYY') AND RANGE_DATE('" + fd.format(toDate) + "','MM/DD/YYYY')";

                }           
                sqlStatement += "ORDER BY I.PDATE DESC";
            } 

            PreparedStatement ps = connection.prepareStatement(paginationBegin+sqlStatement+paginationEnd);
            ps.setInt(1, ID);
            ResultSet rs = ps.executeQuery();
            while(rs.next()) {
                if(items.contains(new Integer(rs.getInt("itemid")))==false) {
                items.add(new Integer(rs.getInt("itemid")));
                ReportItem ri = new ReportItem();
                 ri.setLineItemID(rs.getInt("lineid"));
                 ri.setTransmitted(rs.getTimestamp("idate"));
                 ri.setStatus(rs.getString("status"));
                 ri.setStatusDateTime(rs.getTimestamp("s_datetime"));
                 p_items.add(ri);
                }
               }
            rs.close();
            ps.close();
        } catch (SQLException e) {
            log("ERROR");
        } catch (NamingException e) {
            log("ERROR");
        } finally {
            DBManager.closeConnection(connection);
        }

        return p_items;
}

This properly displays data in itemSearch.jsp but now i want to add CSV file (hyperlink in jsp) which contains displayed data in the file for downloading.

i.e

<div align="right" class="TableRows" style="padding-right:10px"><a href="" class="TableRowLinks">CSV File</a></div> 

Questions 1. How to generate CSV file from queried result ? 2. How to give link for the same in jsp file?

Mad-D
  • 4,479
  • 18
  • 52
  • 93

3 Answers3

4

You can use SuperCSV

Why do you want to write in a JSP file? Use servlet for it, just create a file with .csv extension and write your response in it.

Code Sample:

class Order {
    Integer orderNumber;
    Integer parentOrder;
    Integer productNumber;
    String  userComment;

    public Integer getOrderNumber() {
        return orderNumber;
    }
    public void setOrderNumber(int orderNumber) {
        this.orderNumber = orderNumber;
    }
    public Integer getParentOrder() {
        return parentOrder;
    }
    public void setParentOrder(int parentOrder) {
        this.parentOrder = parentOrder;
    }
    public Integer getProductNumber() {
        return productNumber;
    }
    public void setProductNumber(int productNumber) {
        this.productNumber = productNumber;
    }
    public String getUserComment() {
        return userComment;
    }
    public void setUserComment(String userComment) {
        this.userComment = userComment;
    }
}

Writing partial objects to a CSV file

public void should_partial_write() throws Exception {
    // The data to write
    Order mainOrder = new Order();
    mainOrder.setOrderNumber(1);
    mainOrder.setProductNumber(42);
    mainOrder.setUserComment("some comment");
    Order subOorder = new Order();
    subOorder.setOrderNumber(2);
    subOorder.setParentOrder(1);
    subOorder.setProductNumber(43);

    // for testing write to a string rather than a file
    StringWriter outFile = new StringWriter();

    // setup header for the file and processors. Notice the match between the header and the attributes of the
    // objects to write. The rules are that
    // - if optional "parent orders" are absent, write -1
    // - and optional user comments absent are written as ""
    String[] header = new String[] { "orderNumber", "parentOrder", "productNumber", "userComment" };
    CellProcessor[] Processing = new CellProcessor[] { null, new ConvertNullTo(-1), null, new ConvertNullTo("\"\"") };

    // write the partial data
    CsvBeanWriter writer = new CsvBeanWriter(outFile, CsvPreference.EXCEL_PREFERENCE);
    writer.writeHeader(header);
    writer.write(mainOrder, header, Processing);
    writer.write(subOorder, header, Processing);
    writer.close();

    // show output
    System.out.println(outFile.toString());
}
Sanjay Kumar
  • 1,474
  • 14
  • 22
  • I am looking for solution where i can generate/write data into csv just after my JDBC query so that i can avoid creating pojo and storing my result-set. – Mad-D Dec 29 '11 at 03:36
3

Provide a link to the servlet that can generate the CSV as shown below

<a href="CsvServlet" class="TableRowLinks">CSV File</a>

Let the servlet set the MIME type for CSV as text/comma-separated-values or text/csv. Create the CSV file using open source libraries: CSV API for Java .

Sample code

public class CsvServlet extends HttpServlet 
{
     public void doPost(HttpServletRequest req, HttpServletResponse res)
                        throws ServletException, IOException  
    {
          res.setContentType("text/csv");
          res.setHeader("Cache-Control", "public");
          res.setHeader("Pragma", "public");
          res.setHeader("Content-Disposition", "attachment;  filename= \"test.csv"+ "\"");

          //create csv out of data from db and stream it to res.getOutputStream()
    }
}
Community
  • 1
  • 1
Aravind Yarram
  • 78,777
  • 46
  • 231
  • 327
  • Sorry, I am not sure how to use this. Can you be more precise ? – Mad-D Dec 29 '11 at 03:48
  • @Mad-D Servlets should be used for generating binary content. So I suggested you to call the servlet (through href) and it will take care of generating the CSV file and then write it to servlet output stream – Aravind Yarram Dec 29 '11 at 04:31
  • This is what i did. `CSV File` so endup passing parameters. But not sure how can i retreview this in `doPost` request. I tried `request.getAttribute("reportItems")` and `request.getParameter("reportItems")`. What am i doing wrong ? – Mad-D Dec 29 '11 at 19:20
  • @Mad-D In the first request you are calling getProcessedItems() to retrieve data from DB. Save this data in the HttpSession so that the data is available in the next request for CsvServlet. In the CsvServlet, get the data you set in earlier request. See this example http://www.javadb.com/get-and-set-session-variables-in-a-servlet – Aravind Yarram Dec 29 '11 at 19:44
1

In Jsp, Before calling CSVDowlaod upon click. I have saved data as

typeParam = 1;
idParam = itemID;
startPage= startPage;
endPage= endPage;
fromDate= fromDate;
toDate = toDate;

Sending parameters from JSP on CSV File link

 <div align="right" class="TableRows" style="padding-right:10px"><a href="/CSVDownlaod.epm?typeParam=<%=typeParam%>&idParam=<%=idParam%>&startPage=<%=startPage%>&endPage=<%=endPage%>&fromDate=<%=fDate%>&toDate=<%=tDate%>" class="TableRowLinks">CSV File</a></div>

Inside CSVDownlaod.epm, I have done two steps. 1. Receving request from JSP and Passing parameters to getProcessedItems method to get data ( for example )

int typeParam = Integer.parseInt(request.getParameter("typeParam"));
String fDate = request.getParameter("fromDate").trim();

reportData = Manager.getProcessedItems(1, itemID, startPage, endPage, fromDate, toDate);
  1. Looping data & storing in Vector data

  2. Write Data in CSV

    Need to define before try-catch 
    String fileName = name.csv
    String filePath = directory path 
    
    try {                   
            CSVWriter writer = new CSVWriter(filePath);
            writer.setQuoteMode(CSVWriter.DQUOTE_CONDITIONAL);
            writer.setHeader(newHeader);
            writer.write(data);
            file_written = true;
            data = null;
            HashMap model = new HashMap();
            model.put("fileName", fileName);
            model.put("filePath", filePath);
            model.put("delete_after", new Boolean(true));
            model.put("content_type", "application/vnd.ms-excel");              
            return new ModelAndView("fileView", model);
        } catch (IOException io) {
            System.out.println("ERROR :" + io.toString());
        }
    
Mad-D
  • 4,479
  • 18
  • 52
  • 93