Pārlūkot izejas kodu

资金导出excel

hankunkun 11 mēneši atpakaļ
vecāks
revīzija
38fd4bca87

+ 13 - 11
pom.xml

@@ -51,25 +51,27 @@
         </dependency>
         </dependency>
         <dependency>
         <dependency>
             <groupId>org.apache.poi</groupId>
             <groupId>org.apache.poi</groupId>
-            <artifactId>ooxml-schemas</artifactId>
-            <version>1.1</version
-            <type>pom</type>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.poi</groupId>
-            <artifactId>poi</artifactId>
-            <version>5.3.0</version>
+            <artifactId>poi-ooxml</artifactId>
+            <version>4.1.2</version>
         </dependency>
         </dependency>
-        <dependency>
+    <!--    <dependency>
             <groupId>org.apache.poi</groupId>
             <groupId>org.apache.poi</groupId>
             <artifactId>ooxml-schemas</artifactId>
             <artifactId>ooxml-schemas</artifactId>
             <version>1.1</version>
             <version>1.1</version>
+            <type>pom</type>
         </dependency>
         </dependency>
         <dependency>
         <dependency>
             <groupId>org.apache.poi</groupId>
             <groupId>org.apache.poi</groupId>
             <artifactId>poi-ooxml</artifactId>
             <artifactId>poi-ooxml</artifactId>
-            <version>5.3.0</version>
+            <version>5.2.5</version>
         </dependency>
         </dependency>
+
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi</artifactId>
+            <version>5.2.5</version>
+        </dependency>-->
+
         <dependency>
         <dependency>
             <groupId>dom4j</groupId>
             <groupId>dom4j</groupId>
             <artifactId>dom4j</artifactId>
             <artifactId>dom4j</artifactId>
@@ -112,7 +114,7 @@
         <dependency>
         <dependency>
             <groupId>cn.hutool</groupId>
             <groupId>cn.hutool</groupId>
             <artifactId>hutool-all</artifactId>
             <artifactId>hutool-all</artifactId>
-            <version>5.6.5</version>
+            <version>5.6.6</version>
         </dependency>
         </dependency>
 
 
         <!-- cpdetector 检测文件编码格式 -->
         <!-- cpdetector 检测文件编码格式 -->

+ 318 - 34
src/main/java/ieven/server/webapp/domain/exporter/Exporter.java

@@ -1,8 +1,10 @@
 package ieven.server.webapp.domain.exporter;
 package ieven.server.webapp.domain.exporter;
 
 
+
 import com.mongodb.client.MongoCursor;
 import com.mongodb.client.MongoCursor;
 import ieven.server.webapp.domain.data.Fields;
 import ieven.server.webapp.domain.data.Fields;
 import ieven.server.webapp.infrastructure.SpringContextUtil;
 import ieven.server.webapp.infrastructure.SpringContextUtil;
+import ieven.server.webapp.util.CSVUtils;
 import ieven.server.webapp.util.DataUtils;
 import ieven.server.webapp.util.DataUtils;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -40,32 +42,25 @@ public class Exporter {
         Workbook wb = new SXSSFWorkbook(1000); // 关键语句
         Workbook wb = new SXSSFWorkbook(1000); // 关键语句
         Sheet sheet = null; // 工作表对象
         Sheet sheet = null; // 工作表对象
         Row cRow = null; // 行对象
         Row cRow = null; // 行对象
-        // 创建sheet
-        if (sheet == null) {
-            sheet = wb.createSheet("sheet" + currentSheetNum);
-        }
-        filePath = filePath + File.separator + filename + ".csv";
-        PrintWriter writer = new PrintWriter(new FileWriter(filePath));
-        // 创建表头
-        cRow = sheet.createRow(0);
-        int hcIndex = 0;
-        for (Map.Entry<String, String> entry : headersReverse.entrySet()) {
-            String key = entry.getKey();
-            Cell cell = cRow.createCell(hcIndex);
-            cell.setCellValue(key);
-            if (cell != null) {
-                writer.print(cell.toString());
-                if (cellnum < row.getLastCellNum() - 1) {
-                    writer.print(",");
-                }
-            }
-            hcIndex++;
-        }
-        currentRowRead++;
-        // 创建内容
+
+        boolean flag=false;
         Document doc;
         Document doc;
         while (cursor.hasNext()) {
         while (cursor.hasNext()) {
             doc = cursor.next();
             doc = cursor.next();
+            if (!flag) {
+                sheet = wb.createSheet("sheet" + currentSheetNum);
+                // 创建表头
+                cRow = sheet.createRow(0);
+                int hcIndex = 0;
+                for (Map.Entry<String, String> entry : headersReverse.entrySet()) {
+                    String key = entry.getKey();
+                    Cell cell = cRow.createCell(hcIndex);
+                    cell.setCellValue(key);
+                    hcIndex++;
+                }
+                currentRowRead++;
+                flag= true;
+            }
             cRow = sheet.createRow(currentRowRead);
             cRow = sheet.createRow(currentRowRead);
             int cInsert = 0;
             int cInsert = 0;
             // 遍历表头并且插入数据,默认全部为字符串
             // 遍历表头并且插入数据,默认全部为字符串
@@ -82,12 +77,14 @@ public class Exporter {
                     cell.setCellType(CellType.NUMERIC);
                     cell.setCellType(CellType.NUMERIC);
                     cell.setCellValue(Double.parseDouble(String.valueOf(value)));
                     cell.setCellValue(Double.parseDouble(String.valueOf(value)));
                 }
                 }
-                if (cell != null) {
-                    writer.print(cell.toString());
-                }
                 cInsert++;
                 cInsert++;
             }
             }
             currentRowRead++;
             currentRowRead++;
+            if(currentRowRead>500000){
+                flag= false;
+                currentRowRead=0;
+                currentSheetNum++;
+            }
         }
         }
         // 创建文件夹防止报错
         // 创建文件夹防止报错
         File file = new File(filePath);
         File file = new File(filePath);
@@ -95,15 +92,14 @@ public class Exporter {
             boolean created = file.mkdirs();
             boolean created = file.mkdirs();
             log.info(created ? "创建文件夹成功" : "创建文件夹失败");
             log.info(created ? "创建文件夹成功" : "创建文件夹失败");
         }
         }
+        filePath = filePath + File.separator + filename + ".xlsx";
         log.info("导出路径:" + filePath);
         log.info("导出路径:" + filePath);
-        //FileOutputStream fOut = new FileOutputStream(filePath);
-        //wb.write(fOut);
-        //fOut.close();
+        FileOutputStream fOut = new FileOutputStream(filePath);
+        wb.write(fOut);
+        fOut.close();
         wb.close();
         wb.close();
-        writer.println();
-        writer.close();
         return filePath;
         return filePath;
-}
+    }
 
 
     public String export(MongoCursor<Document> cursor, String fileId, String filename)
     public String export(MongoCursor<Document> cursor, String fileId, String filename)
             throws IOException {
             throws IOException {
@@ -126,7 +122,7 @@ public class Exporter {
     }
     }
 
 
     public String export(MongoCursor<Document> cursor, String fileId, String filename, String tmpdir)
     public String export(MongoCursor<Document> cursor, String fileId, String filename, String tmpdir)
-            throws IOException {
+            throws Exception {
         Fields fields =
         Fields fields =
                 mongoTemplate.findOne(new Query(Criteria.where("fileId").is(fileId)), Fields.class);
                 mongoTemplate.findOne(new Query(Criteria.where("fileId").is(fileId)), Fields.class);
         String path = tmpdir + File.separator + filename + ".csv";
         String path = tmpdir + File.separator + filename + ".csv";
@@ -137,10 +133,298 @@ public class Exporter {
         if (file1.exists()) {
         if (file1.exists()) {
             file1.delete();
             file1.delete();
         }
         }
-        String filePath = this.generateFile(fields, filename, tmpdir, cursor);
+        String filePath = this.generateCsv(fields, filename, tmpdir, cursor);
         FileInputStream inputStream = new FileInputStream(filePath);
         FileInputStream inputStream = new FileInputStream(filePath);
         ObjectId objectId = gridFsTemplate.store(inputStream, filename);
         ObjectId objectId = gridFsTemplate.store(inputStream, filename);
         inputStream.close();
         inputStream.close();
         return objectId.toHexString();
         return objectId.toHexString();
     }
     }
+
+    public String generateCsv(Fields fields, String filename, String filePath, MongoCursor<Document> cursor) throws Exception {
+        LinkedHashMap<String, String> headers = fields.getFields();
+        LinkedHashMap<String, String> headersReverse = fields.getFieldsReverse();
+        filePath = filePath + File.separator + filename + ".csv";
+
+        FileWriter writer = new FileWriter(filePath);
+        StringBuilder header = new StringBuilder();
+        for (Map.Entry<String, String> entry : headersReverse.entrySet()) {
+            header.append(entry.getKey());
+            header.append(",");
+        }
+        header.deleteCharAt(header.length() - 1);
+        writer.write(header.toString());
+        writer.append("\n");
+        // 创建内容
+        Document doc;
+        while (cursor.hasNext()) {
+            doc = cursor.next();
+            // 遍历表头并且插入数据,默认全部为字符串
+            StringBuilder data = new StringBuilder();
+            for (String alias : headers.keySet()) {
+                Object value = doc.get(alias);
+                if (StringUtils.isBlank(String.valueOf(value)) || "null".equals(String.valueOf(value))) {
+                    data.append("");
+                } else {
+                    data.append(value);
+                }
+                data.append(",");
+            }
+            data.deleteCharAt(data.length() - 1);
+            writer.write(data.toString());
+            writer.append("\n");
+        }
+        // 创建文件夹防止报错
+        File file = new File(filePath);
+        if (!file.exists()) {
+            boolean created = file.mkdirs();
+            log.info(created ? "创建文件夹成功" : "创建文件夹失败");
+        }
+        log.info("导出路径:" + filePath);
+        writer.close();
+        return filePath;
+    }
+
+    public String generateFileElse(
+            Fields fields, String filename, String filePath, MongoCursor<Document> cursor)
+            throws IOException {
+        LinkedHashMap<String, String> headers = fields.getFields();
+        LinkedHashMap<String, String> headersReverse = fields.getFieldsReverse();
+        int currentRowRead = 0;
+        int currentSheetNum = 1;
+        Workbook wb = new SXSSFWorkbook(1000); // 关键语句
+        Sheet sheet = null; // 工作表对象
+        Row cRow = null; // 行对象
+        // 创建sheet
+        if (sheet == null) {
+            sheet = wb.createSheet("sheet" + currentSheetNum);
+        }
+        filePath = filePath + File.separator + filename + ".csv";
+        // 创建表头
+        cRow = sheet.createRow(0);
+        int hcIndex = 0;
+        for (Map.Entry<String, String> entry : headersReverse.entrySet()) {
+            String key = entry.getKey();
+            Cell cell = cRow.createCell(hcIndex);
+            cell.setCellValue(key);
+            hcIndex++;
+        }
+        currentRowRead++;
+        // 创建内容
+        Document doc;
+        while (cursor.hasNext()) {
+            doc = cursor.next();
+            cRow = sheet.createRow(currentRowRead);
+            int cInsert = 0;
+            // 遍历表头并且插入数据,默认全部为字符串
+            for (String alias : headers.keySet()) {
+                Cell cell = cRow.createCell(cInsert);
+                Object value = doc.get(alias);
+                if (value instanceof String) {
+                    if (StringUtils.isBlank(String.valueOf(value)) || "null".equals(String.valueOf(value))) {
+                        cell.setCellValue("");
+                    } else {
+                        cell.setCellValue((String) value);
+                    }
+                } else if (value instanceof Number) {
+                    cell.setCellType(CellType.NUMERIC);
+                    cell.setCellValue(Double.parseDouble(String.valueOf(value)));
+                }
+                cInsert++;
+            }
+            currentRowRead++;
+        }
+        CSVUtils.sheetToCSV(sheet, filePath);
+        // 创建文件夹防止报错
+        File file = new File(filePath);
+        if (!file.exists()) {
+            boolean created = file.mkdirs();
+            log.info(created ? "创建文件夹成功" : "创建文件夹失败");
+        }
+        log.info("导出路径:" + filePath);
+        wb.close();
+        return filePath;
+    }
+
+
+    public static String test(String filename, String filePath) throws Exception {
+        LinkedHashMap<String, String> headers = new LinkedHashMap<>();
+        headers.put("测试1", "测试1");
+        headers.put("测试2", "测试2");
+        headers.put("测试3", "测试3");
+        LinkedHashMap<String, String> headersReverse = new LinkedHashMap<>();
+        headersReverse.put("测试1", "测试1");
+        headersReverse.put("测试2", "测试2");
+        headersReverse.put("测试3", "测试3");
+        filePath = filePath + File.separator + filename + ".csv";
+
+        FileWriter writer = new FileWriter(filePath);
+        StringBuilder header = new StringBuilder();
+        for (Map.Entry<String, String> entry : headersReverse.entrySet()) {
+            header.append(entry.getKey());
+            header.append(",");
+        }
+        header.deleteCharAt(header.length() - 1);
+        writer.write(header.toString());
+        writer.append("\n");
+
+        for (int i = 0; i < 2000; i++) {
+            StringBuilder data=new StringBuilder();
+            for (String alias : headers.keySet()){
+                data.append(i);
+                data.append(",");
+            }
+            data.deleteCharAt(data.length() - 1);
+            writer.write(data.toString());
+            writer.append("\n");
+        }
+        // 创建内容
+       /* Document doc;
+        while (cursor.hasNext()) {
+            doc = cursor.next();
+            // 遍历表头并且插入数据,默认全部为字符串
+
+            for (String alias : headers.keySet()) {
+                Object value = doc.get(alias);
+                if (StringUtils.isBlank(String.valueOf(value)) || "null".equals(String.valueOf(value))) {
+                    data.append("");
+                } else {
+                    data.append(value);
+                }
+                data.append(",");
+            }
+            data.deleteCharAt(data.length() - 1);
+            writer.write(data.toString());
+            writer.append("\n");
+        }*/
+        // 创建文件夹防止报错
+        File file = new File(filePath);
+        if (!file.exists()) {
+            boolean created = file.mkdirs();
+            log.info(created ? "创建文件夹成功" : "创建文件夹失败");
+        }
+        log.info("导出路径:" + filePath);
+        writer.close();
+        return filePath;
+    }
+
+    public static String test01(String filename, String filePath)throws IOException {
+        LinkedHashMap<String, String> headers = new LinkedHashMap<>();
+        headers.put("测试1", "测试1");
+        headers.put("测试2", "测试2");
+        headers.put("测试3", "测试3");
+        LinkedHashMap<String, String> headersReverse = new LinkedHashMap<>();
+        headersReverse.put("测试1", "测试1");
+        headersReverse.put("测试2", "测试2");
+        headersReverse.put("测试3", "测试3");
+        int currentRowRead = 0;
+        int currentSheetNum = 1;
+        Workbook wb = new SXSSFWorkbook(1000); // 关键语句
+        Sheet sheet = null; // 工作表对象
+        Row cRow = null; // 行对象
+        // 创建sheet
+        if (sheet == null) {
+            sheet = wb.createSheet("sheet" + currentSheetNum);
+        }
+        filePath = filePath + File.separator + filename + ".csv";
+        // 创建表头
+        cRow = sheet.createRow(0);
+        int hcIndex = 0;
+        for (Map.Entry<String, String> entry : headersReverse.entrySet()) {
+            String key = entry.getKey();
+            Cell cell = cRow.createCell(hcIndex);
+            cell.setCellValue(key);
+            hcIndex++;
+        }
+        currentRowRead++;
+
+        for(int i=0;i<2000000;i++){
+            cRow = sheet.createRow(currentRowRead);
+            int cInsert = 0;
+            for (String alias : headers.keySet()) {
+                Cell cell = cRow.createCell(cInsert);
+                cell.setCellValue(i);
+                cInsert++;
+            }
+            currentRowRead++;
+        }
+        CSVUtils.sheetToCSV(sheet, filePath);
+        // 创建文件夹防止报错
+        File file = new File(filePath);
+        if (!file.exists()) {
+            boolean created = file.mkdirs();
+            log.info(created ? "创建文件夹成功" : "创建文件夹失败");
+        }
+        log.info("导出路径:" + filePath);
+        wb.close();
+        return filePath;
+    }
+
+    public static String test02(String filename, String filePath)throws IOException {
+        LinkedHashMap<String, String> headers = new LinkedHashMap<>();
+        headers.put("测试1", "测试1");
+        headers.put("测试2", "测试2");
+        headers.put("测试3", "测试3");
+        LinkedHashMap<String, String> headersReverse = new LinkedHashMap<>();
+        headersReverse.put("测试1", "测试1");
+        headersReverse.put("测试2", "测试2");
+        headersReverse.put("测试3", "测试3");
+        int currentRowRead = 0;
+        int currentSheetNum = 1;
+        Workbook wb = new SXSSFWorkbook(1000); // 关键语句
+        Sheet sheet = null; // 工作表对象
+        Row cRow = null; // 行对象
+        // 创建内容
+        boolean flag=false;
+        for(int i=0;i<2000000;i++){
+            // 创建sheet
+            if (!flag) {
+                sheet = wb.createSheet("sheet" + currentSheetNum);
+                // 创建表头
+                cRow = sheet.createRow(0);
+                int hcIndex = 0;
+                for (Map.Entry<String, String> entry : headersReverse.entrySet()) {
+                    String key = entry.getKey();
+                    Cell cell = cRow.createCell(hcIndex);
+                    cell.setCellValue(key);
+                    hcIndex++;
+                }
+                currentRowRead++;
+                flag= true;
+            }
+            cRow = sheet.createRow(currentRowRead);
+            int cInsert = 0;
+            for (String alias : headers.keySet()) {
+                Cell cell = cRow.createCell(cInsert);
+                cell.setCellValue(i);
+                cInsert++;
+            }
+            currentRowRead++;
+            if(currentRowRead>500000){
+                flag= false;
+                currentRowRead=0;
+                currentSheetNum++;
+            }
+        }
+        // 创建文件夹防止报错
+        File file = new File(filePath);
+        if (!file.exists()) {
+            boolean created = file.mkdirs();
+            log.info(created ? "创建文件夹成功" : "创建文件夹失败");
+        }
+        filePath = filePath + File.separator + filename + ".csv";
+        log.info("导出路径:" + filePath);
+        FileOutputStream fOut = new FileOutputStream(filePath);
+        wb.write(fOut);
+        fOut.close();
+        wb.close();
+        return filePath;
+    }
+
+    public static void main(String[] args) {
+        try {
+            test02("ceshi","D:\\services\\current_apps\\temp");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
 }
 }

+ 67 - 0
src/main/java/ieven/server/webapp/util/CSVUtils.java

@@ -0,0 +1,67 @@
+package ieven.server.webapp.util;
+
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+
+import java.io.BufferedWriter;
+import java.io.FileWriter;
+import java.io.IOException;
+
+/**
+ * @author hankunkun
+ * @version 1.0
+ * @date 2024/9/5 11:16
+ */
+public class CSVUtils {
+    public static void sheetToCSV(Sheet sheet, String csvFilePath) throws IOException {
+        try (BufferedWriter writer = new BufferedWriter(new FileWriter(csvFilePath))) {
+            // 遍历行
+            for (Row row : sheet) {
+                // 创建一个StringBuilder来构建CSV行
+                StringBuilder sb = new StringBuilder();
+
+                // 遍历单元格
+                for (int i = 0; i < row.getLastCellNum(); i++) {
+                    Cell cell = row.getCell(i, Row.MissingCellPolicy.RETURN_BLANK_AS_NULL);
+                    if (cell != null) {
+                        // 根据单元格类型处理数据
+                        switch (cell.getCellType()) {
+                            case STRING:
+                                sb.append(cell.getStringCellValue()).append(",");
+                                break;
+                            case NUMERIC:
+                                // 注意:这里可能需要处理日期格式
+                                sb.append(cell.getNumericCellValue()).append(",");
+                                break;
+                            case BOOLEAN:
+                                sb.append(cell.getBooleanCellValue()).append(",");
+                                break;
+                            case FORMULA:
+                                // 处理公式结果,可能需要先评估公式
+                                sb.append(cell.getCellFormula()).append(",");
+                                break;
+                            case BLANK:
+                                // 空单元格,可以添加空字符串或跳过
+                                sb.append(",");
+                                break;
+                            default:
+                                // 其他类型,可以添加空字符串或抛出异常
+                                sb.append(",");
+                        }
+                    } else {
+                        // 单元格为空,添加空字符串
+                        sb.append(",");
+                    }
+                }
+
+                // 移除最后一个逗号,并写入CSV文件
+                if (sb.length() > 0) {
+                    sb.setLength(sb.length() - 1); // 移除最后一个逗号
+                }
+                writer.write(sb.toString());
+                writer.newLine(); // 写入新行
+            }
+        }
+    }
+}