【问题标题】:How to write data to CSV file in Java Application如何在 Java 应用程序中将数据写入 CSV 文件
【发布时间】:2011-12-29 03:21:02
【问题描述】:

我有一个 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文件中给出相同的链接?

【问题讨论】:

    标签: java jsp jakarta-ee jdbc csv


    【解决方案1】:

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

    【讨论】:

    • 我正在寻找可以在我的 JDBC 查询之后生成/写入数据到 csv 的解决方案,这样我就可以避免创建 pojo 和存储我的结果集。
    【解决方案2】:

    提供可以生成 CSV 的 servlet 的链接,如下所示

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

    让 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()
        }
    }
    

    【讨论】:

    • 对不起,我不知道如何使用它。你能说得更准确点吗?
    • @Mad-D Servlet 应该用于生成二进制内容。所以我建议你调用 servlet(通过 href),它会负责生成 CSV 文件,然后将其写入 servlet 输出流
    • 这就是我所做的。 &lt;a href="CsvServlet.epm?reportItems&lt;%=reportItems%&gt;" class="TableRowLinks"&gt;CSV File&lt;/a&gt; 所以最终传递参数。但不确定我如何在doPost 请求中重新审核此内容。我试过request.getAttribute("reportItems")request.getParameter("reportItems")。我做错了什么?
    • @Mad-D 在第一个请求中,您调用 getProcessedItems() 从数据库中检索数据。将此数据保存在 HttpSession 中,以便该数据在下一个 CsvServlet 请求中可用。在 CsvServlet 中,获取您在之前请求中设置的数据。见这个例子javadb.com/get-and-set-session-variables-in-a-servlet
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多