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

Java应用程序中如何将数据写入CSV文件,java,jsp,jakarta-ee,jdbc,csv,Java,Jsp,Jakarta Ee,Jdbc,Csv,我有一个jsp(itemSearch.jsp)来显示基于用户提交的所有项目。一旦用户提交,我将调用java方法提交所有参数,如下所示 submitItems = itemManager.getProcessedItems(1, itemID, startPage, endPage, fromDate, toDate); <a href="CsvServlet" class="TableRowLinks">CSV File</a> 在getProcessedItems中

我有一个jsp(itemSearch.jsp)来显示基于用户提交的所有项目。一旦用户提交,我将调用java方法提交所有参数,如下所示

submitItems = itemManager.getProcessedItems(1, itemID, startPage, endPage, fromDate, toDate);
<a href="CsvServlet" class="TableRowLinks">CSV File</a>
在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中的超链接),该文件包含要下载的文件中显示的数据

i、 e


问题 1.如何根据查询结果生成CSV文件? 2.如何在jsp文件中提供相同的链接

您可以使用

为什么要在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的链接,如下所示

submitItems = itemManager.getProcessedItems(1, itemID, startPage, endPage, fromDate, toDate);
<a href="CsvServlet" class="TableRowLinks">CSV File</a>

在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>
  • 循环数据&存储在矢量数据中

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

  • 我正在寻找一种解决方案,在JDBC查询之后,我可以生成/将数据写入csv,这样我就可以避免创建pojo和存储我的结果集。对不起,我不知道如何使用它。你能说得更准确些吗?@Mad-D servlet应该用于生成二进制内容。所以我建议您调用servlet(通过href),它将负责生成CSV文件,然后将其写入servlet输出流这就是我所做的<代码>因此结束传递参数。但不确定如何在
    doPost
    请求中重新查看此内容。我尝试了
    request.getAttribute(“reportItems”)
    request.getParameter(“reportItems”)
    。我做错了什么?@Mad-D在第一个请求中,您正在调用getProcessedItems()从DB检索数据。将此数据保存在HttpSession中,以便在下一个CsvServlet请求中可以使用该数据。在CsvServlet中,获取您在早期请求中设置的数据。看这个例子
    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());
        }