2011-12-29 52 views
0

我有一個jsp(itemSearch.jsp)來顯示基於用戶提交的所有項目。一旦用戶提交我打電話的Java方法提交的所有參數,使用JDBC連接如何在Java應用程序中將數據寫入CSV文件

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

getProcessedItems我正在讀取數據如下圖所示

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

這兒,這可以正確顯示數據itemSearch.jsp但現在我想添加CSV文件(jsp中的超鏈接),其中包含文件中顯示的數據供下載。

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

問題 1.如何從查詢結果CSV文件? 2.如何在jsp文件中提供相同的鏈接?

回答

4

您可以使用SuperCSV

你爲什麼要在JSP文件中寫? 使用servlet,只需創建一個擴展名爲.csv的文件並在其中寫入響應。

代碼示例:

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

寫作部分對象到CSV文件

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

我正在尋找解決方案,我可以生成/寫入數據int o在我的JDBC查詢之後的csv,以便我可以避免創建pojo並存儲我的結果集。 – 2011-12-29 03:36:11

3

提供一個鏈接,可以生成CSV如下圖所示

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

讓的servlet該servlet將CSV的MIME類型設置爲text/comma-separated-values or text/csv。使用開源庫創建CSV文件:CSV API for Java

示例代碼

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() 
    } 
} 
+0

對不起,我不知道如何使用它。你能更精確嗎? – 2011-12-29 03:48:18

+0

@ Mad-D Servlets應該用於生成二進制內容。所以我建議你調用servlet(通過href),它將負責生成CSV文件,然後將它寫入servlet輸出流 – 2011-12-29 04:31:22

+0

這就是我所做的。 'CSV File'這樣endup傳遞參數。但不知道如何在'doPost'請求中重新查看此內容。我嘗試過'request.getAttribute(「reportItems」)''和'request.getParameter(「reportItems」)''。我究竟做錯了什麼 ? – 2011-12-29 19:20:42

1

在JSP中,調用CSVDowlaod在點擊之前。我已保存數據

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

從JSP的CSV文件鏈接

<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> 

內CSVDownlaod.epm發送參數,我已經做了兩步。 1.從JSP Receving請求和將參數傳遞給getProcessedItems方法來獲得數據(例如)

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

reportData = Manager.getProcessedItems(1, itemID, startPage, endPage, fromDate, toDate); 
  1. 循環數據&在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()); 
        } 
    
    在矢量數據

  2. 寫入數據存儲