list集合转csv文件以及servlet导出csv和excel文件

本文介绍了一种将Java中的List集合数据导出为CSV文件和Excel文件的方法,并提供了具体的实现代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public class CsvToListObjectTest {

    /**
     * 写入csv文件
     * @param list
     * @param fileName
     * @return
     */
    public static File getCsvFile(List<User> list, String fileName){
        File file = new File(fileName);
        FileOutputStream fos = null;
        OutputStreamWriter osw = null;
        BufferedWriter bfw = null;
        try {
            fos = new FileOutputStream(file);
            osw = new OutputStreamWriter(fos);
            bfw = new BufferedWriter(osw);
            bfw.write(list.get(0).getKeyString()+"\r");
            for (int i = 0; i < list.size(); i++) {
                bfw.write(list.get(i).getValueString()+"\r");
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                if (bfw != null){
                    bfw.close();
                }
                if (osw != null){
                    osw.close();
                }
               if (fos != null){
                   fos.close();
               }
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
        return file;
    }



    public static void main(String[] agrs){
        User user = null;
        ArrayList<User> list = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            user = new User();
            user.setUser_id(10000+i);
            user.setUser_name("user"+i);
            user.setUser_age(20+i);
            user.setUser_sex("男");
            user.setUser_pwd("123456"+i);
            user.setUser_phone("123456789"+i);
            user.setUser_type(""+i);
            list.add(user);
        }
        File file = getCsvFile(list,"user.csv");
    }

    /**
     * Servlet导出list集合的csv文件
     * @param response
     * @param list
     * @param fileName
     */
    public static void getCsvFile(HttpServletResponse response, List<User> list, String fileName){
        //设置文件名
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String fname = fileName+sdf.format(new Date())+".csv";
        //设置response
        response.reset();
        response.setHeader("Content-disposition", "attachment; filename="+fname);
        response.setContentType("application/ms-txt.numberformat:@");
        //获得输出流
        OutputStream os = null;
        OutputStreamWriter osw = null;
        BufferedWriter bfw = null;
        //写入数据
        try {
            os = response.getOutputStream();
            osw = new OutputStreamWriter(os);
            bfw = new BufferedWriter(osw);
            bfw.write(list.get(0).getKeyString()+"\r");
            for (int i = 0; i < list.size(); i++) {
                bfw.write(list.get(i).getValueString()+"\r");
            }
           
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                if (bfw != null){
                    bfw.flush();
                    bfw.close();
                }
                if (osw != null){
                    osw.close();
                }
                if (os != null){
                    os.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

public class User {

    private Integer user_id;

    private String user_name;

    private String user_pwd;

    private Integer user_age;

    private String user_sex;

    private String user_phone;

    private String user_type;


    public String getKeyString() {
        return "user_id,"+"user_name,"+"user_pwd,"+"user_age,"+"user_sex,"+"user_phone,"+"user_type";
    }

    public String getValueString(){
        return user_id+","+user_name+","+user_pwd+","+user_age+","+user_sex+","+user_phone+","+user_type;
    }


    public Integer getUser_id() {
        return user_id;
    }

    public void setUser_id(Integer user_id) {
        this.user_id = user_id;
    }

    public String getUser_name() {
        return user_name;
    }

    public void setUser_name(String user_name) {
        this.user_name = user_name;
    }

    public String getUser_pwd() {
        return user_pwd;
    }

    public void setUser_pwd(String user_pwd) {
        this.user_pwd = user_pwd;
    }

    public Integer getUser_age() {
        return user_age;
    }

    public void setUser_age(Integer user_age) {
        this.user_age = user_age;
    }

    public String getUser_sex() {
        return user_sex;
    }

    public void setUser_sex(String user_sex) {
        this.user_sex = user_sex;
    }

    public String getUser_phone() {
        return user_phone;
    }

    public void setUser_phone(String user_phone) {
        this.user_phone = user_phone;
    }

    public String getUser_type() {
        return user_type;
    }

    public void setUser_type(String user_type) {
        this.user_type = user_type;
    }
}

User类中以及实现了csv头部和值的连接。

使用workbook导出excel:

  /**
     * 导出list集合的excel文件
     */
    public static void excelFile(HttpServletResponse response, List<UserInfo> list, String fileName, String fileType){
        //设置文件名
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String fname = fileName+sdf.format(new Date())+fileType;
        //设置response
        response.reset();
        response.setHeader("Content-disposition", "attachment; filename="+fname);
        response.setContentType("application/ms-excel.numberformat:@");
        //获得输出流
        OutputStream os = null;
        try {
            os = response.getOutputStream();
            Workbook workbook = null;
            if (fileType.equals(".xlsx")){
                //.xlsx
                workbook = new XSSFWorkbook();
            }else {
                //.xls
                workbook = new HSSFWorkbook();
            }
            Sheet sheet = workbook.createSheet();
            Row rowh = sheet.createRow(0);
            rowh.createCell(0).setCellValue("user_id");
            rowh.createCell(1).setCellValue("user_name");
            rowh.createCell(2).setCellValue("user_age");
            rowh.createCell(3).setCellValue("user_sex");
            rowh.createCell(4).setCellValue("user_phone");
            rowh.createCell(5).setCellValue("user_type");
            for (int i = 1; i < list.size(); i++) {
                Row row = sheet.createRow(i);
                row.createCell(0).setCellValue(list.get(i).getUserId());
                row.createCell(1).setCellValue(list.get(i).getUserName());
                row.createCell(2).setCellValue(list.get(i).getUserAge());
                row.createCell(3).setCellValue(list.get(i).getUserSex());
                row.createCell(4).setCellValue(list.get(i).getUserPhone());
                row.createCell(5).setCellValue(list.get(i).getUserType());
            }
           workbook.write(os);
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (os != null){
                try {
                    os.flush();
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }

 

### 导出CSV文件流的方法 在现代Web开发中,以流的形式导出CSV文件是一种高效且资源友好的方式。以下是几种常见的实现方法: #### 方法一:基于Java的Hutool工具库 Hutool是一个功能强大的Java工具类库,支持快速创建并导出CSV文件。它可以通过内存中的字节流直接生成CSV文件,并将其作为响应返回给客户端。 ```java import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.CharsetUtil; import javax.servlet.http.HttpServletResponse; public void exportCsv(HttpServletResponse response, List<String[]> data) throws IOException { // 设置HTTP响应头信息 response.setContentType("text/csv;charset=UTF-8"); response.setHeader("Content-Disposition", "attachment;filename=data.csv"); try (OutputStream out = response.getOutputStream()) { CsvWriter writer = new CsvWriter(out, ',', CharsetUtil.CHARSET_UTF_8); // 写入表头 String[] headers = {"ID", "Name", "Age"}; writer.write(headers); // 写入数据行 for (String[] row : data) { writer.write(row); } writer.flush(); } } ``` 上述代码展示了如何使用Hutool工具库来写入CSV文件的内容,并通过`HttpServletResponse`将文件发送至客户端[^3]。 --- #### 方法二:MySQL直接导出CSV文件 如果目标是从数据库中提取数据并将结果保存为CSV文件,则可以直接使用SQL语句完成此操作。这种方式适用于服务器上具有权限访问存储路径的情况。 执行以下命令即可将查询结果保存为指定位置的CSV文件: ```sql SELECT * INTO OUTFILE '/tmp/data.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' FROM your_table_name; ``` 需要注意的是,该路径必须是MySQL服务进程可写的目录。此外,在某些环境中可能需要调整安全配置才能启用`INTO OUTFILE`选项[^2]。 --- #### 方法三:纯Java实现无依赖版本 如果不希望引入额外的第三方库,也可以完全依靠标准API编写类似的逻辑。下面是一段简单的例子说明如何手动构建CSV字符串并通过Servlet输出: ```java import java.io.OutputStream; import java.io.IOException; import javax.servlet.http.HttpServletResponse; public static void manualExportCsv(HttpServletResponse response, List<List<String>> rows) throws IOException { StringBuilder sb = new StringBuilder(); // 构建CSV内容 for (List<String> rowData : rows) { boolean firstColumn = true; for (String columnData : rowData) { if (!firstColumn) { sb.append(","); } else { firstColumn = false; } sb.append("\"").append(columnData.replace("\"", "\"\"")).append("\""); // 处理特殊字符义 } sb.append("\r\n"); } // 配置响应头部参数 response.reset(); response.setCharacterEncoding("UTF-8"); response.setContentType("application/octet-stream"); response.setHeader("Content-Disposition", "attachment; filename=\"data.csv\""); OutputStream outputStream = null; try { outputStream = response.getOutputStream(); outputStream.write(sb.toString().getBytes(Charset.forName("UTF-8"))); } finally { IoUtils.closeQuietly(outputStream); // 确保关闭流 } } ``` 这段程序片段实现了基本的功能需求,即组装好每一行的数据之后再统一写出到浏览器下载接口里去[^1]。 --- ### 总结 以上介绍了三种不同的技术路线用于解决“以流形式导出CSV”的实际应用场景问题。无论是借助成熟的开源框架简化编码工作量还是深入挖掘底层原理自行定制解决方案都有其适用场合,请根据具体项目背景做出合理选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值