csv文件上传/读取/压缩/保存
import com.fasterxml.jackson.dataformat.csv.CsvMapper;
import com.fasterxml.jackson.dataformat.csv.CsvSchema;
import com.fasterxml.jackson.databind.SequenceWriter;
import com.fasterxml.jackson.dataformat.csv.CsvGenerator;
public String upload(Model model, HttpServletRequest request,
@RequestParam("uploadFile") MultipartFile file
, @AuthenticationPrincipal LoginUserDetails userDetails) {
// 文字コード設定
Reader reader = new InputStreamReader(file.getInputStream(), "Shift_JIS");
//这个model是普通的实体类,没任何特别的东西
Field[] fields = MyModel.class.getDeclaredFields();
//把model的信息加入到CsvSchema中
CsvSchema.builder().addColumn(fields[0].getName(), CsvSchema.ColumnType.STRING)
.addColumn(fields[1].getName(), CsvSchema.ColumnType.STRING)
.addColumn(fields[2].getName(), CsvSchema.ColumnType.STRING)
.build();
CsvMapper csvMapper = new CsvMapper();
MappingIterator<Object> readValues = csvMapper.readerFor(MyModel.class)
.with(csvSchema.withHeader())//不读取上传文件的表头
.readValues(reader);
//項目数が超える場合は。以下、CSVMappingExceptionを自動的にThrow、catch側にゲット
List<Object> modelList = readValues.readAll();
List<FileModel> fileModelList = new ArrayList<>();
modelList.forEach(item ->{
//データ操作...
MyModel myModel= (MyModel) item;
FileModel fileModel= new FileModel ();
fileModel.setInfo1(item.getInfo1());
fileModel.setInfo2(item.getInfo2());
fileModel.setInfo3(item.getInfo3());
fileModelList.add(fileModel);
});
//ファイル作成
CsvMapper csvMapper = new CsvMapper();
csvMapper.configure(CsvGenerator.Feature.ALWAYS_QUOTE_STRINGS, true);//数据之间双引号设置打开
CsvSchema csvSchema = csvMapper.schemaFor(FileModel.class);//model的信息
//文件每1000条数据就分割一个文件,这个是计算需要输出几个文件
int size = fileModelList.size();
int fileCreateCount = size % config.get1000() == 0
? (size / config.get1000())
: (size / config.get1000()) + 1;
// 1000件以上の実行
//文件保存的位置List,后面根据这个list把出力的临时文件进行压缩zip化,把压缩后不用的临时文件删除
//后面就不详细写了
List<File> filesInfoList = new ArrayList<>();
String filePath = "c.\\test.csv";//设置你要保存地址,根据自己做修改
for (int i = 1; i < fileCreateCount; i++) {
File file = new File(filePath);
filesInfoList.add(file);//后面压缩文件用的
Path path = Paths.get(filePath);
try (BufferedWriter bw =
Files.newBufferedWriter(path, Charset.forName("Shift_JIS"));
SequenceWriterwriter=csvMapper
.writer(csvSchema.withHeader().withLineSeparator("\r\n"))//每行用CRLF分行
.writeValues(bw)) {
// Tag を使ています
// csvSchema.withColumnSeparator('\t')
//先取list中的1000件,每输出1000件就删除掉这个list对应的1000件
List<FileModel> subList = fileModelList.subList(0, config.get1000());
for (FileModel model : subList) {
writer.write(model);
}
} catch (IOException e) {
log.warn("stream writer error");
this.serviceFileDelete(filesInfoList);
}
// 出力したの項目を削除 出力过的1000件删除
fileModelList.subList(0, config.get1000()).clear();
}
// 1000件以内または残り件数の処理 1000件以内或者剩余文件不足1000的时候
Path path = Paths.get(filePath);
try (BufferedWriter bw = Files.newBufferedWriter(path, Charset.forName("Shift_JIS"));
SequenceWriter writer = csvMapper.writer(csvSchema.withHeader().withLineSeparator("\r\n"))
.writeValues(bw)) {
// Tag を使ています
// csvSchema..withColumnSeparator('\t')
for (FileModel model : fileModelList) {
writer.write(model);
}
// ファイル圧縮 文件压缩
File zipFile = new File("c:\\test.zip");
OutputStream outputStream = new FileOutputStream(zipFile);
FileToZipUtils.toZip(filesInfoList, outputStream);
// ファイル保存 保存到AWS s3中
try (InputStream inputStream = new FileInputStream(zipFile)) {
//这个方法在AWS存储文章中记载
this.fileSave();
}
}
保存用的实体类设置:输出文件表头设置
import java.io.Serializable;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import lombok.Data;
//@JsonPropertyOrder和@JsonProperty设置一个就可以了
@Data
@JsonPropertyOrder({ "インフォ1", "インフォ2", "インフォ3" })
public class FileModel implements Serializable {
private static final long serialVersionUID = 1L;
@JsonProperty("インフォ1")
private String info1;
@JsonProperty("インフォ2")
private String info2;
@JsonProperty("インフォ3")
private String info3;
}
文件压缩工具类/zip化
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import lombok.extern.slf4j.Slf4j;
/**
*
* @ClassName: FileToZipUtils
*
*/
@Slf4j
public class FileToZipUtils {
public static void toZip(List<File> srcFiles, OutputStream out) throws IOException {
long start = System.currentTimeMillis();
try (ZipOutputStream zos = new ZipOutputStream(out)) {
for (File srcFile : srcFiles) {
byte[] buf = new byte[512];
zos.putNextEntry(new ZipEntry(srcFile.getName()));
int len;
try(FileInputStream in = new FileInputStream(srcFile)){
while ((len = in.read(buf)) != -1) {
zos.write(buf, 0, len);
}
zos.closeEntry();
}
}
long end = System.currentTimeMillis();
log.info("to Zip:OK" + (end - start) + " ms");
}
}
private FileToZipUtils() {
}
}