原创

生成格式是csv的 execl 文件并压缩(单或多文件)

        jdk提供的zip只能按UTF-8格式处理,如果解压一个包含中文文件名的zip包时,如果使用jdk自带的zip包,解压时如果文件名有中文,会抱非法参数异常,主意编码格式。


生成csv文件代码如下:

package com.util;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.List;

public class ExportUtil {
    /**
     * 导出
     * @param file csv文件(路径+文件名),csv文件不存在会自动创建
     * @param dataList 数据
     * @return
     */
    public static boolean exportCsv(File file, List<String> dataList){
        boolean isSucess=false;
        
        FileOutputStream out=null;
        OutputStreamWriter osw=null;
        BufferedWriter bw=null;
        try {
            out = new FileOutputStream(file);
            osw = new OutputStreamWriter(out, "GBK");
            bw =new BufferedWriter(osw);
            if(dataList!=null && !dataList.isEmpty()){
                for(String data : dataList){
                    bw.append(data).append("\r");
                }
            }
            isSucess=true;
        } catch (Exception e) {
            isSucess=false;
        }finally{
            if(bw!=null){
                try {
                    bw.close();
                    bw=null;
                } catch (IOException e) {
                    e.printStackTrace();
                } 
            }
            if(osw!=null){
                try {
                    osw.close();
                    osw=null;
                } catch (IOException e) {
                    e.printStackTrace();
                } 
            }
            if(out!=null){
                try {
                    out.close();
                    out=null;
                } catch (IOException e) {
                    e.printStackTrace();
                } 
            }
        }
        
        return isSucess;
    }
}


压缩单一文件或者多个文件工具类代码如下:

package com.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class ZipFileUtil {

    public static boolean zipSingleFile(String file, String zipFile)
            throws IOException {
        boolean bf = true;
        File f = new File(file);
        if (!f.exists()) {
            System.out.println("文件不存在");
            bf = false;
        } else {
            File ff = new File(zipFile);
            if (!f.exists()) {
                ff.createNewFile();
            }
            // 创建文件输入流对象
            FileInputStream in = new FileInputStream(file);
            // 创建文件输出流对象
            FileOutputStream out = new FileOutputStream(zipFile);
            // 创建ZIP数据输出流对象
            ZipOutputStream zipOut = new ZipOutputStream(out);
            // 得到文件名称
            String fileName = file.substring(file.lastIndexOf('/') + 1,file.length());
            // 创建指向压缩原始文件的入口
            ZipEntry entry = new ZipEntry(fileName);
            zipOut.putNextEntry(entry);
            // 向压缩文件中输出数据
            int number = 0;
            byte[] buffer = new byte[512];
            while ((number = in.read(buffer)) != -1) {
                zipOut.write(buffer, 0, number);
            }
            zipOut.close();
            out.close();
            in.close();
        }
        return bf;
    }

    /**
     * @param files 待压缩的文件列表
     * @param zipfile 压缩后的文件名称
     * @return boolean
     * @throws :Exception
     * @Function: zipFiles
     * @Description:多个文件的ZIP压缩
     */
    public static boolean zipFiles(String[] files, String zipfile)throws Exception {
        boolean bf = true;
        // 根据文件路径构造一个文件实例
        File ff = new File(zipfile);
        // 判断目前文件是否存在,如果不存在,则新建一个
        if (!ff.exists()) {
            ff.createNewFile();
        }
        // 根据文件路径构造一个文件输出流
        FileOutputStream out = new FileOutputStream(zipfile);
        // 传入文件输出流对象,创建ZIP数据输出流对象
        ZipOutputStream zipOut = new ZipOutputStream(out);
        // 循环待压缩的文件列表
        for (int i = 0; i < files.length; i++) {
            File f = new File(files[i]);
            if (!f.exists()) {
                bf = false;
            }
            try {
                // 创建文件输入流对象
                FileInputStream in = new FileInputStream(files[i]);
                // 得到当前文件的文件名称
                String fileName = files[i].substring(files[i].lastIndexOf('/') + 1, files[i].length());
                // 创建指向压缩原始文件的入口
                ZipEntry entry = new ZipEntry(fileName);
                zipOut.putNextEntry(entry);
                // 向压缩文件中输出数据
                int nNumber = 0;
                byte[] buffer = new byte[512];
                while ((nNumber = in.read(buffer)) != -1) {
                    zipOut.write(buffer, 0, nNumber);
                }
                // 关闭创建的流对象
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
                bf = false;
            }
        }
        zipOut.close();
        out.close();
        return bf;
    }

}


测试类代码如下(个人测试中文不会乱码)

package com.test;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import com.hxxr.app.exportcsv.util.ExportUtil;
import com.hxxr.app.exportcsv.util.ZipFileUtil;



public class Test {
    private static String path1 = "d:/test/datas1.csv";
    private static String path2 = "d:/test/datas2.csv";
    private static String zpath = "d:/datas.zip";
    private static String zpaths = "d:/datas.zip";
    public static void main(String[] args) throws Exception{
        List<String> dataList = new ArrayList<>();
        dataList.add("一,二,三,四,五,六");
        for (int i = 0; i < 1000; i++) {
            dataList.add(Math.random()*100 +","+Math.random()*100 +","+Math.random()*100 +
                    ","+Math.random()*100 +","+Math.random()*100 +","+Math.random()*100);
        }
        /**
         * 导出csv文件
         */
        ExportUtil.exportCsv(new File(path1), dataList);
        ExportUtil.exportCsv(new File(path2), dataList);
        /**
         * 将生成的单一文件压缩
         */
        boolean bo = ZipFileUtil.zipSingleFile(path1, zpath);
        if(bo){
            System.out.println("单一压缩文件成功!");
        }else{
            System.out.println("单一压缩文件失败!");
        }
        /**
         * 将生成的多个文件压缩
         */
        String [] files = {"d:/test/datas1.csv","d:/test/datas2.csv"};
        boolean boo = ZipFileUtil.zipFiles(files, zpaths);
        if(boo){
            System.out.println("多文件压缩文件成功!");
        }else{
            System.out.println("多文件压缩文件失败!");
        }
    }
}


关注下方微信公众号“Java精选”(w_z90110),回复关键字领取资料:如HadoopDubboCAS源码等等,免费领取资料视频和项目。 

涵盖:程序人生、搞笑视频、算法与数据结构、黑客技术与网络安全、前端开发、Java、Python、Redis缓存、Spring源码、各大主流框架、Web开发、大数据技术、Storm、Hadoop、MapReduce、Spark、elasticsearch、单点登录统一认证、分布式框架、集群、安卓开发、iOS开发、C/C++、.NET、Linux、Mysql、Oracle、NoSQL非关系型数据库、运维等。

评论

分享:

支付宝

微信