首页 > 其他分享 >csv工具类

csv工具类

时间:2024-07-09 13:44:39浏览次数:10  
标签:csvWriter List param ignoreField import 工具 csv data

package com.cccp.utils.tool;

import org.springframework.util.CollectionUtils;

import javax.servlet.http.HttpServletResponse;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.lang.reflect.Field;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;

/**
 * CSV工具类
 */
public class CsvUtil {

    /**
     * 导出CSV文件(写入到HTTP响应中)
     *
     * @param response    HTTP相应
     * @param fileName    文件名
     * @param title       标题行(第一条)
     * @param data        要插入的数据
     * @param ignoreField 忽略的属性(不写入文件的字段)
     * @param <T>         要写入的类型
     * @throws Exception IO异常
     */
    public static <T> void export(HttpServletResponse response, String fileName,
                                  List<String> title, List<T> data, List<String> ignoreField) throws Exception {
        export( response, fileName, title, data,  ignoreField , new SimpleDateFormat("yyyyMMdd"));
    }

    /**
     * 导出CSV文件(写入到HTTP响应中)
     *
     * @param response    HTTP相应
     * @param fileName    文件名
     * @param title       标题行(第一条)
     * @param data        要插入的数据
     * @param ignoreField 忽略的属性(不写入文件的字段)
     * @param <T>         要写入的类型
     * @param sdf        日期格式化类型
     * @throws Exception IO异常
     */
    public static <T> void export(HttpServletResponse response, String fileName,
                                  List<String> title, List<T> data, List<String> ignoreField, SimpleDateFormat sdf) throws Exception {
        if (data == null) {
            data = new ArrayList<>();
        }
        if (CollectionUtils.isEmpty(title)) {
            // 标题和数据不能同时为空
            if (data.isEmpty()) {
                throw new Exception("标题和数据不能同时为空!");
            }
            // 如果标题为空则获取数据类型的字段名
            title = getTitleByField(data.get(0).getClass(), ignoreField);
        }
        // 转换数据形式
        List<List<String>> values = new LinkedList<>();
        data.forEach(d -> values.add(getValues(d, ignoreField,sdf)));
        // 导出为csv文件 开始
        fileName += ".csv";
        OutputStreamWriter writer = new OutputStreamWriter(response.getOutputStream(), "GBK");
        BufferedWriter csvWriter = new BufferedWriter(writer, 1024);
        response.reset();
        // 设置返回头
        response.setContentType("multipart/form-data");
        response.setHeader("Content-Disposition",
                "attachment;fileName=" + new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1));
        // 写标题行
        writeRow(title, csvWriter);
        // 写数据
        for (List<String> value : values) {
            writeRow(value, csvWriter);
        }
        csvWriter.close();
        writer.close();
    }

    /**
     * 根据Class获取字段列表
     *
     * @param clazz 要获取字段的类
     * @return 字段名
     */
    public static List<String> getTitleByField(Class<?> clazz, List<String> ignoreField) {
        Field[] fields = clazz.getDeclaredFields();
        List<String> titleList = new ArrayList<>();
        for (Field field : fields) {
            field.setAccessible(true);
            if (ignoreField.contains(field.getName())) {
                // 如果是忽略字段则跳过
                continue;
            }
            titleList.add(field.getName());
        }
        return titleList;
    }

    /**
     * 获取实体类的所有字段值
     *
     * @param object 要获取的对象
     * @return 字符串形式的字段值
     */
    private static List<String> getValues(Object object, List<String> ignoreField,SimpleDateFormat sdf) {
        List<String> ret = new LinkedList<>();
        Field[] fields = object.getClass().getDeclaredFields();
        for (Field field : fields) {
            field.setAccessible(true);
            if (ignoreField.contains(field.getName())) {
                // 忽略字段跳过
                continue;
            }
            Object value;
            try {
                value = field.get(object);
            } catch (Exception e) {
                value = null;
            }
            String val;
            if (value instanceof Date) {
                // 如果是日期 则格式化
                val = sdf.format((Date) value);
            } else {
                val = value == null ? "" : value.toString();
            }
            ret.add(val);
        }
        return ret;
    }

    /**
     * 写一行数据
     *
     * @param str       数据数组
     * @param csvWriter 写入缓存
     * @throws IOException IO异常
     */
    private static void writeRow(List<String> str, BufferedWriter csvWriter) throws IOException {
        // 写入
       /* for (String data : str) {
            if (data == null || "null".equals(data)) {
                csvWriter.write(",");
            } else {
                csvWriter.write(data + ",");
            }
        }*/

        for (int i = 0; i < str.size(); i++) {
            String data = str.get(i);
            if (data == null || "null".equals(data)) {
                csvWriter.write(",");
            } else {
                if (i == str.size()-1) {
                    csvWriter.write(data);
                }else {
                    csvWriter.write(data + ",");
                }
            }
        }

        csvWriter.newLine();
    }
}

标签:csvWriter,List,param,ignoreField,import,工具,csv,data
From: https://www.cnblogs.com/lkyzhengyj/p/18291623

相关文章

  • 5.1 构建发布工具集成
    安装完成后,配置管理工具安装并配置gityum-yinstallgit 编辑git环境变量为/usr/bin/git安装并配置mavenwgethttps://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gztar-xvfapache-maven-3.6.3-bin.tar.gzm......
  • C#中的并发工具:Task Parallel Library(TPL)深度解析
    ......
  • 打卡信奥刷题(276)用Scratch图形化工具信奥P1007[普及组/提高] 独木桥
    独木桥题目背景战争已经进入到紧要时间。你是运输小队长,正在率领运输部队向前线运送物资。运输任务像做题一样的无聊。你希望找些刺激,于是命令你的士兵们到前方的一座独木桥上欣赏风景,而你留在桥下欣赏士兵们。士兵们十分愤怒,因为这座独木桥十分狭窄,只能容纳......
  • JVM-性能优化工具 MAT
    一、MAT下载和安装1、概述MAT(MemoryAnalyzerTool)工具是一款功能强大的]ava堆内存分析器。可以用于查找内存泄漏以及查看内存消耗情况。MAT是基于Eclipse开发的,不仅可以单独使用,还可以作为插件的形式嵌入在Eclipse中使用。是一款免费的性能分析工具,使用起来非常方便。2、下载地址......
  • Nerdbank.GitVersioning .net 版本自动生成工具
    在.NET7中使用Nerdbank.GitVersioning进行版本控制,可以按照以下步骤进行配置:安装Nerdbank.GitVersioning包:使用NuGet包管理器控制台安装该包: Install-PackageNerdbank.GitVersioning安装nbgv工具:使用.NETCLI安装nbgv工具:dotnettoolinstall-gnbgv......
  • 图片翻译中文软件有哪些?精选5款高效的翻译工具
    你喜欢旅行吗?如果是的话,当你发现自己在一个语言不通的环境中,第一反应往往是掏出手机,试图查找那陌生词汇的中文意思,这无疑是个实用的方法。但如果整段文字都是陌生语言的话怎么办呢?这时候图片翻译工具就派上用场了。本文将介绍5个图片翻译软件在线翻译工具,让你在碰到当地语言......
  • 网络安全专家的在线工具箱:顶级资源和平台推荐
    前言:在当前信息技术快速发展的时代,网络安全已成为一个无法忽视的重要议题。面对日益复杂的网络威胁,网络安全人员需不断寻找新的工具和方法以防御潜在的攻击。本文将为网络安全专业人员推荐几个实用的在线工具和平台,这些资源能帮助他们在日常工作中提高效率,加强安全防护。简介:在......
  • python matplot绘图工具练习
    #pyplotimportmatplotlib.pyplotaspltimportnumpyasnpimportseabornassnsimportpandasaspdx_point=np.array([0,6])y_point=np.array([0,100])plt.plot(x_point,y_point,'b-.v')#格式处理plt.show()x=np.arange(0,4*np.pi,0.1)y=......
  • 命令行开发工具
    GNU工具集在上个世纪八十年代,计算机都是奢侈品,操作系统里最著名的是Unix家族,当时还没有Windows、Linux之类的,Unix系统都是商业软件,里面的应用软件也是商业软件,全是封闭的环境。系统程序员RichardM.Stallman(RMS)在此环境下创立了与众不同的GNU项目(GNU'sNotUni......
  • Vue系列---【如何完善自己的工具类方法?】
    1.在src目录下新建一个util目录2.新建一个CommonUtil.js文件这里我以集合去重方法为例//根据code去重exportfunctionremoveDuplicate(arr){letobj={};arr=arr.reduce((newArr,next)=>{obj[next.code]?"":(obj[next.code]=true&&newArr.push(......