原创

生成格式是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),回复关键词领取资料:如Mysql、Hadoop、Dubbo、Spring Boot等,免费领取视频教程、资料文档和项目源码。

Java精选专注程序员推送一些Java开发知识,包括基础知识、各大流行框架(Mybatis、Spring、Spring Boot等)、大数据技术(Storm、Hadoop、MapReduce、Spark等)、数据库(Mysql、Oracle、NoSQL等)、算法与数据结构、面试专题、面试技巧经验、职业规划以及优质开源项目等。其中一部分由小编总结整理,另一部分来源于网络上优质资源,希望对大家的学习和工作有所帮助。

评论

分享:

支付宝

微信