[英]How to export data in CSV format using Java?
原因可能是Java :(的知识不足),所以我问这个问题,
在这段代码中,我正在从jsp页面获取动态值:
<form action="">
<%
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://localhost/apps","root","root");
Statement stmt = con.createStatement();
String sql = "select * from info;";
ResultSet rs = stmt.executeQuery(sql);
System.out.println(sql);
System.out.println("hi Tirtha");
%>
<center>
<h3>Information of User's</h3>
<table cellpadding="4" cellspacing="2" border="1" bgcolor="">
<tr>
<th>User Name</th>
<th>Email Id</th>
</tr>
<tr>
<%while(rs.next()){%>
<td><input type="text" name="name" value="<%= rs.getString(1)%>" readonly="readonly">
<td><input type="text" name="email" value="<%= rs.getString(2)%>" readonly="readonly">
</tr>
<%}%>
</table>
</center>
</form>
现在,我想将此数据保存在一个csv文件中 (其中具有导出选项)。
任何输入将不胜感激。
这是您可以用来导出为CSV的类:
import java.io.FileWriter;
import java.io.IOException;
import User;
public class GenerateCsv
{
private static void generateCsvFile(ArrayList<User> users)
{
String output = "Email, Name\n";
for (User user in users) {
output += user.getEmail() + ", " + user.getName() + "\n";
}
return output;
}
}
以MVC方式工作
这是编写代码的方式:
假设您有一个名为的类。 User.java中有一个名为get all users的静态函数。
public class User {
String name;
String email;
public static ArrayList<User> getAllUsers() {
// returns all users
...
}
}
然后,假设您有一个名为UsersServlet的servlet,它可以获取这些用户:
import javax.servlet.*;
import javax.servlet.http.*;
public class UsersServlet extends HttpServlet {
public void doGet (HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
res.setContentType("application/csv");
PrintWriter w = res.getWriter();
ArrayList<User> users = Users.getAllUsers();
w.prinln(GenerateCsv.generateCsvFile(users));
w.flush();
w.close();
}
public void doPost (HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
...
}
}
例如,在您的jsp中,您将有一个简单的锚标记,该标记调用servlet(这些servlet调用User.java,获取数据,将它们形成CSV,然后将其输出到浏览器...)。 这样的事情会起作用:
<a href='/getCSV' > Export CSV </a>
但请注意,您必须使用web.xml将servlet链接到url :
<web-app>
<servlet>
<servlet-name>UsersServlet</servlet-name>
<servlet-class>__package__.UsersServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UsersServlet</servlet-name>
<url-pattern>getCSV</url-pattern>
</servlet-mapping>
</web-app>
编辑:写入磁盘而不是发送到浏览器
import java.io.FileWriter;
import java.io.IOException;
import User;
public class GenerateCsv
{
private static void generateCsvFile(String fileName, ArrayList<User> users)
{
try
{
FileWriter writer = new FileWriter(fileName);
writer.append("Email");
writer.append(',');
writer.append("Name");
writer.append('\n');
for (User user in users) {
writer.append(user.getEmail());
writer.append(',');
writer.append(user.getName());
writer.append('\n');
}
writer.flush();
writer.close();
} catch(IOException e) {
e.printStackTrace();
}
}
}
在JSP中嵌入代码通常是不好的做法,最好使用servlet,java类或诸如Spring,JSF,Struts等Web框架。
但是,使用上面的示例。 最简单的方法是创建另一个JSP页面,如下所示:
<%@page contentType="text/text" %>
<%
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://localhost/apps","root","root");
Statement stmt = con.createStatement();
String sql = "select * from info;";
ResultSet rs = stmt.executeQuery(sql);
%>
<%
while(rs.next()){
out.println("\"" + rs.getString(1) + "\", \"" + rs.getString(2) + "\"\n");
}%>
<% //cleanup and close db access %>
这会将内容类型设置为文本文件,以便浏览器可以正确显示它。 然后,对记录集进行迭代,并输出一行,两个字段都用引号引起来,并以\\n
换行符结尾。 然后,在您的原始页面上,您将仅具有指向该新JSP页面的链接以下载CSV。
或者,您可以使用现有的库,例如OpenCSV 。 这将允许更复杂的需求,并且还可以通过自动处理转义或特殊情况来避免头痛。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.