有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

jsp如何使用Java以CSV格式导出数据?

原因可能是缺乏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文件中(其中包含导出选项)

如有任何意见,将不胜感激


共 (2) 个答案

  1. # 1 楼答案

    下面是一个可用于导出到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的方式工作

    以下是您的代码应该如何编写:

    假设你有一门课叫用户。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将servlet链接到url。xml:

    <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();
               } 
          }
     }
    
  2. # 2 楼答案

    在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这样的现有库。这将考虑到更复杂的需求,还可以通过自动处理逃跑或特殊情况来避免麻烦