简体   繁体   English

如何在Java应用程序中将数据写入CSV文件

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

I have a jsp (itemSearch.jsp) to display all items based on user submission. 我有一个jsp(itemSearch.jsp),可以根据用户提交显示所有项目。 Once the user submits i am calling java method to submit all parameters as shown below 用户提交后,我将调用java方法来提交所有参数,如下所示

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

here in getProcessedItems i am fetching data using JDBC connection 在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;
}

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. 这样可以在itemSearch.jsp中正确显示数据,但现在我想添加CSV文件(jsp中的超链接),该文件包含文件中显示的数据以供下载。

ie

<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 ? 问题1.如何从查询结果生成CSV文件? 2. How to give link for the same in jsp file? 2.如何在jsp文件中提供相同的链接?

You can use SuperCSV 您可以使用SuperCSV

Why do you want to write in a JSP file? 为什么要写一个JSP文件? Use servlet for it, just create a file with .csv extension and write your response in it. 为此使用servlet,只需创建一个扩展名为.csv的文件并在其中写入您的响应即可。

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 将部分对象写入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());
}

Provide a link to the servlet that can generate the CSV as shown below 提供指向可以生成CSV的servlet的链接,如下所示

<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 . 让Servlet将CSV的MIME类型设置为text / comma-separated-values或text / csv Create the CSV file using open source libraries: CSV API for Java . 使用开源库创建CSV文件: 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()
    }
}

In Jsp, Before calling CSVDowlaod upon click. 在Jsp中,单击之前调用CSVDowlaod。 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 通过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>

Inside CSVDownlaod.epm, I have done two steps. 在CSVDownlaod.epm中,我完成了两个步骤。 1. Receving request from JSP and Passing parameters to getProcessedItems method to get data ( for example ) 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. Looping data & storing in Vector data 循环数据并存储在Vector数据中

  2. Write Data in CSV 以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