我有一个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文件中为其提供链接?
答案 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);
循环数据&amp;存储在矢量数据
以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());
}