Почему скачанный файл Excel не содержит никаких данных? файл пуст - PullRequest
0 голосов
/ 10 июня 2019

привет всем, я создал один файл сервлета.он загружается в виде файла Excel, но не содержит никаких данных в нем, в то время как код создается для записи данных в файл Excel.В основном я сделал следующие шаги: - 1. получить доступ к данным из базы данных 2. распечатать эти данные в файл Excel.Теперь до этого работает в соответствии с ожидания, но теперь во время Excel файл загружается.в то время это пустой файл Excel, в котором нет данных.Почему это так? Пожалуйста, пролите немного света, я только начал изучать JAVA и SERVLET, действительно плохо знакомый с этим.

package servletProject;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.Charset;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Arrays;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;



@WebServlet("/ExcelFile")
public class CSVServlet extends HttpServlet {       
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    String emails = "xyz@gmail.com";

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        processRequest(req, resp);
    }

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)      throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        FileWriter writer =null;
        ResultSet rs=null;
        Connection con=null;
        PreparedStatement ps=null;
        try {
            String fileName = emails+"data.csv";
            System.out.println(fileName);
            ServletContext context = getServletContext();
            String mimeType = context.getMimeType(fileName);
            if (mimeType == null) {
                mimeType = "application/octet-stream";
            }
            response.setContentType(mimeType);
            String headerKey = "Content-Disposition";
            String headerValue = String.format("attachment; filename=\"%s\"", fileName);
            response.setHeader(headerKey, headerValue);
            ConnectionClass cn = new ConnectionClass();
            con = cn.connectDb();

         System.out.println("fileName"+fileName);

             writer = new FileWriter(fileName);
            //Write the CSV file header
            CSVUtils.writeLine(writer,Arrays.asList("NAME","email"));
             ps = con.prepareStatement("select firstName,email from employees");
            rs = ps.executeQuery();

            while (rs.next()) {
                System.out.println(rs.getString("firstName"));
                 CSVUtils.writeLine(writer,Arrays.asList(rs.getString("firstName"),rs.getString("email")));

            }

            writer.flush();
            writer.close();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
             try{ rs.close();ps.close();con.close();}catch (Exception e) {}
        }
    }
}



// DB connection File
public class ConnectionClass {


    public Connection connectDb() {

        Connection con=null;
        try {
            Class.forName("com.mysql.jdbc.Driver");  
             con=DriverManager.getConnection("jdbc:mysql://localhost:3306/classicmodels","root","root");  
        }catch (Exception e) {
            con=null;
        }

        if(con!=null)
            System.out.println("connected");
        else
            System.out.println("not connected");

        return con;
    }
}


//CSVUtil Files

package servletProject;

import java.io.IOException;
import java.io.Writer;
import java.util.List;

public class CSVUtils {

    private static final char DEFAULT_SEPARATOR = ',';

    public static void writeLine(Writer w, List<String> values) throws IOException {
        writeLine(w, values, DEFAULT_SEPARATOR, ' ');
    }

    public static void writeLine(Writer w, List<String> values, char separators) throws IOException {
        writeLine(w, values, separators, ' ');
    }

    // https://tools.ietf.org/html/rfc4180
    private static String followCVSformat(String value) {

        String result = value;
        if (result.contains("\"")) {
            result = result.replace("\"", "\"\"");
        }
        return result;

    }

    public static void writeLine(Writer w, List<String> values, char separators, char customQuote) throws IOException {

        boolean first = true;

        // default customQuote is empty

        if (separators == ' ') {
            separators = DEFAULT_SEPARATOR;
        }

        StringBuilder sb = new StringBuilder();
        for (String value : values) {
            if (!first) {
                sb.append(separators);
            }
            if (customQuote == ' ') {
                sb.append(followCVSformat(value));
            } else {
                sb.append(customQuote).append(followCVSformat(value)).append(customQuote);
            }

            first = false;
        }
        sb.append("\n");
        w.append(sb.toString());
    }

}

1 Ответ

0 голосов
/ 10 июня 2019

Вот версия, которая записывает в выходной поток ответа. Обратите внимание, что я изменил «Writer» на OutputStream вместо FileWriter, поскольку это то, что вы получаете из response.getOutputStream ().

protected void processRequest(HttpServletRequest request, HttpServletResponse response)      throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    OutputStream writer = response.getOutputStream();
    :
    //Write the CSV file header 
    //(no change from your code here.)
    CSVUtils.writeLine(writer,Arrays.asList("NAME","email"));

Это требует, чтобы вы изменили свой класс CSVUtils так, чтобы он принимал OutputStream вместо объекта Writer, но там нет большой разницы ...

public static void writeLine(OutputStream w, etc...) throws IOException {

    :
    sb.append("\n");
    String str = sb.toString();
    byte[] bytes = str.getBytes(Charset.forName("UTF-8"));
    w.write(bytes);
}

Я настоятельно рекомендую использовать библиотеку для файлов CSV, например, http://opencsv.sourceforge.net/, поскольку они предоставляют множество замечательных функций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...