【zip导出】下载导出包含图片,excel,pdf的zip压缩包

工具类

package com.sapit.compensation.moudle;

import java.awt.Color;
import java.awt.Rectangle;
import java.awt.geom.Rectangle2D;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.sl.usermodel.PictureData.PictureType;
import org.apache.poi.ss.SpreadsheetVersion;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFPictureData;
import org.apache.poi.xslf.usermodel.XSLFPictureShape;
import org.apache.poi.xslf.usermodel.XSLFSlide;
import org.apache.poi.xslf.usermodel.XSLFTextBox;
import org.apache.poi.xslf.usermodel.XSLFTextParagraph;
import org.apache.poi.xslf.usermodel.XSLFTextRun;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFColor;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.alibaba.fastjson.JSONObject;
import com.sapit.compensation.common.util.Base64Util;
import com.sapit.compensation.common.util.FileUtilsExt;
import com.sapit.compensation.common.util.TimestampTool;
import com.sapit.compensation.common.util.ZipUtils;
import com.sapit.compensation.moudle.business.architectureAnalysis.SchemeAnalysis;
import com.sapit.compensation.moudle.business.data.CompensationAnalysis;

/**
 * <p>文件名称: DownloadEcharsAndData.java </p> 
 * <p>类型描述: [分析页面下载功能] </p>
 * <p>创建时间: 2022年5月23日 </p>
 * @author jlk
 * @version V1.0
 */
public class DownloadEcharsAndData {

    private static Logger logger = LoggerFactory.getLogger(com.sapit.compensation.common.util.FileUtilsExt.class);

    /**
     * @Description: 下载zip
     * @param <map>
     * @param <HttpServletResponse>
     * @Author:jlk
     * @CreateTime:2022-05-24
     * @throws IOException 
     */
    @SuppressWarnings("all")
    public static void downloadZip(HashMap map, HttpServletRequest request, HttpServletResponse response) throws IOException {
        String path = request.getSession().getServletContext().getRealPath("upload");
        String fileName = UUID.randomUUID().toString();
        File file = new File(path + File.separator + fileName);

        response.setContentType("application/zip");
        response.setCharacterEncoding("utf-8");
        response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");

        response.setHeader("Content-Disposition", "attachment;filename=" + java.net.URLEncoder.encode(map.get("name").toString(), "UTF-8"));

        OutputStream outs = response.getOutputStream();
        try {
            if (file.mkdirs()) {
                logger.debug("生成文件夹成功", file.toString());
            }
            //excel生成
            String excelPath = "";
            //initCellMaxTextLength();
            if (map.get("customerPositionClass") != null) {
                excelPath = writeExcelCustomerPositionClass(file, map);
            } else {
                excelPath = writeExcel(file, map);
            }

            //转码图片
            List<String> imgPathList = base64ToJpg(file, map);
            //打包zip
            List<File> fileList = new ArrayList<>();
            if (CollectionUtils.isNotEmpty(imgPathList)) {
                for (int i = 0; i < imgPathList.size(); i++) {
                    fileList.add(new File(imgPathList.get(i)));
                }
            }
            if (StringUtils.isNoneBlank(excelPath))
                fileList.add(new File(excelPath));
            ZipUtils.toZip(fileList, outs);
        } catch (Exception e) {
            logger.debug("错误", e);
        } finally {
            outs.flush();
            outs.close();
            FileUtilsExt.delFile(file.toString());

        }
    }

    /**
     * @Description: base64转换jpg
     * @param <File>
     * @param <HashMap>
     * @throws IOException 
     * @Author:jlk
     * @CreateTime:2022-05-24
     */
    @SuppressWarnings("all")
    public static List<String> base64ToJpg(File file, HashMap map) throws IOException {
        List<String> imgPathList = new ArrayList<String>();
        if (map.get("baseImg") != null) {
            List<String> imgList = (List<String>) map.get("baseImg");
            for (int i = 0; i < imgList.size(); i++) {
                String base64 = imgList.get(i);
                if (StringUtils.isNotBlank(base64)) {
                    String imgPathName = file.toString() + File.separator + map.get("name") + "_图表_" + i;
                    String imgPath = Base64Util.generateImage(base64, imgPathName);
                    imgPathList.add(imgPath);
                }
            }
            return imgPathList;
        }
        return imgPathList;
    }

    /**
     * @Description: excel
     * @param <File>
     * @param <HashMap>
     * @Author:jlk
     * @CreateTime:2022-05-24
     */
    @SuppressWarnings("all")
    public static String writeExcel(File file, HashMap map) throws IOException {
        //服务器路径+文件名
        String excelPath = file.toString() + file.separator + map.get("name") + ".xlsx";
        FileOutputStream fout = new FileOutputStream(excelPath);
        try {
            //获取数据源
            List<List<String>> dataList = (List<List<String>>) map.get("dataList");
            List<List<String>> colorList = (List<List<String>>) map.get("colorList");
            List<List<String>> titleList = (List<List<String>>) map.get("titleList");
            List<List<String>> echarsList = (List<List<String>>) map.get("echarsList");
            List<List<String>> dataRatioList = (List<List<String>>) map.get("dataRatioList");
            List<List<String>> colorRatioList = (List<List<String>>) map.get("colorRatioList");

            //创建excel
            XSSFWorkbook wb = new XSSFWorkbook();
            XSSFRow row = null;
            XSSFCell cell = null;
            // 创建新的sheet对象(excel的表单) 并设置sheet名字
            XSSFSheet sheet = wb.createSheet(map.get("name").toString());
            sheet.setDefaultRowHeightInPoints(20);
            sheet.setDefaultColumnWidth(12);

            XSSFCellStyle titleStyle = getTitleStyle(wb);

            XSSFCellStyle echarsStyle = getEcharsStyle(wb);

            XSSFCellStyle cellNoColorStyle = getNoColorStyle(wb);

            Font cellFont = wb.createFont();
            cellFont.setItalic(false); // 设置字体为斜体字   
            cellFont.setFontHeightInPoints((short) 10); // 将字体大小设置为9px   
            cellFont.setFontName("宋体"); // 字体应用到当前单元格上   
            cellNoColorStyle.setFont(cellFont);
            cellNoColorStyle.setWrapText(true);//设置自动换行
            // ------------------处理数据/start---------------------
            //表头
            int rowNum = 0;

            if (CollectionUtils.isNotEmpty(titleList)) {
                for (int i = 0; i < titleList.size(); i++) {
                    int MergedCount = 0;
                    int beginIndex = 0;
                    int endIndex = 0;
                    row = sheet.createRow(rowNum);
                    rowNum++;
                    List<String> titles = titleList.get(i);
                    for (int j = 0; j < titles.size(); j++) {
                        String content = titles.get(j);
                        cell = row.createCell(j);
                        cell.setCellValue("" + content + "");
                        cell.setCellStyle(titleStyle);
                        if (j > 0 && j < titles.size()) {

                            if (content.equals(titles.get(j - 1)) && StringUtils.isNotBlank(content)) {
                                MergedCount++;
                                if (MergedCount == 1) {
                                    beginIndex = j - 1;
                                }
                                if (j == titles.size() - 1) {
                                    endIndex = j;
                                    sheet.addMergedRegion(new CellRangeAddress(row.getRowNum(), row.getRowNum(), beginIndex, endIndex));
                                }
                            } else if (!content.equals(titles.get(j - 1)) && MergedCount > 0 && j == titles.size() - 1) {
                                endIndex = j - 1;
                                sheet.addMergedRegion(new CellRangeAddress(row.getRowNum(), row.getRowNum(), beginIndex, endIndex));

                            }
                        }
                        if (i > 0 && i < titleList.size()) {
                            String contentRow = titleList.get(i - 1).get(j);
                            if (i > 0 && i < titleList.size() && contentRow.equals(titles.get(j))) {
                                sheet.addMergedRegion(new CellRangeAddress(row.getRowNum() - 1, row.getRowNum(), j, j));
                            }
                        }

                    }
                }
            }
            //表格数据
            if (CollectionUtils.isNotEmpty(colorList)) {
                for (int i = 0; i < dataList.size(); i++) {
                    row = sheet.createRow(rowNum);
                    rowNum++;
                    List<String> rowColorList = colorList.get(i);
                    List<String> rowList = dataList.get(i);
                    for (int j = 0; j < rowList.size(); j++) {
                        cell = row.createCell(j);
                        cell.setCellValue("" + rowList.get(j) + "");
                        XSSFCellStyle cellColorStyle = wb.createCellStyle();
                        String color = rowColorList.get(j);
                        cellColorStyle.setAlignment(HorizontalAlignment.CENTER);
                        cellColorStyle.setVerticalAlignment(VerticalAlignment.CENTER);

                        cellColorStyle.setBorderBottom(BorderStyle.THIN);//下边框  
                        cellColorStyle.setBorderLeft(BorderStyle.THIN);//左边框  
                        cellColorStyle.setBorderRight(BorderStyle.THIN);//右边框  
                        cellColorStyle.setBorderTop(BorderStyle.THIN);//上边框

                        cellColorStyle.setFont(cellFont);
                        cellColorStyle.setWrapText(true);//设置自动换行
                        cellColorStyle.setFillForegroundColor(new XSSFColor(new Color(colorToFloat(color)[0], colorToFloat(color)[1], colorToFloat(color)[2])));
                        cellColorStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
                        cell.setCellStyle(cellColorStyle);
                    }
                }
            } else {
                for (int i = 0; i < dataList.size(); i++) {
                    row = sheet.createRow(rowNum);
                    rowNum++;
                    List<String> rowList = dataList.get(i);
                    for (int j = 0; j < rowList.size(); j++) {
                        cell = row.createCell(j);
                        cell.setCellValue("" + rowList.get(j) + "");
                        cell.setCellStyle(cellNoColorStyle);
                    }
                }
            }
            if (CollectionUtils.isNotEmpty(dataRatioList)) {
                rowNum = rowNum + 5;
                if (CollectionUtils.isNotEmpty(titleList)) {
                    for (int i = 0; i < titleList.size(); i++) {
                        int MergedCount = 0;
                        int beginIndex = 0;
                        int endIndex = 0;
                        row = sheet.createRow(rowNum);
                        rowNum++;
                        List<String> titles = titleList.get(i);
                        for (int j = 0; j < titles.size(); j++) {
                            String content = titles.get(j);
                            cell = row.createCell(j);
                            cell.setCellValue("" + content + "");
                            cell.setCellStyle(titleStyle);
                            if (j > 0 && j < titles.size()) {
                                if (content.equals(titles.get(j - 1)) && StringUtils.isNotBlank(content)) {
                                    MergedCount++;
                                    if (MergedCount == 1) {
                                        beginIndex = j - 1;
                                    }
                                    if (j == titles.size() - 1) {
                                        endIndex = j;
                                        sheet.addMergedRegion(new CellRangeAddress(row.getRowNum(), row.getRowNum(), beginIndex, endIndex));
                                    }
                                } else if (!content.equals(titles.get(j - 1)) && MergedCount > 0 && j == titles.size() - 1) {
                                    endIndex = j - 1;
                                    sheet.addMergedRegion(new CellRangeAddress(row.getRowNum(), row.getRowNum(), beginIndex, endIndex));

                                }
                            }
                            if (i > 0 && i < titleList.size()) {
                                String contentRow = titleList.get(i - 1).get(j);
                                if (i > 0 && i < titleList.size() && contentRow.equals(titles.get(j))) {
                                    sheet.addMergedRegion(new CellRangeAddress(row.getRowNum() - 1, row.getRowNum(), j, j));
                                }
                            }

                        }
                    }
                }
                //表格二数据
                if (CollectionUtils.isNotEmpty(colorRatioList)) {
                    for (int i = 0; i < dataRatioList.size(); i++) {
                        row = sheet.createRow(rowNum);
                        rowNum++;
                        List<String> rowColorList = colorRatioList.get(i);
                        List<String> rowList = dataRatioList.get(i);
                        for (int j = 0; j < rowList.size(); j++) {
                            cell = row.createCell(j);
                            cell.setCellValue("" + rowList.get(j) + "");
                            XSSFCellStyle cellColorStyle = wb.createCellStyle();
                            String color = rowColorList.get(j);
                            cellColorStyle.setAlignment(HorizontalAlignment.CENTER);
                            cellColorStyle.setVerticalAlignment(VerticalAlignment.CENTER);

                            cellColorStyle.setBorderBottom(BorderStyle.THIN);//下边框  
                            cellColorStyle.setBorderLeft(BorderStyle.THIN);//左边框  
                            cellColorStyle.setBorderRight(BorderStyle.THIN);//右边框  
                            cellColorStyle.setBorderTop(BorderStyle.THIN);//上边框

                            cellColorStyle.setFont(cellFont);
                            cellColorStyle.setWrapText(true);//设置自动换行
                            cellColorStyle.setFillForegroundColor(new XSSFColor(new Color(colorToFloat(color)[0], colorToFloat(color)[1], colorToFloat(color)[2])));
                            cellColorStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
                            cell.setCellStyle(cellColorStyle);
                        }
                    }
                } else {
                    for (int i = 0; i < dataRatioList.size(); i++) {
                        row = sheet.createRow(rowNum);
                        rowNum++;
                        List<String> rowList = dataRatioList.get(i);
                        for (int j = 0; j < rowList.size(); j++) {
                            cell = row.createCell(j);
                            cell.setCellValue("" + rowList.get(j) + "");
                            cell.setCellStyle(cellNoColorStyle);
                        }
                    }
                }
            }
            //echars数据
            if (rowNum != 0) {
                rowNum = rowNum + 5;
            }
            if (CollectionUtils.isNotEmpty(echarsList)) {
                for (int i = 0; i < echarsList.size(); i++) {
                    List<String> echars = echarsList.get(i);
                    if (CollectionUtils.isNotEmpty(echars)) {
                        for (int j = 0; j < echars.size(); j++) {
                            row = sheet.createRow(rowNum);
                            String content = echars.get(j);
                            if (StringUtils.isNoneBlank(content)) {
                                int max = 32767;
                                int len = content.length();
                                int num = content.length() / max;
                                for (int k = 0; k <= num; k++) {
                                    if (k == num) {
                                        cell = row.createCell(k);
                                        cell.setCellValue("" + content.substring(k * max, len) + "");
                                        cell.setCellStyle(echarsStyle);
                                    } else {
                                        cell = row.createCell(k);
                                        cell.setCellValue("" + content.substring(k * max, (k + 1) * max) + "");
                                        cell.setCellStyle(echarsStyle);
                                    }
                                }
                            }
                            rowNum++;
                        }
                    }

                }
            }

            // ------------------处理数据end--------------------------------------

            wb.write(fout);
            fout.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
        }
        return excelPath;
    }

    /**
     * @Description: rgb颜色值转换
     * @param <String>
     * @Author:jlk
     * @CreateTime:2022-05-24
     */
    @SuppressWarnings("all")
    public static Integer[] colorToFloat(String color) {
        Integer[] rgb = Arrays.stream(color.split(",")).map(s -> {
            s = s.trim();
            return Integer.parseInt(s);
        }).toArray(Integer[]::new);
        return rgb;
    }

    /**
     * @Description: 下载PPT
     * @param <map>
     * @param <HttpServletResponse>
     * @Author:jlk
     * @CreateTime:2022-05-24
     * @throws IOException 
     */
    @SuppressWarnings("all")
    public static void downloadPPT(String customerName, List<CompensationAnalysis> CompensationAnalysisList, HttpServletRequest request,
            HttpServletResponse response) throws IOException {

        String path = request.getSession().getServletContext().getRealPath("upload");
        String fileName = UUID.randomUUID().toString();
        File file = new File(path + File.separator + fileName);
        if (file.mkdirs()) {
            logger.debug("生成文件夹成功", file.toString());
        }
        response.reset();
        response.setContentType("application/zip");
        response.setCharacterEncoding("utf-8");
        response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");

        response.setHeader("Content-Disposition", "attachment;filename=" + java.net.URLEncoder.encode(customerName + "_薪酬分析图表_" + TimestampTool.getDate(new Date()), "UTF-8"));

        OutputStream outs = response.getOutputStream();

        //创建ppt
        XMLSlideShow ppt = new XMLSlideShow();
        File pptPath = new File(file + File.separator + customerName + "_薪酬分析图表_" + TimestampTool.getDate(new Date()) + ".pptx");
        Map<Integer, String> dataMap = new HashMap<>();
        FileOutputStream pptbaos = new FileOutputStream(pptPath);

        //创建excel
        XSSFWorkbook wb = new XSSFWorkbook();
        File excelPath = new File(file + File.separator + customerName + "_薪酬分析图表_" + TimestampTool.getDate(new Date()) + ".xlsx");
        FileOutputStream excelbaos = new FileOutputStream(excelPath);
        boolean isppt = false;
        boolean isexcel = false;
        try {
            for (int j = 0; j < CompensationAnalysisList.size(); j++) {

                String base64 = CompensationAnalysisList.get(j).getAnalysisImage();
                String data = CompensationAnalysisList.get(j).getAnalysisData();
                String name = CompensationAnalysisList.get(j).getAnalysisTopicName();
                if (StringUtils.isNotBlank(base64)) {
                    XSLFSlide slide = ppt.createSlide();

                    XSLFTextBox shape1 = slide.createTextBox();
                    Rectangle anchor = new Rectangle(30, 30, 300, 50);
                    shape1.setAnchor(anchor);
                    XSLFTextParagraph p1 = shape1.addNewTextParagraph();
                    XSLFTextRun r1 = p1.addNewTextRun();
                    r1.setFontSize(14.00);
                    r1.setFontColor(Color.black);
                    //shape1.setFillColor(Color.red);  
                    r1.setText(name);

                    // 图片文件
                    String imgPathName = file.toString() + File.separator + CompensationAnalysisList.get(j).getAnalysisTopicName();
                    String imgPath = Base64Util.generateImage(base64, imgPathName);
                    File image = new File(imgPath);
                    //测试用本地图片
                    //File image = new File("E://plief.jpg");
                    // 图片文件输入流
                    FileInputStream imageFis = new FileInputStream(image);
                    // 获取图片大小
                    int len = (int) image.length();
                    // 创建一个字节数组,数组大小与图片文件大小一致
                    byte[] imageData = new byte[len];
                    // 将图片数据读进字节数组中
                    int pictureData = imageFis.read(imageData);
                    // 将图片添加到PPT中
                    XSLFPictureData pd = ppt.addPicture(imageData, PictureType.PNG);
                    // 将图片放到指定的幻灯片中
                    XSLFPictureShape pic = slide.createPicture(pd);
                    // 设置图片框的放置的位置和大小
                    pic.setAnchor(new Rectangle2D.Double(100, 160, 520, 200));
                    isppt = true;
                    imageFis.close();
                }
                if (StringUtils.isNotBlank(data)) {
                    JSONObject object = JSONObject.parseObject(data);
                    writeExcel(object, wb);
                    isexcel = true;
                }

            }
            ppt.write(pptbaos);
            wb.write(excelbaos);
            List<File> fileList = new ArrayList<>();
            if (isppt)
                fileList.add(pptPath);
            if (isexcel)
                fileList.add(excelPath);

            ZipUtils.toZip(fileList, outs);
        } catch (Exception e) {
            logger.debug("错误", e);
        } finally {
            pptbaos.flush();
            pptbaos.close();
            excelbaos.flush();
            excelbaos.close();
            outs.flush();
            outs.close();
            FileUtilsExt.delFile(file.toString());

        }
    }

    public static byte[] File2byte(File tradeFile) {
        byte[] buffer = null;
        try {
            FileInputStream fis = new FileInputStream(tradeFile);
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            byte[] b = new byte[1024];
            int n;
            while ((n = fis.read(b)) != -1) {
                bos.write(b, 0, n);
            }
            fis.close();
            bos.close();
            buffer = bos.toByteArray();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return buffer;
    }

    public static XSLFSlide copySlide(XSLFSlide slide) {
        XSLFSlide newSlide = slide.getSlideShow().createSlide(slide.getSlideLayout());
        newSlide.appendContent(slide);
        return newSlide;
    }

    /**
     * @Description: excel
     * @param <File>
     * @param <HashMap>
     * @Author:jlk
     * @CreateTime:2022-05-24
     */
    @SuppressWarnings("all")
    public static XSSFWorkbook writeExcel(JSONObject jsonObject, XSSFWorkbook wb) throws IOException {

        try {
            //获取数据源
            List<List<String>> dataList = (List<List<String>>) jsonObject.get("dataList");
            List<List<String>> colorList = (List<List<String>>) jsonObject.get("colorList");
            List<List<String>> titleList = (List<List<String>>) jsonObject.get("titleList");
            List<List<String>> echarsList = (List<List<String>>) jsonObject.get("echarsList");
            List<List<String>> dataRatioList = (List<List<String>>) jsonObject.get("dataRatioList");
            List<List<String>> colorRatioList = (List<List<String>>) jsonObject.get("colorRatioList");

            XSSFRow row = null;
            XSSFCell cell = null;
            // 创建新的sheet对象(excel的表单) 并设置sheet名字
            XSSFSheet sheet = wb.createSheet(jsonObject.get("name").toString());
            sheet.setDefaultRowHeightInPoints(20);
            sheet.setDefaultColumnWidth(12);

            XSSFCellStyle titleStyle = getTitleStyle(wb);

            XSSFCellStyle echarsStyle = getEcharsStyle(wb);

            XSSFCellStyle cellNoColorStyle = getNoColorStyle(wb);

            Font cellFont = wb.createFont();
            cellFont.setItalic(false); // 设置字体为斜体字   
            cellFont.setFontHeightInPoints((short) 10); // 将字体大小设置为9px   
            cellFont.setFontName("宋体"); // 字体应用到当前单元格上   
            cellNoColorStyle.setFont(cellFont);
            cellNoColorStyle.setWrapText(true);//设置自动换行
            // ------------------处理数据/start---------------------
            //表头
            int rowNum = 0;

            if (CollectionUtils.isNotEmpty(titleList)) {
                for (int i = 0; i < titleList.size(); i++) {
                    int MergedCount = 0;
                    int beginIndex = 0;
                    int endIndex = 0;
                    row = sheet.createRow(rowNum);
                    rowNum++;
                    List<String> titles = titleList.get(i);
                    for (int j = 0; j < titles.size(); j++) {
                        String content = titles.get(j);
                        cell = row.createCell(j);
                        cell.setCellValue("" + content + "");
                        cell.setCellStyle(titleStyle);
                        if (j > 0 && j < titles.size()) {

                            if (content.equals(titles.get(j - 1)) && StringUtils.isNotBlank(content)) {
                                MergedCount++;
                                if (MergedCount == 1) {
                                    beginIndex = j - 1;
                                }
                                if (j == titles.size() - 1) {
                                    endIndex = j;
                                    sheet.addMergedRegion(new CellRangeAddress(row.getRowNum(), row.getRowNum(), beginIndex, endIndex));
                                }
                            } else if (!content.equals(titles.get(j - 1)) && MergedCount > 0 && j == titles.size() - 1) {
                                endIndex = j - 1;
                                sheet.addMergedRegion(new CellRangeAddress(row.getRowNum(), row.getRowNum(), beginIndex, endIndex));

                            }
                        }
                        if (i > 0 && i < titleList.size()) {
                            String contentRow = titleList.get(i - 1).get(j);
                            if (i > 0 && i < titleList.size() && contentRow.equals(titles.get(j))) {
                                sheet.addMergedRegion(new CellRangeAddress(row.getRowNum() - 1, row.getRowNum(), j, j));
                            }
                        }

                    }
                }
            }
            //表格数据
            if (CollectionUtils.isNotEmpty(colorList)) {
                for (int i = 0; i < dataList.size(); i++) {
                    row = sheet.createRow(rowNum);
                    rowNum++;
                    List<String> rowColorList = colorList.get(i);
                    List<String> rowList = dataList.get(i);
                    for (int j = 0; j < rowList.size(); j++) {
                        cell = row.createCell(j);
                        cell.setCellValue("" + rowList.get(j) + "");
                        XSSFCellStyle cellColorStyle = wb.createCellStyle();
                        String color = rowColorList.get(j);
                        cellColorStyle.setAlignment(HorizontalAlignment.CENTER);
                        cellColorStyle.setVerticalAlignment(VerticalAlignment.CENTER);

                        cellColorStyle.setBorderBottom(BorderStyle.THIN);//下边框  
                        cellColorStyle.setBorderLeft(BorderStyle.THIN);//左边框  
                        cellColorStyle.setBorderRight(BorderStyle.THIN);//右边框  
                        cellColorStyle.setBorderTop(BorderStyle.THIN);//上边框

                        cellColorStyle.setFont(cellFont);
                        cellColorStyle.setWrapText(true);//设置自动换行
                        cellColorStyle.setFillForegroundColor(new XSSFColor(new Color(colorToFloat(color)[0], colorToFloat(color)[1], colorToFloat(color)[2])));
                        cellColorStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
                        cell.setCellStyle(cellColorStyle);
                    }
                }
            } else {
                for (int i = 0; i < dataList.size(); i++) {
                    row = sheet.createRow(rowNum);
                    rowNum++;
                    List<String> rowList = dataList.get(i);
                    for (int j = 0; j < rowList.size(); j++) {
                        cell = row.createCell(j);
                        cell.setCellValue("" + rowList.get(j) + "");
                        cell.setCellStyle(cellNoColorStyle);
                    }
                }
            }
            if (CollectionUtils.isNotEmpty(dataRatioList)) {
                rowNum = rowNum + 5;
                if (CollectionUtils.isNotEmpty(titleList)) {
                    for (int i = 0; i < titleList.size(); i++) {
                        int MergedCount = 0;
                        int beginIndex = 0;
                        int endIndex = 0;
                        row = sheet.createRow(rowNum);
                        rowNum++;
                        List<String> titles = titleList.get(i);
                        for (int j = 0; j < titles.size(); j++) {
                            String content = titles.get(j);
                            cell = row.createCell(j);
                            cell.setCellValue("" + content + "");
                            cell.setCellStyle(titleStyle);
                            if (j > 0 && j < titles.size()) {
                                if (content.equals(titles.get(j - 1)) && StringUtils.isNotBlank(content)) {
                                    MergedCount++;
                                    if (MergedCount == 1) {
                                        beginIndex = j - 1;
                                    }
                                    if (j == titles.size() - 1) {
                                        endIndex = j;
                                        sheet.addMergedRegion(new CellRangeAddress(row.getRowNum(), row.getRowNum(), beginIndex, endIndex));
                                    }
                                } else if (!content.equals(titles.get(j - 1)) && MergedCount > 0 && j == titles.size() - 1) {
                                    endIndex = j - 1;
                                    sheet.addMergedRegion(new CellRangeAddress(row.getRowNum(), row.getRowNum(), beginIndex, endIndex));

                                }
                            }
                            if (i > 0 && i < titleList.size()) {
                                String contentRow = titleList.get(i - 1).get(j);
                                if (i > 0 && i < titleList.size() && contentRow.equals(titles.get(j))) {
                                    sheet.addMergedRegion(new CellRangeAddress(row.getRowNum() - 1, row.getRowNum(), j, j));
                                }
                            }

                        }
                    }
                }
                //表格二数据
                if (CollectionUtils.isNotEmpty(colorRatioList)) {
                    for (int i = 0; i < dataRatioList.size(); i++) {
                        row = sheet.createRow(rowNum);
                        rowNum++;
                        List<String> rowColorList = colorRatioList.get(i);
                        List<String> rowList = dataRatioList.get(i);
                        for (int j = 0; j < rowList.size(); j++) {
                            cell = row.createCell(j);
                            cell.setCellValue("" + rowList.get(j) + "");
                            XSSFCellStyle cellColorStyle = wb.createCellStyle();
                            String color = rowColorList.get(j);
                            cellColorStyle.setAlignment(HorizontalAlignment.CENTER);
                            cellColorStyle.setVerticalAlignment(VerticalAlignment.CENTER);

                            cellColorStyle.setBorderBottom(BorderStyle.THIN);//下边框  
                            cellColorStyle.setBorderLeft(BorderStyle.THIN);//左边框  
                            cellColorStyle.setBorderRight(BorderStyle.THIN);//右边框  
                            cellColorStyle.setBorderTop(BorderStyle.THIN);//上边框

                            cellColorStyle.setFont(cellFont);
                            cellColorStyle.setWrapText(true);//设置自动换行
                            cellColorStyle.setFillForegroundColor(new XSSFColor(new Color(colorToFloat(color)[0], colorToFloat(color)[1], colorToFloat(color)[2])));
                            cellColorStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
                            cell.setCellStyle(cellColorStyle);
                        }
                    }
                } else {
                    for (int i = 0; i < dataRatioList.size(); i++) {
                        row = sheet.createRow(rowNum);
                        rowNum++;
                        List<String> rowList = dataRatioList.get(i);
                        for (int j = 0; j < rowList.size(); j++) {
                            cell = row.createCell(j);
                            cell.setCellValue("" + rowList.get(j) + "");
                            cell.setCellStyle(cellNoColorStyle);
                        }
                    }
                }
            }
            //echars数据
            if (rowNum != 0) {
                rowNum = rowNum + 5;
            }
            if (CollectionUtils.isNotEmpty(echarsList)) {
                for (int i = 0; i < echarsList.size(); i++) {
                    List<String> echars = echarsList.get(i);
                    if (CollectionUtils.isNotEmpty(echars)) {
                        for (int j = 0; j < echars.size(); j++) {
                            row = sheet.createRow(rowNum);
                            //单元格超32767报错问题修改
                            String content = echars.get(j);
                            if (StringUtils.isNoneBlank(content)) {
                                int max = 32767;
                                int len = content.length();
                                int num = content.length() / max;
                                for (int k = 0; k <= num; k++) {
                                    if (k == num) {
                                        cell = row.createCell(k);
                                        cell.setCellValue("" + content.substring(k * max, len) + "");
                                        cell.setCellStyle(echarsStyle);
                                    } else {
                                        cell = row.createCell(k);
                                        cell.setCellValue("" + content.substring(k * max, (k + 1) * max) + "");
                                        cell.setCellStyle(echarsStyle);
                                    }
                                }
                            }
                            rowNum++;
                        }
                    }

                }
            }

            // ------------------处理数据end--------------------------------------
        } catch (Exception e) {
            logger.debug("错误", e);
        } finally {
        }
        return wb;
    }

    /**
     * @Description: 职级图excel
     * @param <File>
     * @param <HashMap>
     * @Author:jlk
     * @CreateTime:2022-05-24
     */
    @SuppressWarnings("all")
    public static String writeExcelCustomerPositionClass(File file, HashMap map) throws IOException {
        //服务器路径+文件名
        String excelPath = file.toString() + file.separator + map.get("name") + ".xlsx";
        FileOutputStream fout = new FileOutputStream(excelPath);
        try {
            //获取数据源
            List<Map> dataList = (List<Map>) map.get("dataList");
            List<Map> titleList = (List<Map>) map.get("titleList");

            //创建excel
            XSSFWorkbook wb = new XSSFWorkbook();
            XSSFRow row = null;
            XSSFCell cell = null;
            // 创建新的sheet对象(excel的表单) 并设置sheet名字
            XSSFSheet sheet = wb.createSheet(map.get("name").toString());
            sheet.setDefaultRowHeightInPoints(20);
            sheet.setDefaultColumnWidth(12);

            XSSFCellStyle titleStyle = getTitleStyle(wb);

            XSSFCellStyle cellNoColorStyle = getNoColorStyle(wb);
            // ------------------处理数据/start---------------------
            //表头
            int rowNum = 0;
            List headTitles = new ArrayList();
            if (CollectionUtils.isNotEmpty(titleList)) {
                row = sheet.createRow(rowNum);
                XSSFRow rowSecondLevel = sheet.createRow(rowNum + 1);
                XSSFCell cellSecondLevel = null;
                int cellBegin = 0;
                int cellEnd = 0;
                for (int i = 0; i < titleList.size(); i++) {
                    Map titles = (Map) titleList.get(i);
                    if ("customerPositionClass.text".equals(titles.get("dataIndex"))) {

                        String title = (String) titles.get("title");
                        cell = row.createCell(i);
                        cell.setCellValue("" + title + "");
                        sheet.addMergedRegion(new CellRangeAddress(row.getRowNum(), row.getRowNum() + 1, i, i));
                        cell.setCellStyle(titleStyle);
                        cellBegin = cellBegin + 1;
                        headTitles.add(titles.get("dataIndex"));
                        cellSecondLevel = rowSecondLevel.createCell(i);
                        cellSecondLevel.setCellStyle(titleStyle);
                    } else if ("mercerPositionClass.text".equals(titles.get("dataIndex"))) {

                        String title = (String) titles.get("title");
                        cell = row.createCell(i);
                        cell.setCellValue("" + title + "");
                        sheet.addMergedRegion(new CellRangeAddress(row.getRowNum(), row.getRowNum() + 1, i, i));
                        cell.setCellStyle(titleStyle);
                        cellBegin = cellBegin + 1;
                        headTitles.add(titles.get("dataIndex"));
                        cellSecondLevel = rowSecondLevel.createCell(i);
                        cellSecondLevel.setCellStyle(titleStyle);
                    } else {
                        String title = (String) titles.get("title");
                        cell = row.createCell(cellBegin);
                        cell.setCellValue("" + title + "");
                        cell.setCellStyle(titleStyle);
                        List<Map> childrenList = (List<Map>) titles.get("children");
                        if (CollectionUtils.isNotEmpty(childrenList)) {
                            for (int j = 0; j < childrenList.size(); j++) {
                                String titleSecondLevel = (String) childrenList.get(j).get("title");
                                cell = rowSecondLevel.createCell(cellBegin + j);
                                cell.setCellValue("" + titleSecondLevel + "");
                                cell.setCellStyle(titleStyle);
                                headTitles.add((String) childrenList.get(j).get("dataIndex"));
                            }
                            if (childrenList.size() > 1) {
                                cellEnd = cellBegin + childrenList.size() - 1;
                                sheet.addMergedRegion(new CellRangeAddress(row.getRowNum(), row.getRowNum(), cellBegin, cellEnd));
                                cellBegin = cellEnd + 1;
                            } else {
                                cellBegin = cellBegin + 1;
                            }
                        }
                    }
                }
                rowNum = rowNum + 2;
                if (CollectionUtils.isNotEmpty(dataList)) {
                    for (int i = 0; i < dataList.size(); i++) {
                        row = sheet.createRow(rowNum);
                        Map dataMap = dataList.get(i);
                        for (int j = 0; j < headTitles.size(); j++) {
                            String key = headTitles.get(j).toString();
                            String data = (String) dataMap.get(key.substring(0, key.lastIndexOf(".")));
                            if (StringUtils.isBlank(data)) {
                                data = "";
                            }
                            cell = row.createCell(j);
                            cell.setCellValue("" + data + "");
                            cell.setCellStyle(cellNoColorStyle);
                        }
                        rowNum++;
                    }
                }
            }

            // ------------------处理数据end--------------------------------------

            wb.write(fout);
            fout.close();
        } catch (Exception e) {
            logger.debug("错误", e);
        } finally {

        }
        return excelPath;
    }

    public static XSSFCellStyle getTitleStyle(XSSFWorkbook wb) {
        //----------------表头格样式----------------------------------
        XSSFCellStyle titleStyle = wb.createCellStyle(); //表格样式
        titleStyle.setAlignment(HorizontalAlignment.CENTER);
        titleStyle.setVerticalAlignment(VerticalAlignment.CENTER);

        titleStyle.setBorderBottom(BorderStyle.THIN);//下边框  
        titleStyle.setBorderLeft(BorderStyle.THIN);//左边框  
        titleStyle.setBorderRight(BorderStyle.THIN);//右边框  
        titleStyle.setBorderTop(BorderStyle.THIN);//上边框

        titleStyle.setFillForegroundColor(new XSSFColor(new Color(135, 192, 178)));
        titleStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);

        Font ztFont = wb.createFont();
        ztFont.setItalic(false); // 设置字体为斜体字   
        //ztFont.setColor(HSSFColor.WHITE.index); // 设置字体颜色-白色  
        ztFont.setColor(Font.COLOR_NORMAL);
        ztFont.setFontHeightInPoints((short) 10); // 将字体大小设置为10px   
        ztFont.setFontName("宋体"); // 字体应用到当前单元格上   
        ztFont.setBold(true); //加粗
        titleStyle.setFont(ztFont);
        //titleStyle.setWrapText(true);//设置自动换行
        //----------------------------------------------------------
        return titleStyle;
    }

    public static XSSFCellStyle getEcharsStyle(XSSFWorkbook wb) {
        //----------------Echars格样式----------------------------------
        XSSFCellStyle echarsStyle = wb.createCellStyle(); //表格样式
        //echarsStyle.setAlignment(HorizontalAlignment.CENTER);
        //echarsStyle.setVerticalAlignment(VerticalAlignment.CENTER);

        Font echarsFont = wb.createFont();
        echarsFont.setItalic(false); // 设置字体为斜体字   
        echarsFont.setColor(Font.COLOR_NORMAL); // 设置字体颜色
        echarsFont.setFontHeightInPoints((short) 10); // 将字体大小设置为10px   
        echarsFont.setFontName("宋体"); // 字体应用到当前单元格上   
        echarsFont.setBold(false); //加粗
        echarsStyle.setFont(echarsFont);
        //echarsStyle.setWrapText(true);//设置自动换行
        //----------------------------------------------------------
        return echarsStyle;
    }

    public static XSSFCellStyle getNoColorStyle(XSSFWorkbook wb) {
        //----------------无色普通格样式----------------------------------
        XSSFCellStyle cellNoColorStyle = wb.createCellStyle();
        cellNoColorStyle.setAlignment(HorizontalAlignment.CENTER);
        cellNoColorStyle.setVerticalAlignment(VerticalAlignment.CENTER);

        cellNoColorStyle.setBorderBottom(BorderStyle.THIN);//下边框  
        cellNoColorStyle.setBorderLeft(BorderStyle.THIN);//左边框  
        cellNoColorStyle.setBorderRight(BorderStyle.THIN);//右边框  
        cellNoColorStyle.setBorderTop(BorderStyle.THIN);//上边框

        Font cellFont = wb.createFont();
        cellFont.setItalic(false); // 设置字体为斜体字   
        cellFont.setFontHeightInPoints((short) 10); // 将字体大小设置为9px   
        cellFont.setFontName("宋体"); // 字体应用到当前单元格上   
        cellNoColorStyle.setFont(cellFont);
        cellNoColorStyle.setWrapText(true);//设置自动换行
        //----------------------------------------------------------
        return cellNoColorStyle;
    }

    /**
     * 初始化 cell 内容长度
     * cell 原本内容长度限制 32767  现修改为Integer.MAX_VALUE
     * 未使用
    */
    public static void initCellMaxTextLength() {
        SpreadsheetVersion excel2007 = SpreadsheetVersion.EXCEL2007;
        if (Integer.MAX_VALUE != excel2007.getMaxTextLength()) {
            Field field;
            try {
                field = excel2007.getClass().getDeclaredField("_maxTextLength");
                field.setAccessible(true);
                field.set(excel2007, Integer.MAX_VALUE);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    /**
     * @Description: excel
     * @param <File>
     * @param <HashMap>
     * @Author:jlk
     * @CreateTime:2022-05-24
     */
    @SuppressWarnings("all")
    public static void exportExcelForPreviewCheck(HashMap map, HttpServletRequest request, HttpServletResponse response) throws IOException {
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");

        response.setHeader("Content-Disposition", "attachment;filename=" + java.net.URLEncoder.encode("方案预览校验表", "UTF-8"));

        OutputStream outs = response.getOutputStream();
        try {
            //获取数据源
            List<Map> columns = (List<Map>) map.get("columns");
            List<List<String>> data = (List<List<String>>) map.get("data");

            //创建excel
            HSSFWorkbook wb = new HSSFWorkbook();
            HSSFRow row = null;
            HSSFCell cell = null;
            // 创建新的sheet对象(excel的表单) 并设置sheet名字
            HSSFSheet sheet = wb.createSheet("方案预览校验");
            sheet.setDefaultRowHeightInPoints(20);
            sheet.setDefaultColumnWidth(14);


            HSSFCellStyle cellNoColorStyle = wb.createCellStyle();
            
            cellNoColorStyle.setAlignment(HorizontalAlignment.CENTER);
            cellNoColorStyle.setVerticalAlignment(VerticalAlignment.CENTER);

            cellNoColorStyle.setBorderBottom(BorderStyle.THIN);//下边框  
            cellNoColorStyle.setBorderLeft(BorderStyle.THIN);//左边框  
            cellNoColorStyle.setBorderRight(BorderStyle.THIN);//右边框  
            cellNoColorStyle.setBorderTop(BorderStyle.THIN);//上边框


            Font cellFont = wb.createFont();
            cellFont.setItalic(false); // 设置字体为斜体字   
            cellFont.setFontHeightInPoints((short) 10); // 将字体大小设置为9px   
            cellFont.setFontName("宋体"); // 字体应用到当前单元格上   
            cellNoColorStyle.setFont(cellFont);
            cellNoColorStyle.setWrapText(true);//设置自动换行
            // ------------------处理数据/start---------------------
            //表头
            int rowNum = 0;

            if (CollectionUtils.isNotEmpty(columns)) {
                row = sheet.createRow(rowNum);
                for (int i = 0; i < columns.size(); i++) {
                    Map column = columns.get(i);
                    cell = row.createCell(i);
                    cell.setCellValue("" + column.get("title") + "");
                    cell.setCellStyle(cellNoColorStyle);
                    
                }
                rowNum++;
            }
            if (CollectionUtils.isNotEmpty(data)) {
                for (int i = 0; i < data.size(); i++) {
                    row = sheet.createRow(rowNum);
                    List<String> cellData = data.get(i);
                    for (int j = 0; j < cellData.size(); j++) {
                        cell = row.createCell(j);
                        cell.setCellValue("" + cellData.get(j) + "");
                        cell.setCellStyle(cellNoColorStyle);
                    }
                    rowNum++;
                }
                
            }
            // ------------------处理数据end--------------------------------------

            wb.write(outs);
            outs.close();
        } catch (Exception e) {
            e.printStackTrace();
        } 
    
    }

    /**
     * @Description: 下载PPT
     * @param <map>
     * @param <HttpServletResponse>
     * @Author:jlk
     * @CreateTime:2022-05-24
     * @throws IOException
     */
    @SuppressWarnings("all")
    public static void downloadSchemeAnalysesPPT(String customerName, List<SchemeAnalysis> schemeAnalyses, HttpServletRequest request,
                                   HttpServletResponse response) throws IOException {

        String path = request.getSession().getServletContext().getRealPath("upload");
        String fileName = UUID.randomUUID().toString();
        File file = new File(path + File.separator + fileName);
        if (file.mkdirs()) {
            logger.debug("生成文件夹成功", file.toString());
        }
        response.reset();
        response.setContentType("application/zip");
        response.setCharacterEncoding("utf-8");
        response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");

        response.setHeader("Content-Disposition", "attachment;filename=" + java.net.URLEncoder.encode(customerName + "_分析图表_" + TimestampTool.getDate(new Date()), "UTF-8"));

        OutputStream outs = response.getOutputStream();

        //创建ppt
        XMLSlideShow ppt = new XMLSlideShow();
        File pptPath = new File(file + File.separator + customerName + "_分析图表_" + TimestampTool.getDate(new Date()) + ".pptx");
        Map<Integer, String> dataMap = new HashMap<>();
        FileOutputStream pptbaos = new FileOutputStream(pptPath);

        //创建excel
        XSSFWorkbook wb = new XSSFWorkbook();
        File excelPath = new File(file + File.separator + customerName + "_分析图表_" + TimestampTool.getDate(new Date()) + ".xlsx");
        FileOutputStream excelbaos = new FileOutputStream(excelPath);
        boolean isppt = false;
        boolean isexcel = false;
        try {
            for (int j = 0; j < schemeAnalyses.size(); j++) {

                String base64 = schemeAnalyses.get(j).getAnalysisImage();
                String data = schemeAnalyses.get(j).getAnalysisData();
                String name = schemeAnalyses.get(j).getAnalysisTopicName();
                if (StringUtils.isNotBlank(base64)) {
                    XSLFSlide slide = ppt.createSlide();

                    XSLFTextBox shape1 = slide.createTextBox();
                    Rectangle anchor = new Rectangle(30, 30, 300, 50);
                    shape1.setAnchor(anchor);
                    XSLFTextParagraph p1 = shape1.addNewTextParagraph();
                    XSLFTextRun r1 = p1.addNewTextRun();
                    r1.setFontSize(14.00);
                    r1.setFontColor(Color.black);
                    //shape1.setFillColor(Color.red);
                    r1.setText(name);

                    // 图片文件
                    String imgPathName = file.toString() + File.separator + schemeAnalyses.get(j).getAnalysisTopicName();
                    String imgPath = Base64Util.generateImage(base64, imgPathName);
                    File image = new File(imgPath);
                    //测试用本地图片
                    //File image = new File("E://plief.jpg");
                    // 图片文件输入流
                    FileInputStream imageFis = new FileInputStream(image);
                    // 获取图片大小
                    int len = (int) image.length();
                    // 创建一个字节数组,数组大小与图片文件大小一致
                    byte[] imageData = new byte[len];
                    // 将图片数据读进字节数组中
                    int pictureData = imageFis.read(imageData);
                    // 将图片添加到PPT中
                    XSLFPictureData pd = ppt.addPicture(imageData, PictureType.PNG);
                    // 将图片放到指定的幻灯片中
                    XSLFPictureShape pic = slide.createPicture(pd);
                    // 设置图片框的放置的位置和大小
                    pic.setAnchor(new Rectangle2D.Double(100, 160, 520, 200));
                    isppt = true;
                    imageFis.close();
                }
                if (StringUtils.isNotBlank(data)) {
                    JSONObject object = JSONObject.parseObject(data);
                    writeExcel(object, wb);
                    isexcel = true;
                }

            }
            ppt.write(pptbaos);
            wb.write(excelbaos);
            List<File> fileList = new ArrayList<>();
            if (isppt)
                fileList.add(pptPath);
            if (isexcel)
                fileList.add(excelPath);

            ZipUtils.toZip(fileList, outs);
        } catch (Exception e) {
            logger.debug("错误", e);
        } finally {
            pptbaos.flush();
            pptbaos.close();
            excelbaos.flush();
            excelbaos.close();
            outs.flush();
            outs.close();
            FileUtilsExt.delFile(file.toString());

        }
    }


}
    

zip 工具类

package com.sapit.compensation.common.util;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
 * ZipUtils
 * @author 	季连科
 * @date 	2022年5月23日 下午7:16:08
 * @version v1.0
 */
public class ZipUtils {
	
	private static final int  BUFFER_SIZE = 2 * 1024;
	
	/**
	 * 压缩成ZIP 方法1
	 * @param srcDir 压缩文件夹路径 
	 * @param out    压缩文件输出流
	 * @param KeepDirStructure  是否保留原来的目录结构,true:保留目录结构; 
	 * 							false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败)
	 * @throws RuntimeException 压缩失败会抛出运行时异常
	 */
	public static void toZip(String srcDir, OutputStream out, boolean KeepDirStructure)
			throws RuntimeException{
		
		long start = System.currentTimeMillis();
		ZipOutputStream zos = null ;
		try {
			zos = new ZipOutputStream(out);
			File sourceFile = new File(srcDir);
			compress(sourceFile,zos,sourceFile.getName(),KeepDirStructure);
			long end = System.currentTimeMillis();
			System.out.println("压缩完成,耗时:" + (end - start) +" ms");
		} catch (Exception e) {
			throw new RuntimeException("zip error from ZipUtils",e);
		}finally{
			if(zos != null){
				try {
					zos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		
	}
	
	/**
	 * 压缩成ZIP 方法2
	 * @param srcFiles 需要压缩的文件列表
	 * @param out 	        压缩文件输出流
	 * @throws RuntimeException 压缩失败会抛出运行时异常
	 */
	public static void toZip(List<File> srcFiles , OutputStream out)throws RuntimeException {
		long start = System.currentTimeMillis();
		ZipOutputStream zos = null ;
		try {
			zos = new ZipOutputStream(out);
			for (File srcFile : srcFiles) {
				byte[] buf = new byte[BUFFER_SIZE];
				zos.putNextEntry(new ZipEntry(srcFile.getName()));
				int len;
				FileInputStream in = new FileInputStream(srcFile);
				while ((len = in.read(buf)) != -1){
					zos.write(buf, 0, len);
				}
				zos.closeEntry();
				in.close();
			}
			long end = System.currentTimeMillis();
			System.out.println("压缩完成,耗时:" + (end - start) +" ms");
		} catch (Exception e) {
			throw new RuntimeException("zip error from ZipUtils",e);
		}finally{
			if(zos != null){
				try {
					zos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
	
	/**
	 * 递归压缩方法
	 * @param sourceFile 源文件
	 * @param zos		 zip输出流
	 * @param name		 压缩后的名称
	 * @param KeepDirStructure  是否保留原来的目录结构,true:保留目录结构; 
	 * 							false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败)
	 * @throws Exception
	 */
	private static void compress(File sourceFile, ZipOutputStream zos, String name,
			boolean KeepDirStructure) throws Exception{
		byte[] buf = new byte[BUFFER_SIZE];
		if(sourceFile.isFile()){
			// 向zip输出流中添加一个zip实体,构造器中name为zip实体的文件的名字
			zos.putNextEntry(new ZipEntry(name));
			// copy文件到zip输出流中
			int len;
			FileInputStream in = new FileInputStream(sourceFile);
			while ((len = in.read(buf)) != -1){
				zos.write(buf, 0, len);
			}
			// Complete the entry
			zos.closeEntry();
			in.close();
		} else {
			File[] listFiles = sourceFile.listFiles();
			if(listFiles == null || listFiles.length == 0){
				// 需要保留原来的文件结构时,需要对空文件夹进行处理
				if(KeepDirStructure){
					// 空文件夹的处理
					zos.putNextEntry(new ZipEntry(name + "/"));
					// 没有文件,不需要文件的copy
					zos.closeEntry();
				}
				
			}else {
				for (File file : listFiles) {
					// 判断是否需要保留原来的文件结构
					if (KeepDirStructure) {
						// 注意:file.getName()前面需要带上父文件夹的名字加一斜杠,
						// 不然最后压缩包中就不能保留原来的文件结构,即:所有文件都跑到压缩包根目录下了
						compress(file, zos, name + "/" + file.getName(),KeepDirStructure);
					} else {
						compress(file, zos, file.getName(),KeepDirStructure);
					}
					
				}
			}
		}
	}
	
	public static void main(String[] args) throws Exception {
		/** 测试压缩方法1  */
		FileOutputStream fos1 = new FileOutputStream(new File("c:/mytest01.zip"));
		ZipUtils.toZip("D:/log", fos1,true);
		
		/** 测试压缩方法2  */
		List<File> fileList = new ArrayList<>();
		fileList.add(new File("D:/Java/jdk1.7.0_45_64bit/bin/jar.exe"));
		fileList.add(new File("D:/Java/jdk1.7.0_45_64bit/bin/java.exe"));
		FileOutputStream fos2 = new FileOutputStream(new File("c:/mytest02.zip"));
		ZipUtils.toZip(fileList, fos2);
	}
	public static void zipFile(File inputFile, ZipOutputStream zipoutputStream) {
	    FileInputStream fis = null;
	    BufferedInputStream bis = null;
	    try {
	        if (inputFile.exists()) { // 判断文件是否存在
	            if (inputFile.isFile()) {  // 如果是文件
	                // 创建输入流读取文件
	                fis = new FileInputStream(inputFile);
	                bis = new BufferedInputStream(fis);
	                // 将文件写入zip压缩包内
	                ZipEntry zip =
	                        new ZipEntry(inputFile.getParentFile().getName() + File.separator + inputFile.getName()); //获取文件名
	                zipoutputStream.putNextEntry(zip);
	                // 进行写入文件
	                byte[] bytes = new byte[1024];
	                long fileLength = 0;
	                while (fileLength < inputFile.length()) {
	                    int count = bis.read(bytes, 0, 1024);
	                    fileLength += count;
	                    zipoutputStream.write(bytes, 0, count);
	                }
	                // 关闭输入输出流
	                if (bis != null) {
	                    bis.close();
	                }
	                if (fis != null) {
	                    fis.close();
	                }
	            } else {  // 如果是文件夹,则使用穷举的方法获取文件,写入zip
	                try {
	                    zipoutputStream.putNextEntry(new ZipEntry(inputFile.getName() + File.separator));
	                    File[] files = inputFile.listFiles();
	                    for (int i = 0; i < files.length; i++) {
	                        zipFile(files[i], zipoutputStream);
	                    }
	                } catch (Exception e) {
	                    e.printStackTrace();
	                }
	            }
	        }
	    } catch (Exception e) {
	        e.printStackTrace();
	    } finally {
	        try {
	            if (bis != null) {
	                bis.close();
	            }
	            if (fis != null) {
	                fis.close();
	            }
	        } catch (IOException e) {
	            e.printStackTrace();
	        }
	    }
	}
}

base64转码工具类

package com.sapit.compensation.common.util;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Base64;

import org.apache.commons.lang3.StringUtils;


/**
 * <p>文件名称: Base64Util.java </p> 
 * <p>类型描述: [base64处理工具] </p>
 * <p>创建时间: 2022年5月23日 </p>
 * @author jlk
 * @version V1.0
 */
public class Base64Util {

	/**
	 * <p>功能描述: [解码] </p>
	 * @Title decode
	 * @param str base64编码
	 * @return byte[]
	 */
	public static byte[] decode(String str) {
		return Base64.getDecoder().decode(str);
	}

	/**
	 * <p>功能描述: [编码] </p>
	 * @Title encode
	 * @param bytes 需要转换的bytes.
	 * @return String
	 */
	public static String encode(byte[] bytes) {
		return Base64.getEncoder().encodeToString(bytes);
	}

	/**
	 * <p>功能描述: [将base64转成文件] </p>
	 * @Title toFile
	 * @param str
	 * @param filePath
	 * @return boolean
	 */
	public static boolean toFile(String str, String filePath) {
		if (StringUtils.isEmpty(str)||StringUtils.isEmpty(filePath)) {
			return false;
		}
		OutputStream out=null;
		try {
			// Base64解码
			byte[] b = decode(str);
			for (int i = 0; i < b.length; ++i) {
				// 调整异常数据
				if (b[i] < 0) {
					b[i] += 256;
				}
			}
			// 生成jpeg图片
			File file = new File(filePath);
			if (!file.getParentFile().exists()) {
				file.getParentFile().mkdirs();
			}
			out = new FileOutputStream(file);
			out.write(b);
			out.flush();
			return true;
		} catch (Exception e) {
			return false;
		}finally {
			if(out!=null) {
				try {
					out.close();
				} catch (IOException e) {
				}
			}
		}
	}
	
	/**
     * @Description: 将base64编码字符串转换为图片
     * @Author:
     * @CreateTime:
     * @param file base64编码字符串
     * @param path 图片路径-具体到文件
     * @return
	 * @throws IOException 
     */
    public static String generateImage(String file, String path) throws IOException {
        // 解密
        OutputStream out = null;
        try {
            // 项目绝对路径
            // 图片分类路径+图片名+图片后缀
            String imgClassPath = path.concat(".jpg");
            // 解密
            Base64.Decoder decoder = Base64.getDecoder();
            // 去掉base64前缀 data:image/jpeg;base64,
            file = file.substring(file.indexOf(",", 1) + 1, file.length());
            byte[] b = decoder.decode(file);
            // 处理数据
            for (int i = 0; i < b.length; ++i) {
                if (b[i] < 0) {
                    b[i] += 256;
                }
            }
            // 保存图片
            out = new FileOutputStream(imgClassPath);
            out.write(b);
            
            // 返回图片的相对路径 = 图片分类路径+图片名+图片后缀
            return imgClassPath;
        } catch (IOException e) {
            return null;
        }finally {
            out.flush();
            out.close();
        }
    }

}

文件工具类

package com.sapit.compensation.common.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.common.collect.Lists;

/**
 * 文件操作工具类 实现文件的创建、删除、复制、压缩、解压以及目录的创建、删除、复制、压缩解压等功能
 *
 * @author aoyuan
 * @version 2015-3-16
 */
public class FileUtilsExt extends org.apache.commons.io.FileUtils {

    private static final String HTML = "html";
    private static final String HTM = "htm";
    private static final String SHTML = "shtml";
    private static final String APK = "apk";
    private static final String SIS = "sis";
    private static final String SISX = "sisx";
    private static final String EXE = "exe";
    private static final String MSI = "msi";
    private static final String CSS = "css";
    private static final String XML = "xml";
    private static final String GIF = "gif";
    private static final String JPEG = "jpeg";
    private static final String JPG = "jpg";
    private static final String JS = "js";
    private static final String ATOM = "atom";
    private static final String RSS = "rss";
    private static final String MML = "mml";
    private static final String TXT = "txt";
    private static final String JAD = "jad";
    private static final String WML = "wml";
    private static final String HTC = "htc";
    private static final String PNG = "png";
    private static final String TIF = "tif";
    private static final String TIFF = "tiff";
    private static final String WBMP = "wbmp";
    private static final String ICO = "ico";
    private static final String JNG = "jng";
    private static final String BMP = "bmp";
    private static final String SVG = "svg";
    private static final String JAR = "jar";
    private static final String VAR = "var";
    private static final String EAR = "ear";
    private static final String DOC = "doc";
    private static final String PDF = "pdf";
    private static final String RTF = "rtf";
    private static final String XLS = "xls";
    private static final String PPT = "ppt";
    private static final String SEVEN_Z = "7z";
    private static final String RAR = "rar";
    private static final String SWF = "swf";
    private static final String RPM = "rpm";
    private static final String DER = "der";
    private static final String PEM = "pem";
    private static final String CRT = "crt";
    private static final String XHTML = "xhtml";
    private static final String ZIP = "zip";
    private static final String MID = "mid";
    private static final String MIDI = "midi";
    private static final String KAR = "kar";
    private static final String MP3 = "mp3";
    private static final String OGG = "ogg";
    private static final String M4A = "m4a";
    private static final String RA = "ra";
    private static final String THREE_GPP = "3gpp";
    private static final String THREE_GP = "3gp";
    private static final String MP4 = "mp4";
    private static final String MPEG = "mpeg";
    private static final String MPG = "mpg";
    private static final String MOV = "mov";
    private static final String FLV = "flv";
    private static final String M4V = "m4v";
    private static final String MNG = "pem";
    private static final String ASX = "asx";
    private static final String ASF = "asf";
    private static final String WMV = "wmv";
    private static final String AVI = "avi";
    private static Logger logger = LoggerFactory.getLogger(com.sapit.compensation.common.util.FileUtilsExt.class);

    /**
     * 复制单个文件,如果目标文件存在,则不覆盖
     *
     * @param srcFileName  待复制的文件名
     * @param descFileName 目标文件名
     * @return 如果复制成功,则返回true,否则返回false
     */
    public static boolean copyFile(String srcFileName, String descFileName) {
        return com.sapit.compensation.common.util.FileUtilsExt.copyFileCover(srcFileName, descFileName, false);
    }

    /**
     * 复制单个文件
     *
     * @param srcFileName  待复制的文件名
     * @param descFileName 目标文件名
     * @param coverlay     如果目标文件已存在,是否覆盖
     * @return 如果复制成功,则返回true,否则返回false
     */
    public static boolean copyFileCover(String srcFileName, String descFileName, boolean coverlay) {
        File srcFile = new File(srcFileName);
        // 判断源文件是否存在
        if (!srcFile.exists()) {
            logger.debug("复制文件失败,源文件 {} 不存在!", srcFileName);
            return false;
        }
        // 判断源文件是否是合法的文件
        else if (!srcFile.isFile()) {
            logger.debug("复制文件失败,{} 不是一个文件!", srcFileName);
            return false;
        }
        File descFile = new File(descFileName);
        // 判断目标文件是否存在
        if (descFile.exists()) {
            // 如果目标文件存在,并且允许覆盖
            if (coverlay) {
                logger.debug("目标文件已存在,准备删除!");
                if (!com.sapit.compensation.common.util.FileUtilsExt.delFile(descFileName)) {
                    logger.debug("删除目标文件 {} 失败!", descFileName);
                    return false;
                }
            } else {
                logger.debug("复制文件失败,目标文件{} 已存在!", descFileName);
                return false;
            }
        } else {
            if (!descFile.getParentFile().exists()) {
                // 如果目标文件所在的目录不存在,则创建目录
                logger.debug("目标文件所在的目录不存在,创建目录!");
                // 创建目标文件所在的目录
                if (!descFile.getParentFile().mkdirs()) {
                    logger.debug("创建目标文件所在的目录失败!");
                    return false;
                }
            }
        }

        // 准备复制文件
        // 读取的位数
        int readByte = 0;
        InputStream ins = null;
        OutputStream outs = null;
        try {
            // 打开源文件
            ins = new FileInputStream(srcFile);
            // 打开目标文件的输出流
            outs = new FileOutputStream(descFile);
            byte[] buf = new byte[1024];
            // 一次读取1024个字节,当readByte为-1时表示文件已经读取完毕
            while ((readByte = ins.read(buf)) != -1) {
                // 将读取的字节流写入到输出流
                outs.write(buf, 0, readByte);
            }
            logger.info("复制单个文件{} 到 {} 成功!", srcFileName, descFileName);
            return true;
        } catch (Exception e) {
            logger.info("复制文件失败:{}", e.getMessage());
            return false;
        } finally {
            // 关闭输入输出流,首先关闭输出流,然后再关闭输入流
            if (outs != null) {
                try {
                    outs.close();
                } catch (IOException oute) {
                    logger.info(oute.getMessage());
                }
            }
            if (ins != null) {
                try {
                    ins.close();
                } catch (IOException ine) {
                    logger.info(ine.getMessage());
                }
            }
        }
    }

    /**
     * 复制整个目录的内容,如果目标目录存在,则不覆盖
     *
     * @param srcDirName  源目录名
     * @param descDirName 目标目录名
     * @return 如果复制成功返回true,否则返回false
     */
    public static boolean copyDirectory(String srcDirName, String descDirName) {
        return com.sapit.compensation.common.util.FileUtilsExt.copyDirectoryCover(srcDirName, descDirName, false);
    }

    /**
     * 复制整个目录的内容
     *
     * @param srcDirName  源目录名
     * @param descDirName 目标目录名
     * @param coverlay    如果目标目录存在,是否覆盖
     * @return 如果复制成功返回true,否则返回false
     */
    public static boolean copyDirectoryCover(String srcDirName, String descDirName, boolean coverlay) {
        File srcDir = new File(srcDirName);
        // 判断源目录是否存在
        if (!srcDir.exists()) {
            logger.debug("复制目录失败,源目录 {} 不存在!", srcDirName);
            return false;
        }
        // 判断源目录是否是目录
        else if (!srcDir.isDirectory()) {
            logger.debug("复制目录失败,{} 不是一个目录!", srcDirName);
            return false;
        }
        // 如果目标文件夹名不以文件分隔符结尾,自动添加文件分隔符
        String descDirNames = descDirName;
        if (!descDirNames.endsWith(File.separator)) {
            descDirNames = descDirNames + File.separator;
        }
        File descDir = new File(descDirNames);
        // 如果目标文件夹存在
        if (descDir.exists()) {
            if (coverlay) {
                // 允许覆盖目标目录
                logger.debug("目标目录已存在,准备删除!");
                if (!com.sapit.compensation.common.util.FileUtilsExt.delFile(descDirNames)) {
                    logger.debug("删除目录 {} 失败!", descDirNames);
                    return false;
                }
            } else {
                logger.debug("目标目录复制失败,目标目录 {} 已存在!", descDirNames);
                return false;
            }
        } else {
            // 创建目标目录
            logger.debug("目标目录不存在,准备创建!");
            if (!descDir.mkdirs()) {
                logger.debug("创建目标目录失败!");
                return false;
            }

        }

        boolean flag = true;
        // 列出源目录下的所有文件名和子目录名
        File[] files = srcDir.listFiles();
        for (int i = 0; i < files.length; i++) {
            // 如果是一个单个文件,则直接复制
            if (files[i].isFile()) {
                flag = com.sapit.compensation.common.util.FileUtilsExt.copyFile(files[i].getAbsolutePath(), descDirName + files[i].getName());
                // 如果拷贝文件失败,则退出循环
                if (!flag) {
                    break;
                }
            }
            // 如果是子目录,则继续复制目录
            if (files[i].isDirectory()) {
                flag = com.sapit.compensation.common.util.FileUtilsExt.copyDirectory(files[i].getAbsolutePath(), descDirName + files[i].getName());
                // 如果拷贝目录失败,则退出循环
                if (!flag) {
                    break;
                }
            }
        }

        if (!flag) {
            logger.debug("复制目录 {} 到 {} 失败!", srcDirName, descDirName);
            return false;
        }
        logger.debug("复制目录 {} 到 {} 成功!", srcDirName, descDirName);
        return true;

    }

    /**
     * 删除文件,可以删除单个文件或文件夹
     *
     * @param fileName 被删除的文件名
     * @return 如果删除成功,则返回true,否是返回false
     */
    public static boolean delFile(String fileName) {
        File file = new File(fileName);
        if (!file.exists()) {
            logger.debug("{} 文件不存在!", fileName);
            return true;
        } else {
            if (file.isFile()) {
                return com.sapit.compensation.common.util.FileUtilsExt.deleteFile(fileName);
            } else {
                return com.sapit.compensation.common.util.FileUtilsExt.deleteDirectory(fileName);
            }
        }
    }

    /**
     * 删除单个文件
     *
     * @param fileName 被删除的文件名
     * @return 如果删除成功,则返回true,否则返回false
     */
    public static boolean deleteFile(String fileName) {
        File file = new File(fileName);
        if (file.exists() && file.isFile()) {
            if (file.delete()) {
                logger.debug("删除文件 {} 成功!", fileName);
                return true;
            } else {
                logger.debug("删除文件 {} 失败!", fileName);
                return false;
            }
        } else {
            logger.debug("{} 文件不存在!", fileName);
            return true;
        }
    }

    /**
     * 删除目录及目录下的文件
     *
     * @param dirName 被删除的目录所在的文件路径
     * @return 如果目录删除成功,则返回true,否则返回false
     */
    public static boolean deleteDirectory(String dirName) {
        String dirNames = dirName;
        if (!dirNames.endsWith(File.separator)) {
            dirNames = dirNames + File.separator;
        }
        File dirFile = new File(dirNames);
        if (!dirFile.exists() || !dirFile.isDirectory()) {
            logger.debug("{} 目录不存在!", dirNames);
            return true;
        }
        boolean flag = true;
        // 列出全部文件及子目录
        File[] files = dirFile.listFiles();
        for (int i = 0; i < files.length; i++) {
            // 删除子文件
            if (files[i].isFile()) {
                flag = com.sapit.compensation.common.util.FileUtilsExt.deleteFile(files[i].getAbsolutePath());
                // 如果删除文件失败,则退出循环
                if (!flag) {
                    break;
                }
            }
            // 删除子目录
            else if (files[i].isDirectory()) {
                flag = com.sapit.compensation.common.util.FileUtilsExt.deleteDirectory(files[i].getAbsolutePath());
                // 如果删除子目录失败,则退出循环
                if (!flag) {
                    break;
                }
            }
        }

        if (!flag) {
            logger.debug("删除目录失败!");
            return false;
        }
        // 删除当前目录
        if (dirFile.delete()) {
            logger.debug("删除目录 {} 成功!", dirName);
            return true;
        } else {
            logger.debug("删除目录 {} 失败!", dirName);
            return false;
        }

    }

    /**
     * 创建单个文件
     *
     * @param descFileName 文件名,包含路径
     * @return 如果创建成功,则返回true,否则返回false
     */
    public static boolean createFile(String descFileName) {
        File file = new File(descFileName);
        if (file.exists()) {
            logger.debug("文件{} 已存在!", descFileName);
            return false;
        }
        if (descFileName.endsWith(File.separator)) {
            logger.debug("{} 为目录,不能创建目录!", descFileName);
            return false;
        }
        if (!file.getParentFile().exists() && !file.getParentFile().mkdirs()) {
            // 如果文件所在的目录不存在,则创建目录
            logger.debug("创建文件所在的目录失败!");
            return false;
        }

        // 创建文件
        try {
            if (file.createNewFile()) {
                logger.debug("{} 文件创建成功!", descFileName);
                return true;
            } else {
                logger.info("{} 文件创建失败!", descFileName);
                return false;
            }
        } catch (Exception e) {
            logger.info("{} 文件创建失败!", descFileName);
            return false;
        }

    }

    /**
     * 创建目录
     *
     * @param descDirName 目录名,包含路径
     * @return 如果创建成功,则返回true,否则返回false
     */
    public static boolean createDirectory(String descDirName) {
        String descDirNames = descDirName;
        if (!descDirNames.endsWith(File.separator)) {
            descDirNames = descDirNames + File.separator;
        }
        File descDir = new File(descDirNames);
        if (descDir.exists()) {
            logger.debug("目录 {} 已存在!", descDirNames);
            return false;
        }
        // 创建目录
        if (descDir.mkdirs()) {
            logger.debug("目录  {} 创建成功!", descDirNames);
            return true;
        } else {
            logger.debug("目录  {} 创建失败!", descDirNames);
            return false;
        }

    }

    /**
     * 写入文件
     *
     * @param fileName
     * @param content
     * @param append
     */
    public static void writeToFile(String fileName, String content, boolean append) {
        try {
            org.apache.commons.io.FileUtils.write(new File(fileName), content, "utf-8", append);
            logger.debug("文件  {} 写入成功!", fileName);
        } catch (IOException e) {
            logger.info("文件  {} 写入失败!  {}", fileName, e.getMessage());
        }
    }

    /**
     * 写入文件
     *
     * @param fileName
     * @param content
     * @param encoding
     * @param append
     */
    public static void writeToFile(String fileName, String content, String encoding, boolean append) {
        try {
            org.apache.commons.io.FileUtils.write(new File(fileName), content, encoding, append);
            logger.debug("文件  {} 写入成功!", fileName);
        } catch (IOException e) {
            logger.info("文件  {} 写入失败! {}", fileName, e.getMessage());
        }
    }

    /**
     * 压缩文件或目录
     *
     * @param srcDirName   压缩的根目录
     * @param fileName     根目录下的待压缩的文件名或文件夹名,其中*或""表示跟目录下的全部文件
     * @param descFileName 目标zip文件
     */
    public static void zipFiles(String srcDirName, String fileName, String descFileName) {
        // 判断目录是否存在
        if (srcDirName == null) {
            logger.debug("文件压缩失败,目录  {} 不存在! ", srcDirName);
            return;
        }
        File fileDir = new File(srcDirName);
        if (!fileDir.exists() || !fileDir.isDirectory()) {
            logger.debug("文件压缩失败,目录  {} 不存在! ", srcDirName);
            return;
        }
        String dirPath = fileDir.getAbsolutePath();
        File descFile = new File(descFileName);
        FileOutputStream fos = null;
        ZipOutputStream zouts = null;
        try {
            fos = new FileOutputStream(descFile);
            zouts = new ZipOutputStream(fos);
            if ("*".equals(fileName) || "".equals(fileName)) {
                com.sapit.compensation.common.util.FileUtilsExt.zipDirectoryToZipFile(dirPath, fileDir, zouts);
            } else {
                File file = new File(fileDir, fileName);
                if (file.isFile()) {
                    com.sapit.compensation.common.util.FileUtilsExt.zipFilesToZipFile(dirPath, file, zouts);
                } else {
                    com.sapit.compensation.common.util.FileUtilsExt.zipDirectoryToZipFile(dirPath, file, zouts);
                }
            }

            logger.debug("{} 文件压缩成功!", descFileName);
        } catch (Exception e) {
            logger.info("文件压缩失败: {}", e.getMessage());
        } finally {
            IOUtils.closeQuietly(fos);
            IOUtils.closeQuietly(zouts);
        }

    }

    /**
     * 将目录压缩到ZIP输出流
     *
     * @param dirPath 目录路径
     * @param fileDir 文件信息
     * @param zouts   输出流
     */
    public static void zipDirectoryToZipFile(String dirPath, File fileDir, ZipOutputStream zouts) {
        if (fileDir.isDirectory()) {
            File[] files = fileDir.listFiles();
            // 空的文件夹
            if (files.length == 0) {
                // 目录信息
                ZipEntry entry = new ZipEntry(getEntryName(dirPath, fileDir));
                try {
                    zouts.putNextEntry(entry);
                    zouts.closeEntry();
                } catch (Exception e) {
                    logger.info("异常", e);
                }
                return;
            }

            for (int i = 0; i < files.length; i++) {
                if (files[i].isFile()) {
                    // 如果是文件,则调用文件压缩方法
                    com.sapit.compensation.common.util.FileUtilsExt.zipFilesToZipFile(dirPath, files[i], zouts);
                } else {
                    // 如果是目录,则递归调用
                    com.sapit.compensation.common.util.FileUtilsExt.zipDirectoryToZipFile(dirPath, files[i], zouts);
                }
            }
        }
    }

    /**
     * 将文件压缩到ZIP输出流
     *
     * @param dirPath 目录路径
     * @param file    文件
     * @param zouts   输出流
     */
    public static void zipFilesToZipFile(String dirPath, File file, ZipOutputStream zouts) {
        FileInputStream fin = null;
        ZipEntry entry;
        // 创建复制缓冲区
        byte[] buf = new byte[4096];
        int readByte;
        if (file.isFile()) {
            try {
                // 创建一个文件输入流
                fin = new FileInputStream(file);
                // 创建一个ZipEntry
                entry = new ZipEntry(getEntryName(dirPath, file));
                // 存储信息到压缩文件
                zouts.putNextEntry(entry);
                // 复制字节到压缩文件
                while ((readByte = fin.read(buf)) != -1) {
                    zouts.write(buf, 0, readByte);
                }
                zouts.closeEntry();
                fin.close();
                logger.info("添加文件{} 到zip文件中!", file.getAbsolutePath());
            } catch (Exception e) {
                logger.info("异常", e);
            } finally {
                IOUtils.closeQuietly(fin);
            }
        }
    }

    /**
     * 获取待压缩文件在ZIP文件中entry的名字,即相对于跟目录的相对路径名
     *
     * @param dirPath 目录名
     * @param file    entry文件名
     * @return
     */
    private static String getEntryName(String dirPath, File file) {
        String dirPaths = dirPath;
        if (!dirPaths.endsWith(File.separator)) {
            dirPaths = dirPaths + File.separator;
        }
        String filePath = file.getAbsolutePath();
        // 对于目录,必须在entry名字后面加上"/",表示它将以目录项存储
        if (file.isDirectory()) {
            filePath += "/";
        }
        int index = filePath.indexOf(dirPaths);

        return filePath.substring(index + dirPaths.length());
    }

    /**
     * 根据“文件名的后缀”获取文件内容类型(而非根据File.getContentType()读取的文件类型)
     *
     * @param returnFileName 带验证的文件名
     * @return 返回文件类型
     */

    public static String getContentType(String returnFileName) {
        String contentType = "application/octet-stream";
        if (returnFileName.lastIndexOf('.') < 0) {
            return contentType;
        }
        returnFileName = returnFileName.toLowerCase();
        returnFileName = returnFileName.substring(returnFileName.lastIndexOf('.') + 1);
        if (returnFileName.equals(HTML) || returnFileName.equals(HTM) || returnFileName.equals(SHTML)) {
            contentType = "text/html";
        } else if (returnFileName.equals(APK)) {
            contentType = "application/vnd.android.package-archive";
        } else if (returnFileName.equals(SIS) || returnFileName.equals(SISX)) {
            contentType = "application/vnd.symbian.install";
        } else if (returnFileName.equals(EXE) || returnFileName.equals(MSI)) {
            contentType = "application/x-msdownload";
        } else if (returnFileName.equals(CSS)) {
            contentType = "text/css";
        } else if (returnFileName.equals(XML)) {
            contentType = "text/xml";
        } else if (returnFileName.equals(GIF)) {
            contentType = "image/gif";
        } else if (returnFileName.equals(JPEG) || returnFileName.equals(JPG)) {
            contentType = "image/jpeg";
        } else if (returnFileName.equals(JS)) {
            contentType = "application/x-javascript";
        } else if (returnFileName.equals(ATOM)) {
            contentType = "application/atom+xml";
        } else if (returnFileName.equals(RSS)) {
            contentType = "application/rss+xml";
        } else if (returnFileName.equals(MML)) {
            contentType = "text/mathml";
        } else if (returnFileName.equals(TXT)) {
            contentType = "text/plain";
        } else if (returnFileName.equals(JAD)) {
            contentType = "text/vnd.sun.j2me.app-descriptor";
        } else if (returnFileName.equals(WML)) {
            contentType = "text/vnd.wap.wml";
        } else if (returnFileName.equals(HTC)) {
            contentType = "text/x-component";
        } else if (returnFileName.equals(PNG)) {
            contentType = "image/png";
        } else if (returnFileName.equals(TIF) || returnFileName.equals(TIFF)) {
            contentType = "image/tiff";
        } else if (returnFileName.equals(WBMP)) {
            contentType = "image/vnd.wap.wbmp";
        } else if (returnFileName.equals(ICO)) {
            contentType = "image/x-icon";
        } else if (returnFileName.equals(JNG)) {
            contentType = "image/x-jng";
        } else if (returnFileName.equals(BMP)) {
            contentType = "image/x-ms-bmp";
        } else if (returnFileName.equals(SVG)) {
            contentType = "image/svg+xml";
        } else if (returnFileName.equals(JAR) || returnFileName.equals(VAR) || returnFileName.equals(EAR)) {
            contentType = "application/java-archive";
        } else if (returnFileName.equals(DOC)) {
            contentType = "application/msword";
        } else if (returnFileName.equals(PDF)) {
            contentType = "application/pdf";
        } else if (returnFileName.equals(RTF)) {
            contentType = "application/rtf";
        } else if (returnFileName.equals(XLS)) {
            contentType = "application/vnd.ms-excel";
        } else if (returnFileName.equals(PPT)) {
            contentType = "application/vnd.ms-powerpoint";
        } else if (returnFileName.equals(SEVEN_Z)) {
            contentType = "application/x-7z-compressed";
        } else if (returnFileName.equals(RAR)) {
            contentType = "application/x-rar-compressed";
        } else if (returnFileName.equals(SWF)) {
            contentType = "application/x-shockwave-flash";
        } else if (returnFileName.equals(RPM)) {
            contentType = "application/x-redhat-package-manager";
        } else if (returnFileName.equals(DER) || returnFileName.equals(PEM) || returnFileName.equals(CRT)) {
            contentType = "application/x-x509-ca-cert";
        } else if (returnFileName.equals(XHTML)) {
            contentType = "application/xhtml+xml";
        } else if (returnFileName.equals(ZIP)) {
            contentType = "application/zip";
        } else if (returnFileName.equals(MID) || returnFileName.equals(MIDI) || returnFileName.equals(KAR)) {
            contentType = "audio/midi";
        } else if (returnFileName.equals(MP3)) {
            contentType = "audio/mpeg";
        } else if (returnFileName.equals(OGG)) {
            contentType = "audio/ogg";
        } else if (returnFileName.equals(M4A)) {
            contentType = "audio/x-m4a";
        } else if (returnFileName.equals(RA)) {
            contentType = "audio/x-realaudio";
        } else if (returnFileName.equals(THREE_GPP) || returnFileName.equals(THREE_GP)) {
            contentType = "video/3gpp";
        } else if (returnFileName.equals(MP4)) {
            contentType = "video/mp4";
        } else if (returnFileName.equals(MPEG) || returnFileName.equals(MPG)) {
            contentType = "video/mpeg";
        } else if (returnFileName.equals(MOV)) {
            contentType = "video/quicktime";
        } else if (returnFileName.equals(FLV)) {
            contentType = "video/x-flv";
        } else if (returnFileName.equals(M4V)) {
            contentType = "video/x-m4v";
        } else if (returnFileName.equals(MNG)) {
            contentType = "video/x-mng";
        } else if (returnFileName.equals(ASX) || returnFileName.equals(ASF)) {
            contentType = "video/x-ms-asf";
        } else if (returnFileName.equals(WMV)) {
            contentType = "video/x-ms-wmv";
        } else if (returnFileName.equals(AVI)) {
            contentType = "video/x-msvideo";
        }
        return contentType;
    }

    /**
     * 修正路径,将 \\ 或 / 等替换为 File.separator
     *
     * @param path 待修正的路径
     * @return 修正后的路径
     */
    public static String path(String path) {
        String p = org.apache.commons.lang3.StringUtils.replace(path, "\\", "/");
        p = org.apache.commons.lang3.StringUtils.join(org.apache.commons.lang3.StringUtils.split(p, "/"), "/");
        if (!org.apache.commons.lang3.StringUtils.startsWithAny(p, "/") && org.apache.commons.lang3.StringUtils.startsWithAny(path, "\\", "/")) {
            p += "/";
        }
        if (!org.apache.commons.lang3.StringUtils.endsWithAny(p, "/") && org.apache.commons.lang3.StringUtils.endsWithAny(path, "\\", "/")) {
            p = p + "/";
        }
        if (path != null && path.startsWith("/")) {
            p = "/" + p; // linux下路径
        }
        return p;
    }

    /**
     * 获目录下的文件列表
     *
     * @param dir        搜索目录
     * @param searchDirs 是否是搜索目录
     * @return 文件列表
     */
    public static List<String> findChildrenList(File dir, boolean searchDirs) {
        List<String> files = Lists.newArrayList();
        for (String subFiles : dir.list()) {
            File file = new File(dir, subFiles);
            if (((searchDirs) && (file.isDirectory())) || ((!searchDirs) && (!file.isDirectory()))) {
                files.add(file.getName());
            }
        }
        return files;
    }

    /**
     * 获取文件扩展名(返回小写)
     *
     * @param fileName 文件名
     * @return 例如:test.jpg 返回: jpg
     */
    public static String getFileExtension(String fileName) {
        if ((fileName == null) || (fileName.lastIndexOf('.') == -1) || (fileName.lastIndexOf('.') == fileName.length() - 1)) {
            return null;
        }
        return org.apache.commons.lang3.StringUtils.lowerCase(fileName.substring(fileName.lastIndexOf('.') + 1));
    }

    /**
     * 获取文件名,不包含扩展名
     *
     * @param fileName 文件名
     * @return 例如:d:\files\test.jpg 返回:d:\files\test
     */
    public static String getFileNameWithoutExtension(String fileName) {
        if ((fileName == null) || (fileName.lastIndexOf('.') == -1)) {
            return null;
        }
        return fileName.substring(0, fileName.lastIndexOf('.'));
    }
    /**
     * <p>功能描述: [自动创建多层目录] </p>
     * @Title mkdirs
     * @param destPath
     */
    public static void mkdirs(String destPath) {
        File file = new File(destPath);
        // 当文件夹不存在时,mkdirs会自动创建多层目录,区别于mkdir.(mkdir如果父目录不存在则会抛出异常)
        if (!file.exists() && !file.isDirectory()) {
            file.mkdirs();
        }
    }
}

时间戳工具类


package com.sapit.compensation.common.util;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public final class TimestampTool {
    private static String formatter = "yyyy-MM-dd";

    private static Logger logger = LoggerFactory.getLogger(TimestampTool.class);

    private TimestampTool() {
        throw new IllegalStateException("Utility class");
    }

    // 当前时间
    public static Timestamp crunttime() {

        return new Timestamp(System.currentTimeMillis());
    }

    // 获取当前时间的字符串 2006-07-07
    public static String getCurrentDate() {

        Timestamp d = crunttime();
        return d.toString().substring(0, 10);
    }

    // 获取当前时间的字符串 2006-07-07 22:10:10
    public static String getCurrentDateTime() {

        Timestamp d = crunttime();
        return d.toString().substring(0, 19);
    }

    // 获取给定时间的字符串,只有日期 2006-07-07
    public static String getStrDate(Timestamp t) {
        return t.toString().substring(0, 10);
    }

    // 获取给定时间的字符串,只有日期 20060707
    public static String getStringDate() {
        Timestamp t = crunttime();
        return t.toString().substring(0, 10).replace("-", "");
    }

    // 获取给定时间的字符串 2006-07-07 22:10:10
    public static String getStrDateTime(Timestamp t) {
        return t.toString().substring(0, 19);
    }

    // 获取当前日期之前的日期字符串 如 2007-04-15 前5月 就是 2006-11-15
    public static String getPreviousMonth(int month) {
        Calendar cal1 = Calendar.getInstance();
        cal1.setTime(new Date());
        cal1.add(Calendar.MONTH, -month);
        SimpleDateFormat format = new SimpleDateFormat(formatter);
        return format.format(cal1.getTime());
    }

    public static String getPreviousMonth(int month, String format) {
        Calendar cal1 = Calendar.getInstance();
        cal1.setTime(new Date());
        cal1.add(Calendar.MONTH, -month);
        SimpleDateFormat formatter = new SimpleDateFormat(format);
        return formatter.format(cal1.getTime());
    }

    public static String getPreviousMonth(Date date, int month) {
        Calendar cal1 = Calendar.getInstance();
        cal1.setTime(date);
        cal1.add(Calendar.MONTH, -month);
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return formatter.format(cal1.getTime());
    }

    /**
     * 日期月份加减
     *
     * @param date  Date
     * @param month 正数:向前推xxx个月,负数:向后推xxx个月
     * @return Date
     * @author YJH
     */
    public static Date getPreviousMonthReturnDate(Date date, int month) {
        Calendar cal1 = Calendar.getInstance();
        cal1.setTime(date);
        cal1.add(Calendar.MONTH, -month);
        return cal1.getTime();
    }

    public static String getPreviousMonth(Date date, int month, String format) {
        Calendar cal1 = Calendar.getInstance();
        cal1.setTime(date);
        cal1.add(Calendar.MONTH, -month);
        SimpleDateFormat formatter = new SimpleDateFormat(format);
        return formatter.format(cal1.getTime());
    }

    // 获取当前日期之后的日期字符串 如 2007-04-15 后一天 就是 2007-04-16
    public static String getNextDay(int day) {
        Calendar cal1 = Calendar.getInstance();
        cal1.setTime(new Date());
        cal1.add(Calendar.DAY_OF_MONTH, day);
        SimpleDateFormat format = new SimpleDateFormat(formatter);
        return format.format(cal1.getTime());
    }

    public static Date getNextHour(int hour) {
        Calendar cal1 = Calendar.getInstance();
        cal1.setTime(new Date());
        cal1.add(Calendar.HOUR_OF_DAY, hour);
        return cal1.getTime();
    }

    public static Date getNextHour(Date date, int hour) {
        Calendar cal1 = Calendar.getInstance();
        cal1.setTime(date);
        cal1.add(Calendar.HOUR_OF_DAY, hour);
        return cal1.getTime();
    }

    public static Date getNextMinute(int minute) {
        Calendar cal1 = Calendar.getInstance();
        cal1.setTime(new Date());
        cal1.add(Calendar.MINUTE, minute);
        return cal1.getTime();
    }

    // 获取指定日期之后的日期字符串 如 2007-04-15 后一天 就是 2007-04-16
    public static String getNextDay(String strDate, int day) {
        Calendar c = Calendar.getInstance();
        String[] string = strDate.trim().split("-");
        int one = Integer.parseInt(string[0]) - 1900;
        int two = Integer.parseInt(string[1]) - 1;
        int three = Integer.parseInt(string[2]);

        c.set(one, two, three);
        c.add(Calendar.DAY_OF_MONTH, day);
        SimpleDateFormat format = new SimpleDateFormat(formatter);
        return format.format(c.getTime());
    }

    public static Date getNextDay(Date date, int day) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.DAY_OF_MONTH, day);
        return cal.getTime();
    }

    /**
     * 得到当前的毫秒日期20120201165044734,17位字符串
     */
    public static synchronized String getMillisecond() {
        return crunttime().toString().replace("-", "").replace(" ", "").replace(":", "").replace("\\.", "");
    }

    public static String getDate(Date date) {
        SimpleDateFormat sdf = new SimpleDateFormat(formatter);
        return sdf.format(date);
    }

    public static String getDateTime(Date date) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return sdf.format(date);
    }

    public static String formatDate(Date date, String format) {
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.format(date);
    }

    public static String format(String format) {
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.format(crunttime());
    }

    public static String getStringDate(Date date) {

        SimpleDateFormat sdf = new SimpleDateFormat(formatter);
        String dateStr = sdf.format(date);
        return dateStr.replace("-", "");
    }

    public static String dateStr(String date) {

        String dateStr = "";
        if (StringUtils.isNotBlank(date)) {
            dateStr = " to_date('" + date + " 00:00:00','yyyy-MM-dd HH24:mi:ss') ";
        }

        return dateStr;
    }

    /**
     * subtractDate:(得到两个日期相减的结果)
     *
     * @param @param  minuend(被减数)
     * @param @param  subtrahend(减数)
     * @param @param  returnType(返回类型:1-毫秒,2-秒,3-分,4-小时,5-天,6-月,7-年)
     * @param @return
     * @return long DOM对象
     * @throws @since CodingExample Ver 1.1
     */
    public static long subtractDate(Date minuend, Date subtrahend, int returnType) {
        long result = 0;
        long millionSecondsForMinuend = minuend.getTime();
        long millionSecondsForSubtrahend = subtrahend.getTime();
        long subtract = millionSecondsForMinuend - millionSecondsForSubtrahend;
        switch (returnType) {
            case 1:
                result = subtract;
                break;
            case 2:
                result = subtract / 1000;
                break;
            case 3:
                result = subtract / 1000 / 60;
                break;
            case 4:
                result = subtract / 1000 / 60 / 60;
                break;
            case 5:
                result = subtract / 1000 / 60 / 60 / 24;
                break;
            case 6:
                result = subtract / 1000 / 60 / 60 / 24 / 30;
                break;
            case 7:
                result = subtract / 1000 / 60 / 60 / 24 / 30 / 12;
                break;
            default:
                result = 0;
        }
        return result;
    }

    /**
     * 取得当前日期是多少周
     *
     * @param date
     * @return
     */
    public static int getWeekOfYear(Date date) {
        Calendar c = Calendar.getInstance();
        c.setFirstDayOfWeek(Calendar.MONDAY);
        /**
         * 设置一年中第一个星期所需的最少天数,例如,如果定义第一个星期包含一年第一个月的第一天,则使用值 1 调用此方法。
         * 如果最少天数必须是一整个星期,则使用值 7 调用此方法。
         **/
        c.setMinimalDaysInFirstWeek(1);
        c.setTime(date);

        return c.get(Calendar.WEEK_OF_YEAR);
    }

    /**
     * 得到某一年周的总数
     *
     * @param year
     * @return
     */
    public static int getMaxWeekNumOfYear(int year) {
        Calendar c = Calendar.getInstance();
        c.set(year, Calendar.DECEMBER, 31, 23, 59, 59);

        return getWeekOfYear(c.getTime());
    }

    /**
     * 得到某年某周的第一天
     *
     * @param year
     * @param week
     * @return
     */
    public static Date getFirstDayOfWeek(int year, int week) {
        Calendar c = Calendar.getInstance();
        c.set(Calendar.YEAR, year);
        c.set(Calendar.WEEK_OF_YEAR, week);
        c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);// 设置周一
        c.setFirstDayOfWeek(Calendar.MONDAY);
        c.set(Calendar.HOUR_OF_DAY, 0);
        c.set(Calendar.MINUTE, 0);
        c.set(Calendar.SECOND, 0);
        c.set(Calendar.MILLISECOND, 0);

        return c.getTime();
    }

    /**
     * 得到某年某周的最后一天
     *
     * @param year
     * @param week
     * @return
     */
    public static Date getLastDayOfWeek(int year, int week) {
        Calendar c = Calendar.getInstance();
        c.set(Calendar.YEAR, year);
        c.set(Calendar.WEEK_OF_YEAR, week);
        c.setFirstDayOfWeek(Calendar.MONDAY);
        c.set(Calendar.DAY_OF_WEEK, c.getFirstDayOfWeek() + 6); // Sunday
        c.set(Calendar.HOUR_OF_DAY, 0);
        c.set(Calendar.MINUTE, 0);
        c.set(Calendar.SECOND, 0);
        c.set(Calendar.MILLISECOND, 0);
        return c.getTime();
    }

    /**
     * 得到某年某月的第一天
     *
     * @param year
     * @param month
     * @return
     */
    public static Date getFirstDayOfMonth(int year, int month) {
        Calendar c = Calendar.getInstance();
        c.set(Calendar.YEAR, year);
        c.set(Calendar.MONTH, month - 1);
        c.set(Calendar.DAY_OF_MONTH, c.getActualMinimum(Calendar.DAY_OF_MONTH));
        c.set(Calendar.HOUR_OF_DAY, 0);
        c.set(Calendar.MINUTE, 0);
        c.set(Calendar.SECOND, 0);
        c.set(Calendar.MILLISECOND, 0);

        return c.getTime();
    }

    /**
     * 得到某年某月的最后一天
     *
     * @param year
     * @param month
     * @return
     */
    public static Date getLastDayOfMonth(int year, int month) {
        Calendar c = Calendar.getInstance();
        c.set(Calendar.YEAR, year);
        c.set(Calendar.MONTH, month - 1);
        c.set(Calendar.DAY_OF_MONTH, c.getActualMaximum(Calendar.DAY_OF_MONTH));
        c.set(Calendar.HOUR_OF_DAY, 0);
        c.set(Calendar.MINUTE, 0);
        c.set(Calendar.SECOND, 0);
        c.set(Calendar.MILLISECOND, 0);

        return c.getTime();
    }

    /**
     * 得到某年某季度第一天
     *
     * @param year
     * @param quarter
     * @return
     */
    public static Date getFirstDayOfQuarter(int year, int quarter) {
        int month;
        if (quarter > 4) {
            return null;
        } else {
            month = (quarter - 1) * 3 + 1;
        }
        return getFirstDayOfMonth(year, month);
    }

    /**
     * 得到某年某季度最后一天
     *
     * @param year
     * @param quarter
     * @return
     */
    public static Date getLastDayOfQuarter(int year, int quarter) {
        int month;
        if (quarter > 4) {
            return null;
        } else {
            month = quarter * 3;
        }
        return getLastDayOfMonth(year, month);
    }

    /**
     * 得到某年第一天
     *
     * @param year
     * @return
     */
    public static Date getFirstDayOfYear(int year) {
        return getFirstDayOfQuarter(year, 1);
    }

    /**
     * 得到某年最后一天
     *
     * @param year
     * @return
     */
    public static Date getLastDayOfYear(int year) {
        return getLastDayOfQuarter(year, 4);
    }

    /**
     * 获取当月的 天数
     */
    public static int getCurrentMonthDay() {

        Calendar a = Calendar.getInstance();
        a.set(Calendar.DATE, 1);
        a.roll(Calendar.DATE, -1);
        return a.get(Calendar.DATE);
    }

    /**
     * 根据年 月 获取对应的月份 天数
     */
    public static int getDaysByYearMonth(int year, int month) {

        Calendar a = Calendar.getInstance();
        a.set(Calendar.YEAR, year);
        a.set(Calendar.MONTH, month - 1);
        a.set(Calendar.DATE, 1);
        a.roll(Calendar.DATE, -1);
        return a.get(Calendar.DATE);
    }

    /**
     * 根据日期 找到对应日期的 星期
     */
    public static String getDayOfWeekByDate(String date) {
        String dayOfweek = "-1";
        try {
            SimpleDateFormat myFormatter = new SimpleDateFormat(formatter);
            Date myDate = myFormatter.parse(date);
            SimpleDateFormat formatter = new SimpleDateFormat("E");
            String str = formatter.format(myDate);
            dayOfweek = str;

        } catch (Exception e) {
            logger.info("error: ", e);
        }
        return dayOfweek;
    }

    public static int getYear(Date date) {
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        return c.get(Calendar.YEAR);
    }

    public static int getMonth(Date date) {
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        return c.get(Calendar.MONTH) + 1;
    }

    // 获取yf=‘2014-04’前1个月的月份,返回2014-03
    public static String getPreviousMonth(String date) {
        int nd = Integer.parseInt(date.substring(0, 4));
        int yf = Integer.parseInt(date.substring(5, 7));
        if (yf == 1) {
            nd = nd - 1;
            yf = 12;
        } else {
            yf = yf - 1;
        }
        return getDate(getFirstDayOfMonth(nd, yf)).substring(0, 7);
    }

    public static Date getDateByString(String formatter ,String date) {

        SimpleDateFormat myFormatter = new SimpleDateFormat(formatter);
        Date myDate = null;
        try {
            myDate = myFormatter.parse(date);
        } catch (ParseException e) {
            e.printStackTrace();
        }

        return myDate;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jilke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值