From 75f3eaec468f45113cee3ff247a677d24d1db175 Mon Sep 17 00:00:00 2001 From: jueyue Date: Fri, 8 Nov 2019 16:48:54 +0800 Subject: [PATCH] change csv export type,use write to append --- .../cn/afterturn/easypoi/cache/WordCache.java | 2 +- .../afterturn/easypoi/csv/CsvExportUtil.java | 3 + .../cn/afterturn/easypoi/util/PoiZipUtil.java | 124 ++++++++++++++++++ .../easypoi/word/parse/ParseWord07.java | 6 +- 4 files changed, 131 insertions(+), 4 deletions(-) create mode 100644 easypoi-base/src/main/java/cn/afterturn/easypoi/util/PoiZipUtil.java diff --git a/easypoi-base/src/main/java/cn/afterturn/easypoi/cache/WordCache.java b/easypoi-base/src/main/java/cn/afterturn/easypoi/cache/WordCache.java index 9e33542..b6dd73d 100644 --- a/easypoi-base/src/main/java/cn/afterturn/easypoi/cache/WordCache.java +++ b/easypoi-base/src/main/java/cn/afterturn/easypoi/cache/WordCache.java @@ -33,7 +33,7 @@ public class WordCache { private static final Logger LOGGER = LoggerFactory.getLogger(WordCache.class); - public static MyXWPFDocument getXWPFDocumen(String url) { + public static MyXWPFDocument getXWPFDocument(String url) { InputStream is = null; try { is = POICacheManager.getFile(url); diff --git a/easypoi-base/src/main/java/cn/afterturn/easypoi/csv/CsvExportUtil.java b/easypoi-base/src/main/java/cn/afterturn/easypoi/csv/CsvExportUtil.java index c424fdb..ec358e1 100644 --- a/easypoi-base/src/main/java/cn/afterturn/easypoi/csv/CsvExportUtil.java +++ b/easypoi-base/src/main/java/cn/afterturn/easypoi/csv/CsvExportUtil.java @@ -3,7 +3,10 @@ package cn.afterturn.easypoi.csv; import cn.afterturn.easypoi.csv.entity.CsvExportParams; import cn.afterturn.easypoi.csv.export.CsvExportService; import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity; +import cn.afterturn.easypoi.util.PoiZipUtil; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.FileOutputStream; import java.io.OutputStream; import java.util.Collection; diff --git a/easypoi-base/src/main/java/cn/afterturn/easypoi/util/PoiZipUtil.java b/easypoi-base/src/main/java/cn/afterturn/easypoi/util/PoiZipUtil.java new file mode 100644 index 0000000..8d50328 --- /dev/null +++ b/easypoi-base/src/main/java/cn/afterturn/easypoi/util/PoiZipUtil.java @@ -0,0 +1,124 @@ +package cn.afterturn.easypoi.util; + +import org.apache.poi.util.IOUtils; + +import java.io.File; +import java.io.FileInputStream; +import java.io.OutputStream; +import java.util.List; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +/** + * 方便压缩文件使用 + * + * @author jueyue on 19-10-31. + */ +public class PoiZipUtil { + private static final int BUFFER_SIZE = 2 * 1024; + + /** + * 压缩成ZIP 方法1 + * + * @param srcDir 压缩文件夹路径 + * @param out 压缩文件输出流 + * @param KeepDirStructure 是否保留原来的目录结构,true:保留目录结构; + * false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败) + * @throws RuntimeException 压缩失败会抛出运行时异常 + */ + public static void toZip(String srcDir, OutputStream out, boolean KeepDirStructure) + throws RuntimeException { + + ZipOutputStream zos = null; + try { + zos = new ZipOutputStream(out); + File sourceFile = new File(srcDir); + compress(sourceFile, zos, sourceFile.getName(), KeepDirStructure); + } catch (Exception e) { + throw new RuntimeException("zip error from ZipUtils", e); + } finally { + IOUtils.closeQuietly(zos); + } + } + + /** + * 压缩成ZIP 方法2 + * + * @param srcFiles 需要压缩的文件列表 + * @param out 压缩文件输出流 + * @throws RuntimeException 压缩失败会抛出运行时异常 + */ + public static void toZip(List srcFiles, OutputStream out) throws RuntimeException { + long start = System.currentTimeMillis(); + ZipOutputStream zos = null; + try { + zos = new ZipOutputStream(out); + for (File srcFile : srcFiles) { + byte[] buf = new byte[BUFFER_SIZE]; + zos.putNextEntry(new ZipEntry(srcFile.getName())); + int len; + FileInputStream in = new FileInputStream(srcFile); + while ((len = in.read(buf)) != -1) { + zos.write(buf, 0, len); + } + zos.closeEntry(); + in.close(); + } + long end = System.currentTimeMillis(); + } catch (Exception e) { + throw new RuntimeException("zip error from ZipUtils", e); + } finally { + IOUtils.closeQuietly(zos); + } + } + + /** + * 递归压缩方法 + * + * @param sourceFile 源文件 + * @param zos zip输出流 + * @param name 压缩后的名称 + * @param KeepDirStructure 是否保留原来的目录结构,true:保留目录结构; + * false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败) + * @throws Exception + */ + private static void compress(File sourceFile, ZipOutputStream zos, String name, + boolean KeepDirStructure) throws Exception { + byte[] buf = new byte[BUFFER_SIZE]; + if (sourceFile.isFile()) { + // 向zip输出流中添加一个zip实体,构造器中name为zip实体的文件的名字 + zos.putNextEntry(new ZipEntry(name)); + // copy文件到zip输出流中 + int len; + FileInputStream in = new FileInputStream(sourceFile); + while ((len = in.read(buf)) != -1) { + zos.write(buf, 0, len); + } + // Complete the entry + zos.closeEntry(); + in.close(); + } else { + File[] listFiles = sourceFile.listFiles(); + if (listFiles == null || listFiles.length == 0) { + // 需要保留原来的文件结构时,需要对空文件夹进行处理 + if (KeepDirStructure) { + // 空文件夹的处理 + zos.putNextEntry(new ZipEntry(name + "/")); + // 没有文件,不需要文件的copy + zos.closeEntry(); + } + } else { + for (File file : listFiles) { + // 判断是否需要保留原来的文件结构 + if (KeepDirStructure) { + // 注意:file.getName()前面需要带上父文件夹的名字加一斜杠, + // 不然最后压缩包中就不能保留原来的文件结构,即:所有文件都跑到压缩包根目录下了 + compress(file, zos, name + "/" + file.getName(), KeepDirStructure); + } else { + compress(file, zos, file.getName(), KeepDirStructure); + } + } + } + } + } +} diff --git a/easypoi-base/src/main/java/cn/afterturn/easypoi/word/parse/ParseWord07.java b/easypoi-base/src/main/java/cn/afterturn/easypoi/word/parse/ParseWord07.java index 5bdc824..9906a98 100644 --- a/easypoi-base/src/main/java/cn/afterturn/easypoi/word/parse/ParseWord07.java +++ b/easypoi-base/src/main/java/cn/afterturn/easypoi/word/parse/ParseWord07.java @@ -212,7 +212,7 @@ public class ParseWord07 { * 2013-11-16 */ public XWPFDocument parseWord(String url, Map map) throws Exception { - MyXWPFDocument doc = WordCache.getXWPFDocumen(url); + MyXWPFDocument doc = WordCache.getXWPFDocument(url); parseWordSetValue(doc, map); return doc; } @@ -230,12 +230,12 @@ public class ParseWord07 { } else if (list.size() == 0) { return null; } else { - MyXWPFDocument doc = WordCache.getXWPFDocumen(url); + MyXWPFDocument doc = WordCache.getXWPFDocument(url); parseWordSetValue(doc, list.get(0)); //插入分页 doc.createParagraph().setPageBreak(true); for (int i = 1; i < list.size(); i++) { - MyXWPFDocument tempDoc = WordCache.getXWPFDocumen(url); + MyXWPFDocument tempDoc = WordCache.getXWPFDocument(url); parseWordSetValue(tempDoc, list.get(i)); tempDoc.createParagraph().setPageBreak(true); doc.getDocument().addNewBody().set(tempDoc.getDocument().getBody());