2011-12-29 51 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. 写入数据存储