Browse Source

fix 修改备注,修改方法名

DYH2020 2 years ago
parent
commit
2dd6227f55

+ 6 - 16
src/main/java/com/ywt/mg/services/DownloadRecordService.java

@@ -1,8 +1,5 @@
 package com.ywt.mg.services;
 
-import com.ywt.gapi.ResultCode;
-import com.ywt.gapi.base.file.ReadFileRequest;
-import com.ywt.gapi.base.file.ReadFileResponse;
 import com.ywt.mg.configs.Constants;
 import com.ywt.mg.core.PagedList;
 import com.ywt.mg.core.SqlHelper;
@@ -13,31 +10,24 @@ import com.ywt.mg.domain.models.ConstantDef;
 import com.ywt.mg.domain.models.ExcelDataMap;
 import com.ywt.mg.domain.models.ExcelStyleMap;
 import com.ywt.mg.domain.models.enums.DownloadRecordStatusEnum;
-import com.ywt.mg.domain.models.enums.TosEnum;
 import com.ywt.mg.domain.models.pojo.CustomExcelItem;
 import com.ywt.mg.domain.models.pojo.ExcelCollectPojo;
 import com.ywt.mg.domain.ywtDrugEntities.Pharmacy;
-import com.ywt.mg.domain.ywtDrugEntities.PharmacyRepository;
 import com.ywt.mg.params.downloadRecord.DownloadFileRequest;
 import com.ywt.mg.params.downloadRecord.QueryDownloadRecordListRequest;
-import com.ywt.mg.params.offline.DownloadOfflineListNewRequest;
 import com.ywt.mg.web.BaseResponse;
 import com.ywt.mg.web.DataResponse;
 import com.ywt.mg.web.PageDataResponse;
+import com.ywt.mg.web.common.ExcelDownloadSrvOld;
 import com.ywt.mg.web.common.ExcelDownloadSrv;
-import com.ywt.mg.web.common.ExcelDownloadSrvNew;
 import com.ywt.mg.web.common.FileSrv;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.stereotype.Service;
-import sun.rmi.runtime.Log;
-import sun.security.provider.MD5;
 
 import javax.servlet.http.HttpServletResponse;
 import java.io.*;
-import java.nio.channels.FileChannel;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.*;
@@ -65,11 +55,11 @@ public class DownloadRecordService {
     private FileSrv fileSrv;
 
     @Autowired
-    private ExcelDownloadSrv excelDownloadSrv;
+    private ExcelDownloadSrv excelDownloadSrvOld;
 
 
     @Autowired
-    private ExcelDownloadSrvNew excelDownloadSrvNew;
+    private ExcelDownloadSrv excelDownloadSrv;
 
     /**
      * 得到(重复点击情况下的下载记录)或插入一条新的下载记录
@@ -346,10 +336,10 @@ public class DownloadRecordService {
         /*
         // ------ start test ----------
          OutputStream ba = excelDownloadSrvNew.generateAndReturnExcelByteArrayOutputStreamWithStyleAndCollect(fileName, localPath, map, excelStyleMap, itemList, size);
-         excelDownloadSrvNew.outputStreamToFile(localPath, ba);
+         excelDownloadSrv.outputStreamToFile(localPath, ba);
          // ------ test end ----------
          */
-        OutputStream ba = excelDownloadSrv.generateAndReturnExcelFileWithNoStyleAndCollectLocal(fileName, localPath, map, excelStyleMap, itemList, size);
+        OutputStream ba = excelDownloadSrv.generateAndReturnExcelByteArrayOutputStreamWithStyleAndCollect(fileName, localPath, map, excelStyleMap, itemList, size);
         // 本地文件上传到oss,文件名带后缀
         String ossPath = String.format(ConstantDef.BIG_DATA_EXCEL_FILE_PATH, FormatUtil.formatDate(new Date(), "yyyy-MM"));
         String ossFileName = fileName + suffixFormat;
@@ -385,7 +375,7 @@ public class DownloadRecordService {
 
         // 生成本地文件
         ExcelStyleMap excelStyleMap = new ExcelStyleMap(new String[]{});
-        OutputStream ba = excelDownloadSrv.generateAndReturnMealExcelFileWithNoStyleAndCollectLocal(fileName, localPath, map, excelStyleMap, itemList, size);
+        OutputStream ba = excelDownloadSrv.generateAndReturnExcelByteArrayOutputStreamWithStyle(fileName, localPath, map, excelStyleMap, itemList);
 
         // 本地文件上传到oss,文件名带后缀
         String ossPath = String.format(ConstantDef.BIG_DATA_EXCEL_FILE_PATH, FormatUtil.formatDate(new Date(), "yyyy-MM"));

+ 10 - 10
src/main/java/com/ywt/mg/services/MealOrderService.java

@@ -15,7 +15,7 @@ import com.ywt.mg.domain.models.nutrimeal.MealOrderInfo;
 import com.ywt.mg.domain.models.pojo.CustomExcelItem;
 import com.ywt.mg.domain.models.pojo.ExcelCollectPojo;
 import com.ywt.mg.params.mealOrder.MealOrderListRequest;
-import com.ywt.mg.web.common.ExcelDownloadSrv;
+import com.ywt.mg.web.common.ExcelDownloadSrvOld;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -604,23 +604,23 @@ public class MealOrderService {
         }
         if (customExcelItemList.size() > 0) {
             customExcelItemList.add(new CustomExcelItem(startColumn + 1, startRows,
-                    "备注(单位:元):", ExcelDownloadSrv.getCellFormat4StatRemarkWithNoSetBorder()));
+                    "备注(单位:元):", ExcelDownloadSrvOld.getCellFormat4StatRemarkWithNoSetBorder()));
             customExcelItemList.add(new CustomExcelItem(startColumn + 1, startRows + 1,
-                    "1、支付总额=微信支付总额+金币支付总额+现场支付总额;", ExcelDownloadSrv.getCellFormat4StatRemarkWithNoSetBorder()));
+                    "1、支付总额=微信支付总额+金币支付总额+现场支付总额;", ExcelDownloadSrvOld.getCellFormat4StatRemarkWithNoSetBorder()));
             customExcelItemList.add(new CustomExcelItem(startColumn + 1, startRows + 2,
-                    "2、退款总额=微信退款总额+金币退款总额+现场退款总额;", ExcelDownloadSrv.getCellFormat4StatRemarkWithNoSetBorder()));
+                    "2、退款总额=微信退款总额+金币退款总额+现场退款总额;", ExcelDownloadSrvOld.getCellFormat4StatRemarkWithNoSetBorder()));
             customExcelItemList.add(new CustomExcelItem(startColumn + 1, startRows + 3,
-                    "3、实际支付总额=微信实际支付总额+金币实际支付总额+现场实际支付总额=支付总额-退款总额;", ExcelDownloadSrv.getCellFormat4StatRemarkWithNoSetBorder()));
+                    "3、实际支付总额=微信实际支付总额+金币实际支付总额+现场实际支付总额=支付总额-退款总额;", ExcelDownloadSrvOld.getCellFormat4StatRemarkWithNoSetBorder()));
             customExcelItemList.add(new CustomExcelItem(startColumn + 1, startRows + 4,
-                    "4、总成本=微信点单成本+金币点单成本+现场点单成本(也等于各个菜品成本价乘以份数的相加的总额);", ExcelDownloadSrv.getCellFormat4StatRemarkWithNoSetBorder()));
+                    "4、总成本=微信点单成本+金币点单成本+现场点单成本(也等于各个菜品成本价乘以份数的相加的总额);", ExcelDownloadSrvOld.getCellFormat4StatRemarkWithNoSetBorder()));
             customExcelItemList.add(new CustomExcelItem(startColumn + 1, startRows + 5,
-                    "5、微信点单成本:支付方式是“微信支付”的订单,其各个菜品成本价乘以份数的相加的总额(不包含退款订单);", ExcelDownloadSrv.getCellFormat4StatRemarkWithNoSetBorder()));
+                    "5、微信点单成本:支付方式是“微信支付”的订单,其各个菜品成本价乘以份数的相加的总额(不包含退款订单);", ExcelDownloadSrvOld.getCellFormat4StatRemarkWithNoSetBorder()));
             customExcelItemList.add(new CustomExcelItem(startColumn + 1, startRows + 6,
-                    "   金币点单成本:支付方式是“微信+金币”的订单,其各个菜品成本价乘以份数的相加的总额(不包含退款订单);", ExcelDownloadSrv.getCellFormat4StatRemarkWithNoSetBorder()));
+                    "   金币点单成本:支付方式是“微信+金币”的订单,其各个菜品成本价乘以份数的相加的总额(不包含退款订单);", ExcelDownloadSrvOld.getCellFormat4StatRemarkWithNoSetBorder()));
             customExcelItemList.add(new CustomExcelItem(startColumn + 1, startRows + 7,
-                    "   现场点单成本:支付方式是“现场支付”的订单,其各个菜品成本价乘以份数的相加的总额(不包含退款订单);", ExcelDownloadSrv.getCellFormat4StatRemarkWithNoSetBorder()));
+                    "   现场点单成本:支付方式是“现场支付”的订单,其各个菜品成本价乘以份数的相加的总额(不包含退款订单);", ExcelDownloadSrvOld.getCellFormat4StatRemarkWithNoSetBorder()));
             customExcelItemList.add(new CustomExcelItem(startColumn + 1, startRows + 8,
-                    "6、2元洗碗费总额:支付方式是“微信+金币”的订单,其微信支付部分的总额(不包含退款订单)。", ExcelDownloadSrv.getCellFormat4StatRemarkWithNoSetBorder()));
+                    "6、2元洗碗费总额:支付方式是“微信+金币”的订单,其微信支付部分的总额(不包含退款订单)。", ExcelDownloadSrvOld.getCellFormat4StatRemarkWithNoSetBorder()));
         }
         return customExcelItemList;
     }

+ 164 - 284
src/main/java/com/ywt/mg/web/common/ExcelDownloadSrv.java

@@ -20,11 +20,10 @@ import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 
 import javax.servlet.http.HttpServletResponse;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
+import java.io.*;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Set;
 
 /**
  * @author daiyihua
@@ -85,24 +84,13 @@ public class ExcelDownloadSrv {
         if (data == null || data.isEmpty()) {
             throw new AppMessageException("数据为空");
         }
-        try (OutputStream out = ExcelDownloadSrv.setHttpServletResponse(httpServletResponse, fileName + ".xls").getOutputStream()) {
+        try (OutputStream out = ExcelDownloadSrvOld.setHttpServletResponse(httpServletResponse, fileName + ".xls").getOutputStream()) {
             // 创建写工作簿对象
             WritableWorkbook workbook = Workbook.createWorkbook(out);
             // 工作表
             WritableSheet sheet = workbook.createSheet(fileName, 0);
-            //表头格式
-            WritableCellFormat cellFormat = ExcelDownloadSrv.getWritableCellFormat();
-            //数据行格式
-            // 设置背景、字体颜色、对齐方式等等;
-            WritableFont font2 = new WritableFont(WritableFont.ARIAL, 14, WritableFont.NO_BOLD, false, UnderlineStyle.NO_UNDERLINE, Colour.BLACK);
-            WritableCellFormat cellFormat2 = new WritableCellFormat(font2);
-            //设置文字居中对齐方式;
-            cellFormat2.setAlignment(Alignment.CENTRE);
-            //设置垂直居中;
-            cellFormat2.setVerticalAlignment(VerticalAlignment.CENTRE);
-            cellFormat2.setBackground(Colour.WHITE);
-            cellFormat2.setBorder(Border.ALL, BorderLineStyle.THIN);
-            cellFormat2.setWrap(true);
+            // 获取带样式的cell
+            WritableCellFormat cellFormat = getWritableCellFormat();
             //给sheet电子版中所有的列设置默认的列的宽度;
             sheet.getSettings().setDefaultColumnWidth(20);
             sheet.getSettings().setDefaultRowHeight(30 * 20);
@@ -130,7 +118,7 @@ public class ExcelDownloadSrv {
                 sheet.addCell(label);
                 List<String> colData = data.get(key);
                 for (int i = 0; i < colData.size(); i++) {
-                    Label lb = new Label(headerColumn, i + 1, Checker.getStringValue(colData.get(i)), cellFormat2);
+                    Label lb = new Label(headerColumn, i + 1, Checker.getStringValue(colData.get(i)), cellFormat);
                     sheet.addCell(lb);
                 }
                 headerColumn++;
@@ -159,7 +147,7 @@ public class ExcelDownloadSrv {
         if (data == null || data.isEmpty()) {
             throw new AppMessageException("数据为空");
         }
-        try (OutputStream out = ExcelDownloadSrv.setHttpServletResponse(httpServletResponse, fileName + ".xls").getOutputStream()) {
+        try (OutputStream out = ExcelDownloadSrvOld.setHttpServletResponse(httpServletResponse, fileName + ".xls").getOutputStream()) {
             // 创建写工作簿对象
             WritableWorkbook workbook = Workbook.createWorkbook(out);
             // 工作表
@@ -217,7 +205,7 @@ public class ExcelDownloadSrv {
         if (data == null || data.isEmpty()) {
             throw new AppMessageException("数据为空");
         }
-        try (OutputStream out = ExcelDownloadSrv.setHttpServletResponse(httpServletResponse, fileName + ".xls").getOutputStream()) {
+        try (OutputStream out = ExcelDownloadSrvOld.setHttpServletResponse(httpServletResponse, fileName + ".xls").getOutputStream()) {
             // 创建写工作簿对象
             WritableWorkbook workbook = Workbook.createWorkbook(out);
             // 工作表
@@ -278,13 +266,13 @@ public class ExcelDownloadSrv {
     /**
      * 通用的生成 Excel 文件(包含汇总)并以流返回(一点样式也没有)
      *
-     * @param fileName            excel 文件名
-     * @param data                需要填充的数据,key 是列名,value 是每一列的数据组成的 list, 类型必须是 {@link String}
+     * @param fileName excel 文件名
+     * @param data     需要填充的数据,key 是列名,value 是每一列的数据组成的 list, 类型必须是 {@link String}
      * @throws AppMessageException 业务层异常抛出,如传入数据为空
      * @author Walker, added on 06/27/2019.
      */
-    public OutputStream  generateAndReturnExcelFileWithNoStyleAndCollectLocal(String fileName, String path, ExcelDataMap data, ExcelStyleMap excelStyleMap,
-                                                                       List<ExcelCollectPojo> collectList, int size) throws AppMessageException {
+    public OutputStream generateAndReturnExcelByteArrayOutputStreamWithStyleAndCollect(String fileName, String path, ExcelDataMap data, ExcelStyleMap excelStyleMap,
+                                                                                       List<ExcelCollectPojo> collectList, int size) throws AppMessageException {
 
         OutputStream ba = null;
         ba = new ByteArrayOutputStream();
@@ -293,191 +281,87 @@ public class ExcelDownloadSrv {
             throw new AppMessageException("数据为空");
         }
         try {
-//            File file = new File(path);
-            // 创建写工作簿对象
-//            WritableWorkbook workbook = Workbook.createWorkbook(file);
+            // 创建工作表格
             workbook = Workbook.createWorkbook(ba);
+            int listSize = 0;
+            if (data.size() > 0) {
+                Set<String> s1 = data.keySet();
+                //开始根据键找值
+                for (String key : s1) {
+                    List<String> value = data.get(key);
+                    if (!Checker.isNone(value)) {
+                        int dataItemSize = value.size();
+                        if (listSize < dataItemSize) {
+                            listSize = dataItemSize;
+                        }
+                    }
+                }
+            }
 
-            int list = size;
-            int a = 0;
-            if(list < 60000){
-                a = 1;
+            // 单元数
+            int sheetAmount = 0;
+            // 每个单元表格存放最大的行数,当list总数超过每个sheet所设置的最大值时,要注意分成多个sheet来存储
+            int sheetMaxSize = 1;
+            if (listSize < sheetMaxSize) {
+                sheetAmount = 1;
             } else {
-                if (list % 60000 == 0) {
-                    a = list / 60000;
+                if (listSize % sheetMaxSize == 0) {
+                    sheetAmount = listSize / sheetMaxSize;
                 } else {
-                    a = list / 60000 + 1;
+                    sheetAmount = listSize / sheetMaxSize + 1;
                 }
             }
-
             // 工作表
-            for (int i = 0; i < a; i++) {
-                int page = i + 1;
-                WritableSheet sheet = workbook.createSheet(fileName + page, 0);
-                WritableCellFormat cellFormat = ExcelDownloadSrv.getWritableCellFormat();
-                //数据行格式
-                // 设置背景、字体颜色、对齐方式等等;
-                WritableFont font2 = new WritableFont(WritableFont.ARIAL, 14, WritableFont.NO_BOLD, false, UnderlineStyle.NO_UNDERLINE, Colour.BLACK);
-                WritableCellFormat cellFormat2 = new WritableCellFormat(font2);
-                //设置文字居中对齐方式;
-                cellFormat2.setAlignment(Alignment.CENTRE);
-                //设置垂直居中;
-                cellFormat2.setVerticalAlignment(VerticalAlignment.CENTRE);
-                cellFormat2.setBackground(Colour.WHITE);
-                cellFormat2.setBorder(Border.ALL, BorderLineStyle.THIN);
-                cellFormat2.setWrap(true);
+            for (int i = 0; i < sheetAmount; i++) {
+                // 当前页数(从0开始)
+                int currentSheetIndex = i;
+                // 当前页数(从1开始)
+                int sheetIndex = currentSheetIndex + 1;
+                WritableSheet sheet = workbook.createSheet(fileName + sheetIndex, currentSheetIndex);
+                // 获取带样式的cell
+                WritableCellFormat cellFormat = getWritableCellFormat();
                 //给sheet电子版中所有的列设置默认的列的宽度;
                 sheet.getSettings().setDefaultColumnWidth(20);
                 sheet.getSettings().setDefaultRowHeight(30 * 20);
+
                 int firstRow = 0;
                 //填充表头
                 int headerColumn = 0;
-//                int headerColumn2 = 0;
-//                int headerColumn3 = 0;
                 for (String key : data.keySet()) {
                     Label label = new Label(headerColumn, firstRow, key, cellFormat);
                     sheet.addCell(label);
-//                    Label label2 = new Label(headerColumn2, firstRow, key, cellFormat);
-//                sheet2.addCell(label2);
-//                Label label3 = new Label(headerColumn3, firstRow, key, cellFormat);
-//                sheet3.addCell(label3);
                     List<String> colData = data.get(key);
-                    int b = 0;
-                    int c = i+1;
-                    if(size < 60000* c){
-                        b = size - 60000*i;
-                    } else{
-                        b = 60000;
+                    // 当前页数所对应的行数
+                    int currentSheetRowAmount = 0;
+                    if (listSize < sheetMaxSize * sheetIndex) {
+                        currentSheetRowAmount = listSize - sheetMaxSize * currentSheetIndex;
+                    } else {
+                        currentSheetRowAmount = sheetMaxSize;
                     }
-                    for (int q = 0; q < b; q++) {
-                        int e = 60000 * i;
+                    for (int q = 0; q < currentSheetRowAmount; q++) {
+                        int e = sheetMaxSize * currentSheetIndex;
                         Label lb = new Label(headerColumn, q + 1, Checker.getStringValue(colData.get(e + q)), cellFormat);
                         sheet.addCell(lb);
-//                    sheet2.addCell(lb);
                     }
-//                for (int q = 0; q < 2; q++) {
-//                    Label lb = new Label(headerColumn2, q + 1, Checker.getStringValue(colData.get(2 + q)), cellFormat);
-//                    sheet2.addCell(lb);
-//                }
-//                for (int q = 0; q < 2; q++) {
-//                    Label lb = new Label(headerColumn3, q + 1, Checker.getStringValue(colData.get(4 + q)), cellFormat);
-//                    sheet3.addCell(lb);
-//                }
                     headerColumn++;
-//                headerColumn2++;
-//                headerColumn3++;
                 }
-                if (i == a - 1) {
+                // 最后一页,添加汇总,同时关闭流
+                if (currentSheetIndex == sheetAmount - 1) {
                     if (!Checker.isNone(collectList)) {
                         for (ExcelCollectPojo pojo : collectList) {
                             String[] dataArr = pojo.getDataArr();
                             for (int r = 0, j = dataArr.length; r < j; r++) {
-//                        Label lb = new Label(pojo.getCol() + i, pojo.getRow(), dataArr[i], cellFormat);
-//                        sheet.addCell(lb);
                                 Label lb2 = new Label(pojo.getCol() + r, pojo.getRow(), dataArr[r], cellFormat);
                                 sheet.addCell(lb2);
                             }
                         }
                     }
-                }
-
-
-//            WritableSheet sheet = workbook.createSheet(fileName, 0);
-//            WritableSheet sheet2 = workbook.createSheet(fileName + "2", 1);
-//            WritableSheet sheet3 = workbook.createSheet(fileName + "3", 2);
-//
-//            //表头格式
-//            WritableCellFormat cellFormat = ExcelDownloadSrv.getWritableCellFormat();
-//            //数据行格式
-//            // 设置背景、字体颜色、对齐方式等等;
-//            WritableFont font2 = new WritableFont(WritableFont.ARIAL, 14, WritableFont.NO_BOLD, false, UnderlineStyle.NO_UNDERLINE, Colour.BLACK);
-//            WritableCellFormat cellFormat2 = new WritableCellFormat(font2);
-//            //设置文字居中对齐方式;
-//            cellFormat2.setAlignment(Alignment.CENTRE);
-//            //设置垂直居中;
-//            cellFormat2.setVerticalAlignment(VerticalAlignment.CENTRE);
-//            cellFormat2.setBackground(Colour.WHITE);
-//            cellFormat2.setBorder(Border.ALL, BorderLineStyle.THIN);
-//            cellFormat2.setWrap(true);
-//            //给sheet电子版中所有的列设置默认的列的宽度;
-//            sheet.getSettings().setDefaultColumnWidth(20);
-//            sheet.getSettings().setDefaultRowHeight(30 * 20);
-//            sheet2.getSettings().setDefaultColumnWidth(20);
-//            sheet2.getSettings().setDefaultRowHeight(30 * 20);
-//            sheet3.getSettings().setDefaultColumnWidth(20);
-//            sheet3.getSettings().setDefaultRowHeight(30 * 20);
-
-//            //单独应用样式
-//            if (excelStyleMap != null) {
-//                for (String column : excelStyleMap.keySet()) {
-//                    // 指定列宽
-//                    int styleColumnWidth = excelStyleMap.getIntValueSafely(column, ExcelStyleMap.STYLE_COLUMN_WIDTH, 0);
-//                    List<String> columns = new ArrayList<>(data.keySet());
-//                    for (int i = 0; i <1; i++) {
-//                        if (columns.get(i).equals(column)) {
-//                            sheet.setColumnView(i, styleColumnWidth);
-//                        }
-//                    }
-//
-//                }
-//            }
-//            // 设置格式(实线)
-//            WritableCellFormat cellFormat = new WritableCellFormat();
-//            //给sheet电子版中所有的列设置默认的列的宽度;
-//            sheet.getSettings().setDefaultColumnWidth(20);
-//            sheet.getSettings().setDefaultRowHeight(35 * 20);
-                //行号
-//            int firstRow = 0;
-//            //填充表头
-//            int headerColumn = 0;
-//            int headerColumn2 = 0;
-//            int headerColumn3 = 0;
-//            for (String key : data.keySet()) {
-//                Label label = new Label(headerColumn, firstRow, key, cellFormat);
-//                sheet.addCell(label);
-//                Label label2 = new Label(headerColumn2, firstRow, key, cellFormat);
-//                sheet2.addCell(label2);
-//                Label label3 = new Label(headerColumn3, firstRow, key, cellFormat);
-//                sheet2.addCell(label3);
-//                List<String> colData = data.get(key);
-//                for (int i = 0; i < 2; i++) {
-//                    Label lb = new Label(headerColumn, i + 1, Checker.getStringValue(colData.get(i)), cellFormat);
-//                    sheet.addCell(lb);
-////                    sheet2.addCell(lb);
-//                }
-//                for (int q = 0; q < 2; q++) {
-//                    Label lb = new Label(headerColumn2, q + 1, Checker.getStringValue(colData.get(2 + q)), cellFormat);
-//                    sheet2.addCell(lb);
-//                }
-//                for (int q = 0; q < 2; q++) {
-//                    Label lb = new Label(headerColumn3, q + 1, Checker.getStringValue(colData.get(4 + q)), cellFormat);
-//                    sheet3.addCell(lb);
-//                }
-//                headerColumn++;
-//                headerColumn2++;
-//                headerColumn3++;
-//            }
-                // 添加汇总
-//            if (!Checker.isNone(collectList)) {
-//                for (ExcelCollectPojo pojo : collectList) {
-//                    String[] dataArr = pojo.getDataArr();
-//                    for (int i = 0, j = dataArr.length; i < j; i++) {
-////                        Label lb = new Label(pojo.getCol() + i, pojo.getRow(), dataArr[i], cellFormat);
-////                        sheet.addCell(lb);
-//                        Label lb2 = new Label(pojo.getCol() + i, pojo.getRow(), dataArr[i], cellFormat);
-//                        sheet2.addCell(lb2);
-//                    }
-//                }
-//            }
-                //开始执行写入操作
-                if (i == a - 1) {
+                    // 写入流
                     workbook.write();
                     //关闭流
                     workbook.close();
                 }
-
             }
-
             if (ba != null) {
                 try {
                     ba.close();
@@ -486,7 +370,7 @@ public class ExcelDownloadSrv {
                 }
             }
         } catch (Exception e) {
-            logger.error("ExcelDownloadSrv#generateAndReturnExcelFileWithNoStyleAndCollectLocal(fileName={}, path={} ):\n {}",
+            logger.error("ExcelDownloadSrv#generateAndReturnExcelByteArrayOutputStreamWithStyleAndCollect(fileName={}, path={} ):\n {}",
                     fileName, path, e.getMessage(), e);
         }
         return ba;
@@ -520,15 +404,15 @@ public class ExcelDownloadSrv {
 
 
     /**
-     * 通用的生成 Excel 文件(包含汇总)并以流返回(一点样式也没有)
+     * 通用的生成 Excel 字节流(包含汇总)并以流返回(一点样式也没有)
      *
-     * @param fileName            excel 文件名
-     * @param data                需要填充的数据,key 是列名,value 是每一列的数据组成的 list, 类型必须是 {@link String}
+     * @param fileName excel 文件名
+     * @param data     需要填充的数据,key 是列名,value 是每一列的数据组成的 list, 类型必须是 {@link String}
      * @throws AppMessageException 业务层异常抛出,如传入数据为空
      * @author Walker, added on 06/27/2019.
      */
-    public OutputStream generateAndReturnMealExcelFileWithNoStyleAndCollectLocal(String fileName, String path, ExcelDataMap data, ExcelStyleMap excelStyleMap,
-                                                                     List<CustomExcelItem> collectList, int size) throws AppMessageException {
+    public OutputStream generateAndReturnExcelByteArrayOutputStreamWithStyle(String fileName, String path, ExcelDataMap data, ExcelStyleMap excelStyleMap,
+                                                                             List<CustomExcelItem> collectList) throws AppMessageException {
         if (data == null || data.isEmpty()) {
             throw new AppMessageException("数据为空");
         }
@@ -536,138 +420,99 @@ public class ExcelDownloadSrv {
         ba = new ByteArrayOutputStream();
         WritableWorkbook workbook = null;
         try {
-//            File file = new File(path);
+            // 创建工作表格
             workbook = Workbook.createWorkbook(ba);
 
-            int list = size;
-            int a = 0;
-            if(list < 60000){
-                a = 1;
+            int listSize = 0;
+            if (data.size() > 0) {
+                Set<String> s1 = data.keySet();
+                //开始根据键找值
+                for (String key : s1) {
+                    List<String> value = data.get(key);
+                    if (!Checker.isNone(value)) {
+                        int dataItemSize = value.size();
+                        if (listSize < dataItemSize) {
+                            listSize = dataItemSize;
+                        }
+                    }
+                }
+            }
+            // 单元数
+            int sheetAmount = 0;
+            // 每个单元表格存放最大的行数,当list总数超过每个sheet所设置的最大值时,要注意分成多个sheet来存储
+            int sheetMaxSize = 0;
+            if (listSize < sheetMaxSize) {
+                sheetAmount = 1;
             } else {
-                if (list % 60000 == 0) {
-                    a = list / 60000;
+                if (listSize % sheetMaxSize == 0) {
+                    sheetAmount = listSize / sheetMaxSize;
                 } else {
-                    a = list / 60000 + 1;
+                    sheetAmount = listSize / sheetMaxSize + 1;
                 }
             }
-
-            for (int i = 0; i < a; i++) {
-                int page = i + 1;
-
-                WritableSheet sheet = workbook.createSheet(fileName + page, 0);
-                WritableCellFormat cellFormat = ExcelDownloadSrv.getWritableCellFormat();
-                //数据行格式
-                // 设置背景、字体颜色、对齐方式等等;
-                WritableFont font2 = new WritableFont(WritableFont.ARIAL, 14, WritableFont.NO_BOLD, false, UnderlineStyle.NO_UNDERLINE, Colour.BLACK);
-                WritableCellFormat cellFormat2 = new WritableCellFormat(font2);
-                //设置文字居中对齐方式;
-                cellFormat2.setAlignment(Alignment.CENTRE);
-                //设置垂直居中;
-                cellFormat2.setVerticalAlignment(VerticalAlignment.CENTRE);
-                cellFormat2.setBackground(Colour.WHITE);
-                cellFormat2.setBorder(Border.ALL, BorderLineStyle.THIN);
-                cellFormat2.setWrap(true);
+            // 工作表
+            for (int i = 0; i < sheetAmount; i++) {
+                // 当前页数(从0开始)
+                int currentSheetIndex = i;
+                // 当前页数(从1开始)
+                int sheetIndex = currentSheetIndex + 1;
+                WritableSheet sheet = workbook.createSheet(fileName + sheetIndex, 0);
+                // 获取带样式的cell
+                WritableCellFormat cellFormat = getWritableCellFormat();
                 //给sheet电子版中所有的列设置默认的列的宽度;
                 sheet.getSettings().setDefaultColumnWidth(20);
                 sheet.getSettings().setDefaultRowHeight(30 * 20);
-                int firstRow = 0;
-                //填充表头
-                int headerColumn = 0;
 
-                int b = 0;
-                int c = i+1;
-                if(size < 60000* c){
-                    b = size - 60000*i;
-                } else{
-                    b = 60000;
+                // 单独应用样式
+                if (excelStyleMap != null) {
+                    for (String column : excelStyleMap.keySet()) {
+                        // 指定列宽
+                        int styleColumnWidth = excelStyleMap.getIntValueSafely(column, ExcelStyleMap.STYLE_COLUMN_WIDTH, 0);
+                        List<String> columns = new ArrayList<>(data.keySet());
+                        for (int j = 0, columnsSize = columns.size(); j < columnsSize; j++) {
+                            if (columns.get(j).equals(column)) {
+                                sheet.setColumnView(j, styleColumnWidth);
+                            }
+                        }
+                    }
                 }
-
+                // 第一行
+                int firstRow = 0;
+                // 填充表头
+                int headerColumn = 0;
+                // 遍历设置数据
                 for (String key : data.keySet()) {
                     Label label = new Label(headerColumn, firstRow, key, cellFormat);
                     sheet.addCell(label);
                     List<String> colData = data.get(key);
-                    for (int q = 0; q < b; q++) {
-                        int e = 60000 * i;
-                        Label lb = new Label(headerColumn, q + 1, Checker.getStringValue(colData.get(e + q)), cellFormat);
+                    // 当前页数所对应的行数
+                    int currentSheetRowAmount = 0;
+                    if (listSize < sheetMaxSize * sheetIndex) {
+                        currentSheetRowAmount = listSize - sheetMaxSize * currentSheetIndex;
+                    } else {
+                        currentSheetRowAmount = sheetMaxSize;
+                    }
+                    for (int q = 0; q < currentSheetRowAmount; q++) {
+                        // 之前所有页的数据汇总数量
+                        int beforePageAllAmount = sheetMaxSize * currentSheetIndex;
+                        Label lb = new Label(headerColumn, q + 1, Checker.getStringValue(colData.get(beforePageAllAmount + q)), cellFormat);
                         sheet.addCell(lb);
                     }
                     headerColumn++;
                 }
-                // 添加汇总
-                if (i == a - 1) {
+                // 最后一页,添加汇总,同时关闭流
+                if (currentSheetIndex == sheetAmount - 1) {
                     if (!Checker.isNone(collectList)) {
                         for (CustomExcelItem item : collectList) {
-                            sheet.addCell(new Label(item.getColumn(), item.getRow(), item.getContent(),
-                                    item.getCellFormat() == null ? cellFormat2 : item.getCellFormat()));
-
-
+                            sheet.addCell(new Label(item.getColumn(), item.getRow(), item.getContent(), item.getCellFormat() == null ? cellFormat : item.getCellFormat()));
                         }
                     }
-                }
-
-                if (i == a - 1){
+                    // 写入流
                     workbook.write();
-                    //关闭流
+                    // 关闭流
                     workbook.close();
                 }
             }
-//            // 工作表
-//            WritableSheet sheet = workbook.createSheet(fileName, 0);
-//            //表头格式
-//            WritableCellFormat cellFormat = ExcelDownloadSrv.getWritableCellFormat();
-//            //数据行格式
-//            // 设置背景、字体颜色、对齐方式等等;
-//            WritableFont font2 = new WritableFont(WritableFont.ARIAL, 14, WritableFont.NO_BOLD, false, UnderlineStyle.NO_UNDERLINE, Colour.BLACK);
-//            WritableCellFormat cellFormat2 = new WritableCellFormat(font2);
-//            //设置文字居中对齐方式;
-//            cellFormat2.setAlignment(Alignment.CENTRE);
-//            //设置垂直居中;
-//            cellFormat2.setVerticalAlignment(VerticalAlignment.CENTRE);
-//            cellFormat2.setBackground(Colour.WHITE);
-//            cellFormat2.setBorder(Border.ALL, BorderLineStyle.THIN);
-//            cellFormat2.setWrap(true);
-//            //给sheet电子版中所有的列设置默认的列的宽度;
-//            sheet.getSettings().setDefaultColumnWidth(20);
-//            sheet.getSettings().setDefaultRowHeight(30 * 20);
-            //单独应用样式
-//            if (excelStyleMap != null) {
-//                for (String column : excelStyleMap.keySet()) {
-//                    // 指定列宽
-//                    int styleColumnWidth = excelStyleMap.getIntValueSafely(column, ExcelStyleMap.STYLE_COLUMN_WIDTH, 0);
-//                    List<String> columns = new ArrayList<>(data.keySet());
-//                    for (int i = 0; i < columns.size(); i++) {
-//                        if (columns.get(i).equals(column)) {
-//                            sheet.setColumnView(i, styleColumnWidth);
-//                        }
-//                    }
-//                }
-//            }
-
-            //行号
-//            int firstRow = 0;
-//            //填充表头
-//            int headerColumn = 0;
-//            for (String key : data.keySet()) {
-//                Label label = new Label(headerColumn, firstRow, key, cellFormat);
-//                sheet.addCell(label);
-//                List<String> colData = data.get(key);
-//                for (int i = 0; i < colData.size(); i++) {
-//                    Label lb = new Label(headerColumn, i + 1, Checker.getStringValue(colData.get(i)), cellFormat2);
-//                    sheet.addCell(lb);
-//                }
-//                headerColumn++;
-//            }
-//            // 添加汇总
-//            if (!Checker.isNone(collectList)) {
-//                for (CustomExcelItem item : collectList) {
-//                        sheet.addCell(new Label(item.getColumn(), item.getRow(), item.getContent(),
-//                                item.getCellFormat() == null ? cellFormat2 : item.getCellFormat()));
-//
-//                }
-//            }
-            //开始执行写入操作
-
-
             if (ba != null) {
                 try {
                     ba.close();
@@ -676,9 +521,44 @@ public class ExcelDownloadSrv {
                 }
             }
         } catch (Exception e) {
-            logger.error("ExcelDownloadSrv#generateAndReturnExcelFileWithNoStyleAndCollectLocal(fileName={}, path={} ):\n {}",
+            logger.error("ExcelDownloadSrv#generateAndReturnExcelByteArrayOutputStreamWithStyleAndCollect(fileName={}, path={} ):\n {}",
                     fileName, path, e.getMessage(), e);
         }
         return ba;
     }
+
+    /**
+     * OutputStream 转化成 File
+     * @param localPath 对应本地文件路径
+     * @param ba 文件流 {@link OutputStream}
+     */
+    public void outputStreamToFile(String localPath, OutputStream ba) {
+
+        File file = new File(localPath);
+        //选择流
+        FileOutputStream fos = null;
+        ByteArrayInputStream bais = null;
+        try {
+            bais = new ByteArrayInputStream(((ByteArrayOutputStream) ba).toByteArray());
+            fos = new FileOutputStream(file);
+            int temp;
+            byte[] bt = new byte[1024 * 10];
+            while ((temp = bais.read(bt)) != -1) {
+                fos.write(bt, 0, temp);
+            }
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            //关流
+            try {
+                if (null != fos) {
+                    fos.close();
+                }
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
 }

+ 229 - 160
src/main/java/com/ywt/mg/web/common/ExcelDownloadSrvNew.java → src/main/java/com/ywt/mg/web/common/ExcelDownloadSrvOld.java

@@ -20,10 +20,11 @@ import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 
 import javax.servlet.http.HttpServletResponse;
-import java.io.*;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Set;
 
 /**
  * @author daiyihua
@@ -32,7 +33,7 @@ import java.util.Set;
  **/
 
 @Service
-public class ExcelDownloadSrvNew {
+public class ExcelDownloadSrvOld {
     private final Logger logger = LoggerFactory.getLogger(getClass().getName());
 
     /**
@@ -84,13 +85,24 @@ public class ExcelDownloadSrvNew {
         if (data == null || data.isEmpty()) {
             throw new AppMessageException("数据为空");
         }
-        try (OutputStream out = ExcelDownloadSrv.setHttpServletResponse(httpServletResponse, fileName + ".xls").getOutputStream()) {
+        try (OutputStream out = ExcelDownloadSrvOld.setHttpServletResponse(httpServletResponse, fileName + ".xls").getOutputStream()) {
             // 创建写工作簿对象
             WritableWorkbook workbook = Workbook.createWorkbook(out);
             // 工作表
             WritableSheet sheet = workbook.createSheet(fileName, 0);
-            // 获取带样式的cell
-            WritableCellFormat cellFormat = getWritableCellFormat();
+            //表头格式
+            WritableCellFormat cellFormat = ExcelDownloadSrvOld.getWritableCellFormat();
+            //数据行格式
+            // 设置背景、字体颜色、对齐方式等等;
+            WritableFont font2 = new WritableFont(WritableFont.ARIAL, 14, WritableFont.NO_BOLD, false, UnderlineStyle.NO_UNDERLINE, Colour.BLACK);
+            WritableCellFormat cellFormat2 = new WritableCellFormat(font2);
+            //设置文字居中对齐方式;
+            cellFormat2.setAlignment(Alignment.CENTRE);
+            //设置垂直居中;
+            cellFormat2.setVerticalAlignment(VerticalAlignment.CENTRE);
+            cellFormat2.setBackground(Colour.WHITE);
+            cellFormat2.setBorder(Border.ALL, BorderLineStyle.THIN);
+            cellFormat2.setWrap(true);
             //给sheet电子版中所有的列设置默认的列的宽度;
             sheet.getSettings().setDefaultColumnWidth(20);
             sheet.getSettings().setDefaultRowHeight(30 * 20);
@@ -118,7 +130,7 @@ public class ExcelDownloadSrvNew {
                 sheet.addCell(label);
                 List<String> colData = data.get(key);
                 for (int i = 0; i < colData.size(); i++) {
-                    Label lb = new Label(headerColumn, i + 1, Checker.getStringValue(colData.get(i)), cellFormat);
+                    Label lb = new Label(headerColumn, i + 1, Checker.getStringValue(colData.get(i)), cellFormat2);
                     sheet.addCell(lb);
                 }
                 headerColumn++;
@@ -147,7 +159,7 @@ public class ExcelDownloadSrvNew {
         if (data == null || data.isEmpty()) {
             throw new AppMessageException("数据为空");
         }
-        try (OutputStream out = ExcelDownloadSrv.setHttpServletResponse(httpServletResponse, fileName + ".xls").getOutputStream()) {
+        try (OutputStream out = ExcelDownloadSrvOld.setHttpServletResponse(httpServletResponse, fileName + ".xls").getOutputStream()) {
             // 创建写工作簿对象
             WritableWorkbook workbook = Workbook.createWorkbook(out);
             // 工作表
@@ -205,7 +217,7 @@ public class ExcelDownloadSrvNew {
         if (data == null || data.isEmpty()) {
             throw new AppMessageException("数据为空");
         }
-        try (OutputStream out = ExcelDownloadSrv.setHttpServletResponse(httpServletResponse, fileName + ".xls").getOutputStream()) {
+        try (OutputStream out = ExcelDownloadSrvOld.setHttpServletResponse(httpServletResponse, fileName + ".xls").getOutputStream()) {
             // 创建写工作簿对象
             WritableWorkbook workbook = Workbook.createWorkbook(out);
             // 工作表
@@ -266,13 +278,14 @@ public class ExcelDownloadSrvNew {
     /**
      * 通用的生成 Excel 文件(包含汇总)并以流返回(一点样式也没有)
      *
-     * @param fileName excel 文件名
-     * @param data     需要填充的数据,key 是列名,value 是每一列的数据组成的 list, 类型必须是 {@link String}
+     * @param fileName            excel 文件名
+     * @param data                需要填充的数据,key 是列名,value 是每一列的数据组成的 list, 类型必须是 {@link String}
      * @throws AppMessageException 业务层异常抛出,如传入数据为空
      * @author Walker, added on 06/27/2019.
+     * 参考{@link ExcelDownloadSrv#generateAndReturnExcelByteArrayOutputStreamWithStyleAndCollect(String, String, ExcelDataMap, ExcelStyleMap, List, int)}
      */
-    public OutputStream generateAndReturnExcelByteArrayOutputStreamWithStyleAndCollect(String fileName, String path, ExcelDataMap data, ExcelStyleMap excelStyleMap,
-                                                                                       List<ExcelCollectPojo> collectList, int size) throws AppMessageException {
+    public OutputStream  generateAndReturnExcelByteArrayOutputStreamWithStyleAndCollect(String fileName, String path, ExcelDataMap data, ExcelStyleMap excelStyleMap,
+                                                                       List<ExcelCollectPojo> collectList, int size) throws AppMessageException {
 
         OutputStream ba = null;
         ba = new ByteArrayOutputStream();
@@ -281,87 +294,191 @@ public class ExcelDownloadSrvNew {
             throw new AppMessageException("数据为空");
         }
         try {
-            // 创建工作表格
+//            File file = new File(path);
+            // 创建写工作簿对象
+//            WritableWorkbook workbook = Workbook.createWorkbook(file);
             workbook = Workbook.createWorkbook(ba);
-            int listSize = 0;
-            if (data.size() > 0) {
-                Set<String> s1 = data.keySet();
-                //开始根据键找值
-                for (String key : s1) {
-                    List<String> value = data.get(key);
-                    if (!Checker.isNone(value)) {
-                        int dataItemSize = value.size();
-                        if (listSize < dataItemSize) {
-                            listSize = dataItemSize;
-                        }
-                    }
-                }
-            }
 
-            // 单元数
-            int sheetAmount = 0;
-            // 每个单元表格存放最大的行数,当list总数超过每个sheet所设置的最大值时,要注意分成多个sheet来存储
-            int sheetMaxSize = 1;
-            if (listSize < sheetMaxSize) {
-                sheetAmount = 1;
+            int list = size;
+            int a = 0;
+            if(list < 60000){
+                a = 1;
             } else {
-                if (listSize % sheetMaxSize == 0) {
-                    sheetAmount = listSize / sheetMaxSize;
+                if (list % 60000 == 0) {
+                    a = list / 60000;
                 } else {
-                    sheetAmount = listSize / sheetMaxSize + 1;
+                    a = list / 60000 + 1;
                 }
             }
+
             // 工作表
-            for (int i = 0; i < sheetAmount; i++) {
-                // 当前页数(从0开始)
-                int currentSheetIndex = i;
-                // 当前页数(从1开始)
-                int sheetIndex = currentSheetIndex + 1;
-                WritableSheet sheet = workbook.createSheet(fileName + sheetIndex, currentSheetIndex);
-                // 获取带样式的cell
-                WritableCellFormat cellFormat = getWritableCellFormat();
+            for (int i = 0; i < a; i++) {
+                int page = i + 1;
+                WritableSheet sheet = workbook.createSheet(fileName + page, 0);
+                WritableCellFormat cellFormat = ExcelDownloadSrvOld.getWritableCellFormat();
+                //数据行格式
+                // 设置背景、字体颜色、对齐方式等等;
+                WritableFont font2 = new WritableFont(WritableFont.ARIAL, 14, WritableFont.NO_BOLD, false, UnderlineStyle.NO_UNDERLINE, Colour.BLACK);
+                WritableCellFormat cellFormat2 = new WritableCellFormat(font2);
+                //设置文字居中对齐方式;
+                cellFormat2.setAlignment(Alignment.CENTRE);
+                //设置垂直居中;
+                cellFormat2.setVerticalAlignment(VerticalAlignment.CENTRE);
+                cellFormat2.setBackground(Colour.WHITE);
+                cellFormat2.setBorder(Border.ALL, BorderLineStyle.THIN);
+                cellFormat2.setWrap(true);
                 //给sheet电子版中所有的列设置默认的列的宽度;
                 sheet.getSettings().setDefaultColumnWidth(20);
                 sheet.getSettings().setDefaultRowHeight(30 * 20);
-
                 int firstRow = 0;
                 //填充表头
                 int headerColumn = 0;
+//                int headerColumn2 = 0;
+//                int headerColumn3 = 0;
                 for (String key : data.keySet()) {
                     Label label = new Label(headerColumn, firstRow, key, cellFormat);
                     sheet.addCell(label);
+//                    Label label2 = new Label(headerColumn2, firstRow, key, cellFormat);
+//                sheet2.addCell(label2);
+//                Label label3 = new Label(headerColumn3, firstRow, key, cellFormat);
+//                sheet3.addCell(label3);
                     List<String> colData = data.get(key);
-                    // 当前页数所对应的行数
-                    int currentSheetRowAmount = 0;
-                    if (listSize < sheetMaxSize * sheetIndex) {
-                        currentSheetRowAmount = listSize - sheetMaxSize * currentSheetIndex;
-                    } else {
-                        currentSheetRowAmount = sheetMaxSize;
+                    int b = 0;
+                    int c = i+1;
+                    if(size < 60000* c){
+                        b = size - 60000*i;
+                    } else{
+                        b = 60000;
                     }
-                    for (int q = 0; q < currentSheetRowAmount; q++) {
-                        int e = sheetMaxSize * currentSheetIndex;
+                    for (int q = 0; q < b; q++) {
+                        int e = 60000 * i;
                         Label lb = new Label(headerColumn, q + 1, Checker.getStringValue(colData.get(e + q)), cellFormat);
                         sheet.addCell(lb);
+//                    sheet2.addCell(lb);
                     }
+//                for (int q = 0; q < 2; q++) {
+//                    Label lb = new Label(headerColumn2, q + 1, Checker.getStringValue(colData.get(2 + q)), cellFormat);
+//                    sheet2.addCell(lb);
+//                }
+//                for (int q = 0; q < 2; q++) {
+//                    Label lb = new Label(headerColumn3, q + 1, Checker.getStringValue(colData.get(4 + q)), cellFormat);
+//                    sheet3.addCell(lb);
+//                }
                     headerColumn++;
+//                headerColumn2++;
+//                headerColumn3++;
                 }
-                // 最后一页,添加汇总,同时关闭流
-                if (currentSheetIndex == sheetAmount - 1) {
+                if (i == a - 1) {
                     if (!Checker.isNone(collectList)) {
                         for (ExcelCollectPojo pojo : collectList) {
                             String[] dataArr = pojo.getDataArr();
                             for (int r = 0, j = dataArr.length; r < j; r++) {
+//                        Label lb = new Label(pojo.getCol() + i, pojo.getRow(), dataArr[i], cellFormat);
+//                        sheet.addCell(lb);
                                 Label lb2 = new Label(pojo.getCol() + r, pojo.getRow(), dataArr[r], cellFormat);
                                 sheet.addCell(lb2);
                             }
                         }
                     }
-                    // 写入流
+                }
+
+
+//            WritableSheet sheet = workbook.createSheet(fileName, 0);
+//            WritableSheet sheet2 = workbook.createSheet(fileName + "2", 1);
+//            WritableSheet sheet3 = workbook.createSheet(fileName + "3", 2);
+//
+//            //表头格式
+//            WritableCellFormat cellFormat = ExcelDownloadSrv.getWritableCellFormat();
+//            //数据行格式
+//            // 设置背景、字体颜色、对齐方式等等;
+//            WritableFont font2 = new WritableFont(WritableFont.ARIAL, 14, WritableFont.NO_BOLD, false, UnderlineStyle.NO_UNDERLINE, Colour.BLACK);
+//            WritableCellFormat cellFormat2 = new WritableCellFormat(font2);
+//            //设置文字居中对齐方式;
+//            cellFormat2.setAlignment(Alignment.CENTRE);
+//            //设置垂直居中;
+//            cellFormat2.setVerticalAlignment(VerticalAlignment.CENTRE);
+//            cellFormat2.setBackground(Colour.WHITE);
+//            cellFormat2.setBorder(Border.ALL, BorderLineStyle.THIN);
+//            cellFormat2.setWrap(true);
+//            //给sheet电子版中所有的列设置默认的列的宽度;
+//            sheet.getSettings().setDefaultColumnWidth(20);
+//            sheet.getSettings().setDefaultRowHeight(30 * 20);
+//            sheet2.getSettings().setDefaultColumnWidth(20);
+//            sheet2.getSettings().setDefaultRowHeight(30 * 20);
+//            sheet3.getSettings().setDefaultColumnWidth(20);
+//            sheet3.getSettings().setDefaultRowHeight(30 * 20);
+
+//            //单独应用样式
+//            if (excelStyleMap != null) {
+//                for (String column : excelStyleMap.keySet()) {
+//                    // 指定列宽
+//                    int styleColumnWidth = excelStyleMap.getIntValueSafely(column, ExcelStyleMap.STYLE_COLUMN_WIDTH, 0);
+//                    List<String> columns = new ArrayList<>(data.keySet());
+//                    for (int i = 0; i <1; i++) {
+//                        if (columns.get(i).equals(column)) {
+//                            sheet.setColumnView(i, styleColumnWidth);
+//                        }
+//                    }
+//
+//                }
+//            }
+//            // 设置格式(实线)
+//            WritableCellFormat cellFormat = new WritableCellFormat();
+//            //给sheet电子版中所有的列设置默认的列的宽度;
+//            sheet.getSettings().setDefaultColumnWidth(20);
+//            sheet.getSettings().setDefaultRowHeight(35 * 20);
+                //行号
+//            int firstRow = 0;
+//            //填充表头
+//            int headerColumn = 0;
+//            int headerColumn2 = 0;
+//            int headerColumn3 = 0;
+//            for (String key : data.keySet()) {
+//                Label label = new Label(headerColumn, firstRow, key, cellFormat);
+//                sheet.addCell(label);
+//                Label label2 = new Label(headerColumn2, firstRow, key, cellFormat);
+//                sheet2.addCell(label2);
+//                Label label3 = new Label(headerColumn3, firstRow, key, cellFormat);
+//                sheet2.addCell(label3);
+//                List<String> colData = data.get(key);
+//                for (int i = 0; i < 2; i++) {
+//                    Label lb = new Label(headerColumn, i + 1, Checker.getStringValue(colData.get(i)), cellFormat);
+//                    sheet.addCell(lb);
+////                    sheet2.addCell(lb);
+//                }
+//                for (int q = 0; q < 2; q++) {
+//                    Label lb = new Label(headerColumn2, q + 1, Checker.getStringValue(colData.get(2 + q)), cellFormat);
+//                    sheet2.addCell(lb);
+//                }
+//                for (int q = 0; q < 2; q++) {
+//                    Label lb = new Label(headerColumn3, q + 1, Checker.getStringValue(colData.get(4 + q)), cellFormat);
+//                    sheet3.addCell(lb);
+//                }
+//                headerColumn++;
+//                headerColumn2++;
+//                headerColumn3++;
+//            }
+                // 添加汇总
+//            if (!Checker.isNone(collectList)) {
+//                for (ExcelCollectPojo pojo : collectList) {
+//                    String[] dataArr = pojo.getDataArr();
+//                    for (int i = 0, j = dataArr.length; i < j; i++) {
+////                        Label lb = new Label(pojo.getCol() + i, pojo.getRow(), dataArr[i], cellFormat);
+////                        sheet.addCell(lb);
+//                        Label lb2 = new Label(pojo.getCol() + i, pojo.getRow(), dataArr[i], cellFormat);
+//                        sheet2.addCell(lb2);
+//                    }
+//                }
+//            }
+                //开始执行写入操作
+                if (i == a - 1) {
                     workbook.write();
                     //关闭流
                     workbook.close();
                 }
+
             }
+
             if (ba != null) {
                 try {
                     ba.close();
@@ -370,7 +487,7 @@ public class ExcelDownloadSrvNew {
                 }
             }
         } catch (Exception e) {
-            logger.error("ExcelDownloadSrv#generateAndReturnExcelFileWithNoStyleAndCollectLocal(fileName={}, path={} ):\n {}",
+            logger.error("ExcelDownloadSrv#generateAndReturnExcelByteArrayOutputStreamWithStyleAndCollect(fileName={}, path={} ):\n {}",
                     fileName, path, e.getMessage(), e);
         }
         return ba;
@@ -404,15 +521,16 @@ public class ExcelDownloadSrvNew {
 
 
     /**
-     * 通用的生成 Excel 字节流(包含汇总)并以流返回(一点样式也没有)
+     * 通用的生成 Excel 文件(包含汇总)并以流返回(一点样式也没有)
      *
-     * @param fileName excel 文件名
-     * @param data     需要填充的数据,key 是列名,value 是每一列的数据组成的 list, 类型必须是 {@link String}
+     * @param fileName            excel 文件名
+     * @param data                需要填充的数据,key 是列名,value 是每一列的数据组成的 list, 类型必须是 {@link String}
      * @throws AppMessageException 业务层异常抛出,如传入数据为空
      * @author Walker, added on 06/27/2019.
+     * 参考{@link ExcelDownloadSrv#generateAndReturnExcelByteArrayOutputStreamWithStyle(String, String, ExcelDataMap, ExcelStyleMap, List)}
      */
     public OutputStream generateAndReturnExcelByteArrayOutputStreamWithStyle(String fileName, String path, ExcelDataMap data, ExcelStyleMap excelStyleMap,
-                                                                             List<CustomExcelItem> collectList) throws AppMessageException {
+                                                                     List<CustomExcelItem> collectList, int size) throws AppMessageException {
         if (data == null || data.isEmpty()) {
             throw new AppMessageException("数据为空");
         }
@@ -420,96 +538,78 @@ public class ExcelDownloadSrvNew {
         ba = new ByteArrayOutputStream();
         WritableWorkbook workbook = null;
         try {
-            // 创建工作表格
+//            File file = new File(path);
             workbook = Workbook.createWorkbook(ba);
 
-            int listSize = 0;
-            if (data.size() > 0) {
-                Set<String> s1 = data.keySet();
-                //开始根据键找值
-                for (String key : s1) {
-                    List<String> value = data.get(key);
-                    if (!Checker.isNone(value)) {
-                        int dataItemSize = value.size();
-                        if (listSize < dataItemSize) {
-                            listSize = dataItemSize;
-                        }
-                    }
-                }
-            }
-            // 单元数
-            int sheetAmount = 0;
-            // 每个单元表格存放最大的行数,当list总数超过每个sheet所设置的最大值时,要注意分成多个sheet来存储
-            int sheetMaxSize = 0;
-            if (listSize < sheetMaxSize) {
-                sheetAmount = 1;
+            int list = size;
+            int a = 0;
+            if(list < 60000){
+                a = 1;
             } else {
-                if (listSize % sheetMaxSize == 0) {
-                    sheetAmount = listSize / sheetMaxSize;
+                if (list % 60000 == 0) {
+                    a = list / 60000;
                 } else {
-                    sheetAmount = listSize / sheetMaxSize + 1;
+                    a = list / 60000 + 1;
                 }
             }
-            // 工作表
-            for (int i = 0; i < sheetAmount; i++) {
-                // 当前页数(从0开始)
-                int currentSheetIndex = i;
-                // 当前页数(从1开始)
-                int sheetIndex = currentSheetIndex + 1;
-                WritableSheet sheet = workbook.createSheet(fileName + sheetIndex, 0);
-                // 获取带样式的cell
-                WritableCellFormat cellFormat = getWritableCellFormat();
+
+            for (int i = 0; i < a; i++) {
+                int page = i + 1;
+
+                WritableSheet sheet = workbook.createSheet(fileName + page, 0);
+                WritableCellFormat cellFormat = ExcelDownloadSrvOld.getWritableCellFormat();
+                //数据行格式
+                // 设置背景、字体颜色、对齐方式等等;
+                WritableFont font2 = new WritableFont(WritableFont.ARIAL, 14, WritableFont.NO_BOLD, false, UnderlineStyle.NO_UNDERLINE, Colour.BLACK);
+                WritableCellFormat cellFormat2 = new WritableCellFormat(font2);
+                //设置文字居中对齐方式;
+                cellFormat2.setAlignment(Alignment.CENTRE);
+                //设置垂直居中;
+                cellFormat2.setVerticalAlignment(VerticalAlignment.CENTRE);
+                cellFormat2.setBackground(Colour.WHITE);
+                cellFormat2.setBorder(Border.ALL, BorderLineStyle.THIN);
+                cellFormat2.setWrap(true);
                 //给sheet电子版中所有的列设置默认的列的宽度;
                 sheet.getSettings().setDefaultColumnWidth(20);
                 sheet.getSettings().setDefaultRowHeight(30 * 20);
-
-                // 单独应用样式
-                if (excelStyleMap != null) {
-                    for (String column : excelStyleMap.keySet()) {
-                        // 指定列宽
-                        int styleColumnWidth = excelStyleMap.getIntValueSafely(column, ExcelStyleMap.STYLE_COLUMN_WIDTH, 0);
-                        List<String> columns = new ArrayList<>(data.keySet());
-                        for (int j = 0, columnsSize = columns.size(); j < columnsSize; j++) {
-                            if (columns.get(j).equals(column)) {
-                                sheet.setColumnView(j, styleColumnWidth);
-                            }
-                        }
-                    }
-                }
-                // 第一行
                 int firstRow = 0;
-                // 填充表头
+                //填充表头
                 int headerColumn = 0;
-                // 遍历设置数据
+
+                int b = 0;
+                int c = i+1;
+                if(size < 60000* c){
+                    b = size - 60000*i;
+                } else{
+                    b = 60000;
+                }
+
                 for (String key : data.keySet()) {
                     Label label = new Label(headerColumn, firstRow, key, cellFormat);
                     sheet.addCell(label);
                     List<String> colData = data.get(key);
-                    // 当前页数所对应的行数
-                    int currentSheetRowAmount = 0;
-                    if (listSize < sheetMaxSize * sheetIndex) {
-                        currentSheetRowAmount = listSize - sheetMaxSize * currentSheetIndex;
-                    } else {
-                        currentSheetRowAmount = sheetMaxSize;
-                    }
-                    for (int q = 0; q < currentSheetRowAmount; q++) {
-                        // 之前所有页的数据汇总数量
-                        int beforePageAllAmount = sheetMaxSize * currentSheetIndex;
-                        Label lb = new Label(headerColumn, q + 1, Checker.getStringValue(colData.get(beforePageAllAmount + q)), cellFormat);
+                    for (int q = 0; q < b; q++) {
+                        int e = 60000 * i;
+                        Label lb = new Label(headerColumn, q + 1, Checker.getStringValue(colData.get(e + q)), cellFormat);
                         sheet.addCell(lb);
                     }
                     headerColumn++;
                 }
-                // 最后一页,添加汇总,同时关闭流
-                if (currentSheetIndex == sheetAmount - 1) {
+                // 添加汇总
+                if (i == a - 1) {
                     if (!Checker.isNone(collectList)) {
                         for (CustomExcelItem item : collectList) {
-                            sheet.addCell(new Label(item.getColumn(), item.getRow(), item.getContent(), item.getCellFormat() == null ? cellFormat : item.getCellFormat()));
+                            sheet.addCell(new Label(item.getColumn(), item.getRow(), item.getContent(),
+                                    item.getCellFormat() == null ? cellFormat2 : item.getCellFormat()));
+
+
                         }
                     }
-                    // 写入流
+                }
+
+                if (i == a - 1){
                     workbook.write();
-                    // 关闭流
+                    //关闭流
                     workbook.close();
                 }
             }
@@ -578,40 +678,9 @@ public class ExcelDownloadSrvNew {
                 }
             }
         } catch (Exception e) {
-            logger.error("ExcelDownloadSrv#generateAndReturnExcelFileWithNoStyleAndCollectLocal(fileName={}, path={} ):\n {}",
+            logger.error("ExcelDownloadSrv#generateAndReturnExcelByteArrayOutputStreamWithStyleAndCollect(fileName={}, path={} ):\n {}",
                     fileName, path, e.getMessage(), e);
         }
         return ba;
     }
-
-    public void outputStreamToFile(String localPath, OutputStream ba) {
-
-        File file = new File(localPath);
-        //选择流
-        FileOutputStream fos = null;
-        ByteArrayInputStream bais = null;
-        try {
-            bais = new ByteArrayInputStream(((ByteArrayOutputStream) ba).toByteArray());
-            fos = new FileOutputStream(file);
-            int temp;
-            byte[] bt = new byte[1024 * 10];
-            while ((temp = bais.read(bt)) != -1) {
-                fos.write(bt, 0, temp);
-            }
-        } catch (FileNotFoundException e) {
-            e.printStackTrace();
-        } catch (IOException e) {
-            e.printStackTrace();
-        } finally {
-            //关流
-            try {
-                if (null != fos) {
-                    fos.close();
-                }
-            } catch (IOException e) {
-                e.printStackTrace();
-            }
-        }
-        // ------ test end ----------
-    }
 }

+ 0 - 32
src/main/java/com/ywt/mg/web/controllers/OfflineController.java

@@ -2,51 +2,19 @@ package com.ywt.mg.web.controllers;
 
 
 import com.ywt.mg.core.MGRight;
-import com.ywt.mg.core.MGRightTypeDef;
-import com.ywt.mg.core.PagedList;
-import com.ywt.mg.core.utils.AsyncUtil;
 import com.ywt.mg.core.utils.Checker;
-import com.ywt.mg.core.utils.CollectionUtil;
-import com.ywt.mg.core.utils.FormatUtil;
 import com.ywt.mg.core.utils.serializers.JsonSerializer;
-import com.ywt.mg.domain.entities.*;
 import com.ywt.mg.domain.models.ConstantDef;
-import com.ywt.mg.domain.models.ExcelDataMap;
-import com.ywt.mg.domain.models.ExcelStyleMap;
-import com.ywt.mg.domain.models.enums.DownloadRecordStatusEnum;
-import com.ywt.mg.domain.models.enums.OfflineConsultationSourceEnum;
 import com.ywt.mg.domain.models.enums.PaymentStatusEnum;
-import com.ywt.mg.domain.models.enums.RefundStatusEnum;
-import com.ywt.mg.domain.models.pojo.ExcelCollectPojo;
 import com.ywt.mg.params.offline.DownloadOfflineListNewRequest;
 import com.ywt.mg.services.*;
 import com.ywt.mg.web.BaseResponse;
-import com.ywt.mg.web.DataResponse;
-import com.ywt.mg.web.PageDataResponse;
-import com.ywt.mg.web.common.ExcelDownloadSrv;
-import com.ywt.mg.web.common.FileSrv;
-import jxl.Workbook;
-import jxl.format.Alignment;
-import jxl.format.Border;
-import jxl.format.BorderLineStyle;
-import jxl.format.Colour;
-import jxl.format.*;
-import jxl.format.VerticalAlignment;
-import jxl.write.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
-import org.springframework.web.context.request.RequestContextHolder;
-import org.springframework.web.context.request.ServletRequestAttributes;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.OutputStream;
-import java.util.*;
 
 /**
  * 线下就诊相关方法类(公司后台查询所有的,通过hospital_id来区分,公司后台hospital_id = -1)