簡體   English   中英

如何在Java應用程序中將數據寫入CSV文件

[英]How to write data to CSV file in Java Application

我有一個jsp(itemSearch.jsp),可以根據用戶提交顯示所有項目。 用戶提交后,我將調用java方法來提交所有參數,如下所示

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

在getProcessedItems中,我正在使用JDBC連接獲取數據

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

這樣可以在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文件中提供相同的鏈接?

您可以使用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());
}

提供指向可以生成CSV的servlet的鏈接,如下所示

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

讓Servlet將CSV的MIME類型設置為text / comma-separated-values或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()
    }
}

在Jsp中,單擊之前調用CSVDowlaod。 我已將數據另存為

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

通過CSV文件鏈接從JSP發送參數

 <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的請求,並將參數傳遞給getProcessedItems方法以獲取數據(例如)

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

reportData = Manager.getProcessedItems(1, itemID, startPage, endPage, fromDate, toDate);
  1. 循環數據並存儲在Vector數據中

  2. 以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()); } 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM