如何在Java Application中将数据写入CSV文件

时间:2011-12-29 03:21:02

标签: java jsp java-ee jdbc csv

我有一个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文件中为其提供链接?

3 个答案:

答案 0 :(得分: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());
}

答案 1 :(得分:3)

提供可以生成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()
    }
}

答案 2 :(得分:1)

在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. 循环数据&amp;存储在矢量数据

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