Java 将数据写入excel(CSV)文件
我已经创建了一个servlet代码。主要目标是将数据从数据库写入csv文件。在我的代码中,csv文件下载成功,但文件仍然为空。该项目包含javacsv.jar文件。我不知道这是为什么。请说明我是如何做到这一点的。有关摘要,请阅读以下要点:Java 将数据写入excel(CSV)文件,java,servlets,Java,Servlets,我已经创建了一个servlet代码。主要目标是将数据从数据库写入csv文件。在我的代码中,csv文件下载成功,但文件仍然为空。该项目包含javacsv.jar文件。我不知道这是为什么。请说明我是如何做到这一点的。有关摘要,请阅读以下要点: 从数据库表访问数据 然后将该数据写入csv文件,格式为data here。[我需要这种格式,因为我可以根据我的要求格式化数据。] 请澄清一下:)请参考下面的Servlet代码: 公共类excelServletFile扩展了HttpServlet{ 字符串名
- 从数据库表访问数据
- 然后将该数据写入csv文件,格式为
data here 。[我需要这种格式,因为我可以根据我的要求格式化数据。] - 请澄清一下:)请参考下面的Servlet代码:
公共类excelServletFile扩展了HttpServlet{
字符串名称=”;
字符串email=“”;
字符串eid=“用户名”;
受保护的void processRequest(HttpServletRequest请求、HttpServletResponse响应)
抛出ServletException、IOException{
setContentType(“text/html;charset=UTF-8”);
试一试{
字符串文件名=eid+“Data.csv”;
ServletContext=getServletContext();
字符串mimeType=context.getMimeType(文件名);
if(mimeType==null){
mimeType=“应用程序/八位字节流”;
}
response.setContentType(mimeType);
字符串headerKey=“内容处置”;
String headerValue=String.format(“附件;文件名=\%s\”,文件名);
response.setHeader(headerKey,headerValue);
OutputStream outStream=response.getOutputStream();
ConnectionClass cn=新的ConnectionClass();
Connection con=cn.connectDb();
编制报表;
结果集rs;
字符集cs=Charset.forName(“UTF-8”);
Writer Writer=新的PrintWriter(系统输出);
writer.flush();
作者。附加(“姓名”);
writer.append(“电子邮件”);
ps=con.prepareStatement(“选择名称,来自用户的电子邮件”);
rs=ps.executeQuery();
while(rs.next()){
name=rs.getString(“name”);
email=rs.getString(“email”);
PrintWriter out=response.getWriter();
out.println(名称);
out.println(电子邮件);
writer.append(名称);
writer.append(电子邮件);
}
writer.close();
}捕获(例外e){
系统输出打印ln(e);
}
}
//数据库连接文件
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文件
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());
}
}
包服务项目;
导入java.io.IOException;
导入java.io.Writer;
导入java.util.List;
公共类CSVutil{
私有静态最终字符默认_分隔符=',';
公共静态void writeLine(Writer w,列表值)引发IOException{
writeLine(w,值,默认分隔符“”);
}
公共静态void writeLine(Writer w、列表值、字符分隔符)引发IOException{
写线(w,值,分隔符,);
}
// https://tools.ietf.org/html/rfc4180
私有静态字符串followCVSformat(字符串值){
字符串结果=值;
if(result.contains(“\”){
结果=结果。替换(“\”,“\”);
}
返回结果;
}
公共静态void writeLine(Writer w、列表值、字符分隔符、字符customQuote)引发IOException{
布尔值优先=真;
//默认customQuote为空
如果(分隔符=“”){
分隔符=默认的_分隔符;
}
StringBuilder sb=新的StringBuilder();
for(字符串值:值){
如果(!第一个){
某人附加(分隔符);
}
如果(customQuote==''){
某人附加(跟随格式(值));
}否则{
附加(customQuote);附加(followCVSformat(value))。附加(customQuote);
}
第一个=假;
}
某人附加(“\n”);
w、 附加(某人的字符串());
}
}
可能在关闭CsvWriter之前刷新它?你的意思是说我必须编写csvOutput.endRecord();在while循环之外?不。我的意思是,OutputStream
和Writer
都实现了Flushable
,因此有一个flush
方法,它确保仍然在缓冲区中的任何数据都被写入流目标。好的,我明白了。你能给我举个小例子吗?它非常简单。您可以在csvOutput.close();
之前调用csvOutput.flush();
,或者如果CsvWriter实际上没有实现writer,您可以调用outStream.flush()
为您的答案添加更多详细信息,即:上述代码如何解决问题。不建议简单地发布代码,请查看此处。如果可能,请在您的答案中添加更多详细信息。CSVUtils是一个java文件或servlet?感谢您的帮助,但它只下载空的octate流,而不是excel文件。为什么这里真的需要三个文件中的大部分,只需要一个小功能??一个servlet文件和一个类连接文件也可以吗。@Govind Sharma你能帮我一个忙吗?代码正在执行。但它正在替换以前的文件。我试图在加载servlet页面时下载新文件。每次新文件e将被下载。顺便说一句,每次都会加载一个名为“ExcelServletFile”的文件,而不是我正在尝试的这个文件。csv文件将被下载。兄弟,请帮我解决这个问题。这是我对你的谦虚请求,伙计。
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());
}
}