|
@@ -1,8 +1,10 @@
|
|
|
package ieven.server.webapp.domain.exporter;
|
|
|
|
|
|
+
|
|
|
import com.mongodb.client.MongoCursor;
|
|
|
import ieven.server.webapp.domain.data.Fields;
|
|
|
import ieven.server.webapp.infrastructure.SpringContextUtil;
|
|
|
+import ieven.server.webapp.util.CSVUtils;
|
|
|
import ieven.server.webapp.util.DataUtils;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
@@ -40,32 +42,25 @@ public class Exporter {
|
|
|
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";
|
|
|
- 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;
|
|
|
while (cursor.hasNext()) {
|
|
|
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);
|
|
|
int cInsert = 0;
|
|
|
// 遍历表头并且插入数据,默认全部为字符串
|
|
@@ -82,12 +77,14 @@ public class Exporter {
|
|
|
cell.setCellType(CellType.NUMERIC);
|
|
|
cell.setCellValue(Double.parseDouble(String.valueOf(value)));
|
|
|
}
|
|
|
- if (cell != null) {
|
|
|
- writer.print(cell.toString());
|
|
|
- }
|
|
|
cInsert++;
|
|
|
}
|
|
|
currentRowRead++;
|
|
|
+ if(currentRowRead>500000){
|
|
|
+ flag= false;
|
|
|
+ currentRowRead=0;
|
|
|
+ currentSheetNum++;
|
|
|
+ }
|
|
|
}
|
|
|
// 创建文件夹防止报错
|
|
|
File file = new File(filePath);
|
|
@@ -95,15 +92,14 @@ public class Exporter {
|
|
|
boolean created = file.mkdirs();
|
|
|
log.info(created ? "创建文件夹成功" : "创建文件夹失败");
|
|
|
}
|
|
|
+ filePath = filePath + File.separator + filename + ".xlsx";
|
|
|
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();
|
|
|
- writer.println();
|
|
|
- writer.close();
|
|
|
return filePath;
|
|
|
-}
|
|
|
+ }
|
|
|
|
|
|
public String export(MongoCursor<Document> cursor, String fileId, String filename)
|
|
|
throws IOException {
|
|
@@ -126,7 +122,7 @@ public class Exporter {
|
|
|
}
|
|
|
|
|
|
public String export(MongoCursor<Document> cursor, String fileId, String filename, String tmpdir)
|
|
|
- throws IOException {
|
|
|
+ throws Exception {
|
|
|
Fields fields =
|
|
|
mongoTemplate.findOne(new Query(Criteria.where("fileId").is(fileId)), Fields.class);
|
|
|
String path = tmpdir + File.separator + filename + ".csv";
|
|
@@ -137,10 +133,298 @@ public class Exporter {
|
|
|
if (file1.exists()) {
|
|
|
file1.delete();
|
|
|
}
|
|
|
- String filePath = this.generateFile(fields, filename, tmpdir, cursor);
|
|
|
+ String filePath = this.generateCsv(fields, filename, tmpdir, cursor);
|
|
|
FileInputStream inputStream = new FileInputStream(filePath);
|
|
|
ObjectId objectId = gridFsTemplate.store(inputStream, filename);
|
|
|
inputStream.close();
|
|
|
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();
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|