Browse Source

增加不使用模板,直接导出示例

yuj 7 years ago
parent
commit
4334b499fd

+ 28 - 0
src/main/java/com/uas/platform/b2c/core/constant/ExcelConstant.java

@@ -0,0 +1,28 @@
+package com.uas.platform.b2c.core.constant;
+
+/**
+ * @author yuj
+ * @date 2018/10/16
+ * @description EXCEL常量类
+ */
+public class ExcelConstant {
+
+    /**
+     * 每个sheet存储的记录数 100W
+     */
+    public static final Integer PER_SHEET_ROW_COUNT = 1000000;
+
+    /**
+     * 每次向EXCEL写入的记录数(查询每页数据大小) 20W
+     */
+    public static final Integer PER_WRITE_ROW_COUNT = 200000;
+
+
+    /**
+     * 每个sheet的写入次数 5
+     */
+    public static final Integer PER_SHEET_WRITE_COUNT = PER_SHEET_ROW_COUNT / PER_WRITE_ROW_COUNT;
+
+
+}
+

+ 29 - 0
src/main/java/com/uas/platform/b2c/core/utils/DateUtil.java

@@ -0,0 +1,29 @@
+package com.uas.platform.b2c.core.utils;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * @author yuj
+ * @date 2018/10/16
+ * @description 日期工具类
+ */
+public class DateUtil {
+
+    public static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
+
+
+    /**
+     * 将日期转换为字符串
+     *
+     * @param date   DATE日期
+     * @param format 转换格式
+     * @return 字符串日期
+     */
+    public static String formatDate(Date date, String format) {
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
+        return simpleDateFormat.format(date);
+    }
+
+
+}

+ 210 - 0
src/main/java/com/uas/platform/b2c/core/utils/PoiUtil.java

@@ -0,0 +1,210 @@
+package com.uas.platform.b2c.core.utils;
+
+import com.uas.platform.b2c.core.constant.ExcelConstant;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.xssf.streaming.SXSSFWorkbook;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.Date;
+
+/**
+ * @author yuj
+ * @date 2018/10/16
+ * @description POI导出工具类
+ */
+public class PoiUtil {
+
+    private final static Logger logger = LoggerFactory.getLogger(PoiUtil.class);
+
+    /**
+     * 初始化EXCEL(sheet个数和标题)
+     *
+     * @param totalRowCount 总记录数
+     * @param titles        标题集合
+     * @return XSSFWorkbook对象
+     */
+    public static SXSSFWorkbook initExcel(Integer totalRowCount, String[] titles) {
+
+        // 在内存当中保持 100 行 , 超过的数据放到硬盘中在内存当中保持 100 行 , 超过的数据放到硬盘中
+        SXSSFWorkbook wb = new SXSSFWorkbook(100);
+
+        Integer sheetCount = ((totalRowCount % ExcelConstant.PER_SHEET_ROW_COUNT == 0) ?
+                (totalRowCount / ExcelConstant.PER_SHEET_ROW_COUNT) : (totalRowCount / ExcelConstant.PER_SHEET_ROW_COUNT + 1));
+
+        // 根据总记录数创建sheet并分配标题
+        for (int i = 0; i < sheetCount; i++) {
+            Sheet sheet = wb.createSheet("sheet" + (i + 1));
+            Row headRow = sheet.createRow(0);
+
+            for (int j = 0; j < titles.length; j++) {
+                Cell headRowCell = headRow.createCell(j);
+                headRowCell.setCellValue(titles[j]);
+            }
+        }
+
+        return wb;
+    }
+
+
+    /**
+     * 下载EXCEL到本地指定的文件夹
+     *
+     * @param wb         EXCEL对象SXSSFWorkbook
+     * @param exportPath 导出路径
+     */
+    public static void downLoadExcelToLocalPath(SXSSFWorkbook wb, String exportPath) {
+        FileOutputStream fops = null;
+        try {
+            fops = new FileOutputStream(exportPath);
+            wb.write(fops);
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (null != wb) {
+                try {
+                    wb.dispose();
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+            if (null != fops) {
+                try {
+                    fops.close();
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
+
+    /**
+     * 下载EXCEL到浏览器
+     *
+     * @param wb       EXCEL对象XSSFWorkbook
+     * @param response
+     * @param fileName 文件名称
+     * @throws IOException
+     */
+    public static void downLoadExcelToWebsite(SXSSFWorkbook wb, HttpServletResponse response, String fileName) throws IOException {
+
+        response.setHeader("Content-disposition", "attachment; filename="
+                + new String((fileName + ".xlsx").getBytes("utf-8"), "ISO8859-1"));//设置下载的文件名
+
+        OutputStream outputStream = null;
+        try {
+            outputStream = response.getOutputStream();
+            wb.write(outputStream);
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (null != wb) {
+                try {
+                    wb.dispose();
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+            if (null != outputStream) {
+                try {
+                    outputStream.close();
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
+
+    /**
+     * 导出Excel到本地指定路径
+     *
+     * @param totalRowCount           总记录数
+     * @param titles                  标题
+     * @param exportPath              导出路径
+     * @param writeExcelDataDelegated 向EXCEL写数据/处理格式的委托类 自行实现
+     * @throws Exception
+     */
+    public static final void exportExcelToLocalPath(Integer totalRowCount, String[] titles, String exportPath, WriteExcelDataDelegated writeExcelDataDelegated) throws Exception {
+
+        logger.info("开始导出:" + DateUtil.formatDate(new Date(), DateUtil.YYYY_MM_DD_HH_MM_SS));
+
+        // 初始化EXCEL
+        SXSSFWorkbook wb = PoiUtil.initExcel(totalRowCount, titles);
+
+        // 调用委托类分批写数据
+        int sheetCount = wb.getNumberOfSheets();
+        for (int i = 0; i < sheetCount; i++) {
+            Sheet eachSheet = wb.getSheetAt(i);
+
+            for (int j = 1; j <= ExcelConstant.PER_SHEET_WRITE_COUNT; j++) {
+
+                int currentPage = i * ExcelConstant.PER_SHEET_WRITE_COUNT + j;
+                int pageSize = ExcelConstant.PER_WRITE_ROW_COUNT;
+                int startRowCount = (j - 1) * ExcelConstant.PER_WRITE_ROW_COUNT + 1;
+                int endRowCount = startRowCount + pageSize - 1;
+
+
+                writeExcelDataDelegated.writeExcelData(eachSheet, startRowCount, endRowCount, currentPage, pageSize);
+
+            }
+        }
+
+
+        // 下载EXCEL
+        PoiUtil.downLoadExcelToLocalPath(wb, exportPath);
+
+        logger.info("导出完成:" + DateUtil.formatDate(new Date(), DateUtil.YYYY_MM_DD_HH_MM_SS));
+    }
+
+
+    /**
+     * 导出Excel到浏览器
+     *
+     * @param response
+     * @param totalRowCount           总记录数
+     * @param fileName                文件名称
+     * @param titles                  标题
+     * @param writeExcelDataDelegated 向EXCEL写数据/处理格式的委托类 自行实现
+     * @throws Exception
+     */
+    public static final void exportExcelToWebsite(HttpServletResponse response, Integer totalRowCount, String fileName, String[] titles, WriteExcelDataDelegated writeExcelDataDelegated) throws Exception {
+
+        logger.info("开始导出:" + DateUtil.formatDate(new Date(), DateUtil.YYYY_MM_DD_HH_MM_SS));
+
+        // 初始化EXCEL
+        SXSSFWorkbook wb = PoiUtil.initExcel(totalRowCount, titles);
+
+
+        // 调用委托类分批写数据
+        int sheetCount = wb.getNumberOfSheets();
+        for (int i = 0; i < sheetCount; i++) {
+            Sheet eachSheet = wb.getSheetAt(i);
+
+            for (int j = 1; j <= ExcelConstant.PER_SHEET_WRITE_COUNT; j++) {
+
+                int currentPage = i * ExcelConstant.PER_SHEET_WRITE_COUNT + j;
+                int pageSize = ExcelConstant.PER_WRITE_ROW_COUNT;
+                int startRowCount = (j - 1) * ExcelConstant.PER_WRITE_ROW_COUNT + 1;
+                int endRowCount = startRowCount + pageSize - 1;
+
+                writeExcelDataDelegated.writeExcelData(eachSheet, startRowCount, endRowCount, currentPage, pageSize);
+
+            }
+        }
+
+        // 下载EXCEL
+        PoiUtil.downLoadExcelToWebsite(wb, response, fileName);
+
+        logger.info("导出完成:" + DateUtil.formatDate(new Date(), DateUtil.YYYY_MM_DD_HH_MM_SS));
+    }
+
+
+}

+ 24 - 0
src/main/java/com/uas/platform/b2c/core/utils/WriteExcelDataDelegated.java

@@ -0,0 +1,24 @@
+package com.uas.platform.b2c.core.utils;
+
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.xssf.streaming.SXSSFSheet;
+
+/**
+ * @author qjwyss
+ * @date 2018/9/20
+ * @description EXCEL写数据委托类
+ */
+public interface WriteExcelDataDelegated {
+
+    /**
+     * EXCEL写数据委托类  针对不同的情况自行实现
+     *
+     * @param eachSheet     指定SHEET
+     * @param startRowCount 开始行
+     * @param endRowCount   结束行
+     * @param currentPage   分批查询开始页
+     * @param pageSize      分批查询数据量
+     * @throws Exception
+     */
+    public abstract void writeExcelData(Sheet eachSheet, Integer startRowCount, Integer endRowCount, Integer currentPage, Integer pageSize) throws Exception;
+}

+ 12 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/controller/ProductController.java

@@ -7,6 +7,8 @@ import com.uas.platform.b2c.core.support.SystemSession;
 import com.uas.platform.b2c.core.support.log.UsageBufferedLogger;
 import com.uas.platform.b2c.core.support.view.JxlsExcelView;
 import com.uas.platform.b2c.core.support.view.JxlsxExcelView;
+import com.uas.platform.b2c.core.utils.PoiUtil;
+import com.uas.platform.b2c.core.utils.WriteExcelDataDelegated;
 import com.uas.platform.b2c.prod.commodity.facade.ProductFacade;
 import com.uas.platform.b2c.prod.commodity.model.*;
 import com.uas.platform.b2c.prod.commodity.service.GoodsService;
@@ -29,6 +31,7 @@ import org.springframework.web.servlet.ModelAndView;
 import org.springframework.web.servlet.view.json.MappingJackson2JsonView;
 
 import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;
 import java.io.UnsupportedEncodingException;
 import java.util.ArrayList;
@@ -519,4 +522,13 @@ public class ProductController {
 		return modelAndView;
 	}
 
+	/**
+	 * 导出的测试数据
+	 * @param response
+	 */
+	@RequestMapping(value = "/test/export", method = RequestMethod.GET)
+	public void exportToWebSite(HttpServletResponse response) {
+		productService.exportToWebSite(response);
+	}
+
 }

+ 3 - 0
src/main/java/com/uas/platform/b2c/prod/commodity/service/ProductService.java

@@ -15,6 +15,7 @@ import com.uas.platform.core.model.PageInfo;
 import com.uas.platform.core.model.PageParams;
 import org.springframework.data.domain.Page;
 
+import javax.servlet.http.HttpServletResponse;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -418,4 +419,6 @@ public interface ProductService {
      * @return
      */
     List<Product> getProductByEnuuByCommonDao();
+
+    void exportToWebSite(HttpServletResponse response);
 }

+ 50 - 5
src/main/java/com/uas/platform/b2c/prod/commodity/service/impl/ProductServiceImpl.java

@@ -19,10 +19,7 @@ import com.uas.platform.b2c.core.constant.SplitChar;
 import com.uas.platform.b2c.core.constant.Status;
 import com.uas.platform.b2c.core.support.SystemSession;
 import com.uas.platform.b2c.core.support.log.UsageBufferedLogger;
-import com.uas.platform.b2c.core.utils.FastjsonUtils;
-import com.uas.platform.b2c.core.utils.NumberUtil;
-import com.uas.platform.b2c.core.utils.RegexConstant;
-import com.uas.platform.b2c.core.utils.StringUtilB2C;
+import com.uas.platform.b2c.core.utils.*;
 import com.uas.platform.b2c.prod.commodity.constant.DoubleConstant;
 import com.uas.platform.b2c.prod.commodity.constant.ErrorInfoConstant;
 import com.uas.platform.b2c.prod.commodity.constant.PublicProductUrl;
@@ -124,6 +121,7 @@ import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
+import javax.servlet.http.HttpServletResponse;
 import java.io.*;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
@@ -2899,7 +2897,7 @@ public class ProductServiceImpl implements ProductService {
      */
     @Override
     public List<Product> getProductByEnuuByCommonDao() {
-        String sql = "select pr_code,pr_pcmpcode from products where pr_enuu = %d";
+        String sql = "select pr_code,pr_pcmpcode,pr_title,pr_cmpuuid,pr_pbranden,pr_packaging,pr_create_time,pr_reserve,pr_cmpimg,pr_enuu,pr_encapsulation,pr_kinden,pr_spec from products where pr_enuu = %d";
         List<Map<String, Object>> queryForList = jdbcTemplate.queryForList(String.format(sql, 10041559L)); // 68136条数据
         List<Product> list = new ArrayList<>();
         Product p = null;
@@ -2909,8 +2907,55 @@ public class ProductServiceImpl implements ProductService {
             p.setProdNum(StringUtilB2C.getStr(pr_code));
             Object prPcmpcode = objectMap.get("pr_pcmpcode");
             p.setPcmpcode(StringUtilB2C.getStr(prPcmpcode));
+            Object pr_title = objectMap.get("pr_title");
+            p.setProdName(StringUtilB2C.getStr(pr_title));
+
+            Object pr_cmpuuid = objectMap.get("pr_cmpuuid");
+            p.setCmpUuId(StringUtilB2C.getStr(pr_cmpuuid));
+
+            Object pr_pbranden = objectMap.get("pr_pbranden");
+            p.setPbranden(StringUtilB2C.getStr(pr_pbranden));
+
+            Object pr_packaging = objectMap.get("pr_packaging");
+            p.setPackaging(StringUtilB2C.getStr(pr_packaging));
+
+            Object pr_create_time = objectMap.get("pr_create_time");
+//            if (!StringUtilB2C.isEmpty(pr_create_time)) {
+//                System.out.println(pr_create_time + "---" + pr_code);
+//                p.setCreateTime(new Date(StringUtilB2C.getStr(pr_create_time).toString()));
+//            }
+
+            Object pr_reserve = objectMap.get("pr_reserve");
+            String doul = StringUtilB2C.getStr(pr_reserve).equals("") ? "0" : StringUtilB2C.getStr(pr_reserve);
+            p.setErpReserve(Double.valueOf(doul));
+
+            Object pr_cmpimg = objectMap.get("pr_cmpimg");
+            p.setCmpImg(StringUtilB2C.getStr(pr_cmpimg));
+
+            Object pr_enuu = objectMap.get("pr_enuu");
+            p.setEnUU(Long.valueOf(StringUtilB2C.getStr(pr_enuu)));
+
+            Object pr_encapsulation = objectMap.get("pr_encapsulation");
+            p.setEncapsulation(StringUtilB2C.getStr(pr_encapsulation));
+
+            Object pr_kinden = objectMap.get("pr_kinden");
+            p.setKinden(StringUtilB2C.getStr(pr_kinden));
+
+            Object pr_spec = objectMap.get("pr_spec");
+            p.setSpec(StringUtilB2C.getStr(pr_spec));
+
             list.add(p);
         }
         return list;
     }
+
+    @Override
+    public void exportToWebSite(HttpServletResponse response) {
+        String[] titles = {"物料编号", "型号", "物料名称", "uuid", "英文品牌", "包装方式", "创建时间", "库存", "图片地址", "enuu", "封装", "类目", "规格"};
+        String sql = "select count(pr_id) from products where pr_enuu = %d";
+        String url = String.format(sql, 10041559L);
+        PoiUtil.exportExcelToWebsite(response, totalRowCount, "测试export", "", new WriteExcelDataDelegated() {
+
+        }
+    }
 }

BIN
src/main/resources/jxls-tpl/trade/test.xlsx