![](/img/trans.png)
[英]How to extract data from a text file and write into CSV file in Java
[英]How to write data to CSV file in Java Application
我有一個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文件中提供相同的鏈接?
您可以使用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());
}
提供指向可以生成CSV的servlet的鏈接,如下所示
<a href="CsvServlet" class="TableRowLinks">CSV File</a>
讓Servlet將CSV的MIME類型設置為text / comma-separated-values或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()
}
}
在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);
循環數據並存儲在Vector數據中
以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.