[英]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);
Looping data & storing in Vector data 循环数据并存储在Vector数据中
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.