java - 为什么下载的excel文件不包含任何数据?文件为空
问题描述
大家好,我已经创建了一个 Servlet 文件。它正在下载为 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());
}
}
解决方案
这是一个写入响应输出流的版本。请注意,我将“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/,因为它们提供了很多很棒的功能。
推荐阅读
- linux - 无论父文件夹名称如何,查找和排序唯一文件名
- javascript - 使用 Angular 库构建项目时出现问题。ng serve 在本地工作正常 错误消息是请添加 @NgModule 注释
- java - Webview 有时会显示空白页
- angular - mat-paginator 的最后一个或第一个按钮上是否有 EventListener?
- java - 使用服务帐号访问包含外部数据源的 BigQuery 表
- python - 使用标签 '{{value | 返回模型中的第一张图像 第一的}}'
- angular - 使用 rxjs 观察 angular 4 中数组的变化
- gradle - 如何确定 Gradle 任务是否已实例化(配置避免 API)
- dart - Flutter 中的闪屏实现
- r - 闪亮的交互式 ggplot 缺少错误栏