【zip导出】下载导出包含图片,excel,pdf的zip压缩包
生活随笔
收集整理的這篇文章主要介紹了
【zip导出】下载导出包含图片,excel,pdf的zip压缩包
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
工具類(lèi)
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>文件名稱(chēng): DownloadEcharsAndData.java </p> * <p>類(lèi)型描述: [分析頁(yè)面下載功能] </p>* <p>創(chuàng)建時(shí)間: 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);}//轉(zhuǎn)碼圖片List<String> imgPathList = base64ToJpg(file, map);//打包zipList<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("錯(cuò)誤", e);} finally {outs.flush();outs.close();FileUtilsExt.delFile(file.toString());}}/*** @Description: base64轉(zhuǎn)換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 {//服務(wù)器路徑+文件名String excelPath = file.toString() + file.separator + map.get("name") + ".xlsx";FileOutputStream fout = new FileOutputStream(excelPath);try {//獲取數(shù)據(jù)源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");//創(chuàng)建excelXSSFWorkbook wb = new XSSFWorkbook();XSSFRow row = null;XSSFCell cell = null;// 創(chuàng)建新的sheet對(duì)象(excel的表單) 并設(shè)置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); // 設(shè)置字體為斜體字 cellFont.setFontHeightInPoints((short) 10); // 將字體大小設(shè)置為9px cellFont.setFontName("宋體"); // 字體應(yīng)用到當(dāng)前單元格上 cellNoColorStyle.setFont(cellFont);cellNoColorStyle.setWrapText(true);//設(shè)置自動(dòng)換行// ------------------處理數(shù)據(jù)/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));}}}}}//表格數(shù)據(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);//設(shè)置自動(dòng)換行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));}}}}}//表格二數(shù)據(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);//設(shè)置自動(dòng)換行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數(shù)據(jù)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++;}}}}// ------------------處理數(shù)據(jù)end--------------------------------------wb.write(fout);fout.close();} catch (Exception e) {e.printStackTrace();} finally {}return excelPath;}/*** @Description: rgb顏色值轉(zhuǎn)換* @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();//創(chuàng)建pptXMLSlideShow 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);//創(chuàng)建excelXSSFWorkbook 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);//測(cè)試用本地圖片//File image = new File("E://plief.jpg");// 圖片文件輸入流FileInputStream imageFis = new FileInputStream(image);// 獲取圖片大小int len = (int) image.length();// 創(chuàng)建一個(gè)字節(jié)數(shù)組,數(shù)組大小與圖片文件大小一致byte[] imageData = new byte[len];// 將圖片數(shù)據(jù)讀進(jìn)字節(jié)數(shù)組中int pictureData = imageFis.read(imageData);// 將圖片添加到PPT中XSLFPictureData pd = ppt.addPicture(imageData, PictureType.PNG);// 將圖片放到指定的幻燈片中XSLFPictureShape pic = slide.createPicture(pd);// 設(shè)置圖片框的放置的位置和大小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("錯(cuò)誤", 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 {//獲取數(shù)據(jù)源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;// 創(chuàng)建新的sheet對(duì)象(excel的表單) 并設(shè)置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); // 設(shè)置字體為斜體字 cellFont.setFontHeightInPoints((short) 10); // 將字體大小設(shè)置為9px cellFont.setFontName("宋體"); // 字體應(yīng)用到當(dāng)前單元格上 cellNoColorStyle.setFont(cellFont);cellNoColorStyle.setWrapText(true);//設(shè)置自動(dòng)換行// ------------------處理數(shù)據(jù)/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));}}}}}//表格數(shù)據(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);//設(shè)置自動(dòng)換行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));}}}}}//表格二數(shù)據(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);//設(shè)置自動(dòng)換行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數(shù)據(jù)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報(bào)錯(cuò)問(wèn)題修改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++;}}}}// ------------------處理數(shù)據(jù)end--------------------------------------} catch (Exception e) {logger.debug("錯(cuò)誤", e);} finally {}return wb;}/*** @Description: 職級(jí)圖excel* @param <File>* @param <HashMap>* @Author:jlk* @CreateTime:2022-05-24*/@SuppressWarnings("all")public static String writeExcelCustomerPositionClass(File file, HashMap map) throws IOException {//服務(wù)器路徑+文件名String excelPath = file.toString() + file.separator + map.get("name") + ".xlsx";FileOutputStream fout = new FileOutputStream(excelPath);try {//獲取數(shù)據(jù)源List<Map> dataList = (List<Map>) map.get("dataList");List<Map> titleList = (List<Map>) map.get("titleList");//創(chuàng)建excelXSSFWorkbook wb = new XSSFWorkbook();XSSFRow row = null;XSSFCell cell = null;// 創(chuàng)建新的sheet對(duì)象(excel的表單) 并設(shè)置sheet名字XSSFSheet sheet = wb.createSheet(map.get("name").toString());sheet.setDefaultRowHeightInPoints(20);sheet.setDefaultColumnWidth(12);XSSFCellStyle titleStyle = getTitleStyle(wb);XSSFCellStyle cellNoColorStyle = getNoColorStyle(wb);// ------------------處理數(shù)據(jù)/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++;}}}// ------------------處理數(shù)據(jù)end--------------------------------------wb.write(fout);fout.close();} catch (Exception e) {logger.debug("錯(cuò)誤", 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); // 設(shè)置字體為斜體字 //ztFont.setColor(HSSFColor.WHITE.index); // 設(shè)置字體顏色-白色 ztFont.setColor(Font.COLOR_NORMAL);ztFont.setFontHeightInPoints((short) 10); // 將字體大小設(shè)置為10px ztFont.setFontName("宋體"); // 字體應(yīng)用到當(dāng)前單元格上 ztFont.setBold(true); //加粗titleStyle.setFont(ztFont);//titleStyle.setWrapText(true);//設(shè)置自動(dòng)換行//----------------------------------------------------------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); // 設(shè)置字體為斜體字 echarsFont.setColor(Font.COLOR_NORMAL); // 設(shè)置字體顏色echarsFont.setFontHeightInPoints((short) 10); // 將字體大小設(shè)置為10px echarsFont.setFontName("宋體"); // 字體應(yīng)用到當(dāng)前單元格上 echarsFont.setBold(false); //加粗echarsStyle.setFont(echarsFont);//echarsStyle.setWrapText(true);//設(shè)置自動(dòng)換行//----------------------------------------------------------return echarsStyle;}public static XSSFCellStyle getNoColorStyle(XSSFWorkbook wb) {//----------------無(wú)色普通格樣式----------------------------------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); // 設(shè)置字體為斜體字 cellFont.setFontHeightInPoints((short) 10); // 將字體大小設(shè)置為9px cellFont.setFontName("宋體"); // 字體應(yīng)用到當(dāng)前單元格上 cellNoColorStyle.setFont(cellFont);cellNoColorStyle.setWrapText(true);//設(shè)置自動(dòng)換行//----------------------------------------------------------return cellNoColorStyle;}/*** 初始化 cell 內(nèi)容長(zhǎng)度* cell 原本內(nèi)容長(zhǎng)度限制 32767 現(xiàn)修改為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("方案預(yù)覽校驗(yàn)表", "UTF-8"));OutputStream outs = response.getOutputStream();try {//獲取數(shù)據(jù)源List<Map> columns = (List<Map>) map.get("columns");List<List<String>> data = (List<List<String>>) map.get("data");//創(chuàng)建excelHSSFWorkbook wb = new HSSFWorkbook();HSSFRow row = null;HSSFCell cell = null;// 創(chuàng)建新的sheet對(duì)象(excel的表單) 并設(shè)置sheet名字HSSFSheet sheet = wb.createSheet("方案預(yù)覽校驗(yàn)");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); // 設(shè)置字體為斜體字 cellFont.setFontHeightInPoints((short) 10); // 將字體大小設(shè)置為9px cellFont.setFontName("宋體"); // 字體應(yīng)用到當(dāng)前單元格上 cellNoColorStyle.setFont(cellFont);cellNoColorStyle.setWrapText(true);//設(shè)置自動(dòng)換行// ------------------處理數(shù)據(jù)/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++;}}// ------------------處理數(shù)據(jù)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();//創(chuàng)建pptXMLSlideShow 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);//創(chuàng)建excelXSSFWorkbook 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);//測(cè)試用本地圖片//File image = new File("E://plief.jpg");// 圖片文件輸入流FileInputStream imageFis = new FileInputStream(image);// 獲取圖片大小int len = (int) image.length();// 創(chuàng)建一個(gè)字節(jié)數(shù)組,數(shù)組大小與圖片文件大小一致byte[] imageData = new byte[len];// 將圖片數(shù)據(jù)讀進(jìn)字節(jié)數(shù)組中int pictureData = imageFis.read(imageData);// 將圖片添加到PPT中XSLFPictureData pd = ppt.addPicture(imageData, PictureType.PNG);// 將圖片放到指定的幻燈片中XSLFPictureShape pic = slide.createPicture(pd);// 設(shè)置圖片框的放置的位置和大小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("錯(cuò)誤", e);} finally {pptbaos.flush();pptbaos.close();excelbaos.flush();excelbaos.close();outs.flush();outs.close();FileUtilsExt.delFile(file.toString());}}}zip 工具類(lèi)
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 是否保留原來(lái)的目錄結(jié)構(gòu),true:保留目錄結(jié)構(gòu); * false:所有文件跑到壓縮包根目錄下(注意:不保留目錄結(jié)構(gòu)可能會(huì)出現(xiàn)同名文件,會(huì)壓縮失敗)* @throws RuntimeException 壓縮失敗會(huì)拋出運(yùn)行時(shí)異常*/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("壓縮完成,耗時(shí):" + (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 壓縮失敗會(huì)拋出運(yùn)行時(shí)異常*/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("壓縮完成,耗時(shí):" + (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 壓縮后的名稱(chēng)* @param KeepDirStructure 是否保留原來(lái)的目錄結(jié)構(gòu),true:保留目錄結(jié)構(gòu); * false:所有文件跑到壓縮包根目錄下(注意:不保留目錄結(jié)構(gòu)可能會(huì)出現(xiàn)同名文件,會(huì)壓縮失敗)* @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輸出流中添加一個(gè)zip實(shí)體,構(gòu)造器中name為zip實(shí)體的文件的名字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 entryzos.closeEntry();in.close();} else {File[] listFiles = sourceFile.listFiles();if(listFiles == null || listFiles.length == 0){// 需要保留原來(lái)的文件結(jié)構(gòu)時(shí),需要對(duì)空文件夾進(jìn)行處理if(KeepDirStructure){// 空文件夾的處理zos.putNextEntry(new ZipEntry(name + "/"));// 沒(méi)有文件,不需要文件的copyzos.closeEntry();}}else {for (File file : listFiles) {// 判斷是否需要保留原來(lái)的文件結(jié)構(gòu)if (KeepDirStructure) {// 注意:file.getName()前面需要帶上父文件夾的名字加一斜杠,// 不然最后壓縮包中就不能保留原來(lái)的文件結(jié)構(gòu),即:所有文件都跑到壓縮包根目錄下了compress(file, zos, name + "/" + file.getName(),KeepDirStructure);} else {compress(file, zos, file.getName(),KeepDirStructure);}}}}}public static void main(String[] args) throws Exception {/** 測(cè)試壓縮方法1 */FileOutputStream fos1 = new FileOutputStream(new File("c:/mytest01.zip"));ZipUtils.toZip("D:/log", fos1,true);/** 測(cè)試壓縮方法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()) { // 如果是文件// 創(chuàng)建輸入流讀取文件fis = new FileInputStream(inputFile);bis = new BufferedInputStream(fis);// 將文件寫(xiě)入zip壓縮包內(nèi)ZipEntry zip =new ZipEntry(inputFile.getParentFile().getName() + File.separator + inputFile.getName()); //獲取文件名zipoutputStream.putNextEntry(zip);// 進(jìn)行寫(xiě)入文件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);}// 關(guān)閉輸入輸出流if (bis != null) {bis.close();}if (fis != null) {fis.close();}} else { // 如果是文件夾,則使用窮舉的方法獲取文件,寫(xiě)入ziptry {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轉(zhuǎn)碼工具類(lèi)
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>文件名稱(chēng): Base64Util.java </p> * <p>類(lèi)型描述: [base64處理工具] </p>* <p>創(chuàng)建時(shí)間: 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 需要轉(zhuǎn)換的bytes.* @return String*/public static String encode(byte[] bytes) {return Base64.getEncoder().encodeToString(bytes);}/*** <p>功能描述: [將base64轉(zhuǎn)成文件] </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) {// 調(diào)整異常數(shù)據(jù)if (b[i] < 0) {b[i] += 256;}}// 生成jpeg圖片F(xiàn)ile 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編碼字符串轉(zhuǎn)換為圖片* @Author:* @CreateTime:* @param file base64編碼字符串* @param path 圖片路徑-具體到文件* @return* @throws IOException */public static String generateImage(String file, String path) throws IOException {// 解密OutputStream out = null;try {// 項(xiàng)目絕對(duì)路徑// 圖片分類(lèi)路徑+圖片名+圖片后綴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);// 處理數(shù)據(jù)for (int i = 0; i < b.length; ++i) {if (b[i] < 0) {b[i] += 256;}}// 保存圖片out = new FileOutputStream(imgClassPath);out.write(b);// 返回圖片的相對(duì)路徑 = 圖片分類(lèi)路徑+圖片名+圖片后綴return imgClassPath;} catch (IOException e) {return null;}finally {out.flush();out.close();}}}文件工具類(lèi)
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;/*** 文件操作工具類(lèi) 實(shí)現(xiàn)文件的創(chuàng)建、刪除、復(fù)制、壓縮、解壓以及目錄的創(chuàng)建、刪除、復(fù)制、壓縮解壓等功能** @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);/*** 復(fù)制單個(gè)文件,如果目標(biāo)文件存在,則不覆蓋** @param srcFileName 待復(fù)制的文件名* @param descFileName 目標(biāo)文件名* @return 如果復(fù)制成功,則返回true,否則返回false*/public static boolean copyFile(String srcFileName, String descFileName) {return com.sapit.compensation.common.util.FileUtilsExt.copyFileCover(srcFileName, descFileName, false);}/*** 復(fù)制單個(gè)文件** @param srcFileName 待復(fù)制的文件名* @param descFileName 目標(biāo)文件名* @param coverlay 如果目標(biāo)文件已存在,是否覆蓋* @return 如果復(fù)制成功,則返回true,否則返回false*/public static boolean copyFileCover(String srcFileName, String descFileName, boolean coverlay) {File srcFile = new File(srcFileName);// 判斷源文件是否存在if (!srcFile.exists()) {logger.debug("復(fù)制文件失敗,源文件 {} 不存在!", srcFileName);return false;}// 判斷源文件是否是合法的文件else if (!srcFile.isFile()) {logger.debug("復(fù)制文件失敗,{} 不是一個(gè)文件!", srcFileName);return false;}File descFile = new File(descFileName);// 判斷目標(biāo)文件是否存在if (descFile.exists()) {// 如果目標(biāo)文件存在,并且允許覆蓋if (coverlay) {logger.debug("目標(biāo)文件已存在,準(zhǔn)備刪除!");if (!com.sapit.compensation.common.util.FileUtilsExt.delFile(descFileName)) {logger.debug("刪除目標(biāo)文件 {} 失敗!", descFileName);return false;}} else {logger.debug("復(fù)制文件失敗,目標(biāo)文件{} 已存在!", descFileName);return false;}} else {if (!descFile.getParentFile().exists()) {// 如果目標(biāo)文件所在的目錄不存在,則創(chuàng)建目錄logger.debug("目標(biāo)文件所在的目錄不存在,創(chuàng)建目錄!");// 創(chuàng)建目標(biāo)文件所在的目錄if (!descFile.getParentFile().mkdirs()) {logger.debug("創(chuàng)建目標(biāo)文件所在的目錄失敗!");return false;}}}// 準(zhǔn)備復(fù)制文件// 讀取的位數(shù)int readByte = 0;InputStream ins = null;OutputStream outs = null;try {// 打開(kāi)源文件ins = new FileInputStream(srcFile);// 打開(kāi)目標(biāo)文件的輸出流outs = new FileOutputStream(descFile);byte[] buf = new byte[1024];// 一次讀取1024個(gè)字節(jié),當(dāng)readByte為-1時(shí)表示文件已經(jīng)讀取完畢while ((readByte = ins.read(buf)) != -1) {// 將讀取的字節(jié)流寫(xiě)入到輸出流outs.write(buf, 0, readByte);}logger.info("復(fù)制單個(gè)文件{} 到 {} 成功!", srcFileName, descFileName);return true;} catch (Exception e) {logger.info("復(fù)制文件失敗:{}", e.getMessage());return false;} finally {// 關(guān)閉輸入輸出流,首先關(guān)閉輸出流,然后再關(guān)閉輸入流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());}}}}/*** 復(fù)制整個(gè)目錄的內(nèi)容,如果目標(biāo)目錄存在,則不覆蓋** @param srcDirName 源目錄名* @param descDirName 目標(biāo)目錄名* @return 如果復(fù)制成功返回true,否則返回false*/public static boolean copyDirectory(String srcDirName, String descDirName) {return com.sapit.compensation.common.util.FileUtilsExt.copyDirectoryCover(srcDirName, descDirName, false);}/*** 復(fù)制整個(gè)目錄的內(nèi)容** @param srcDirName 源目錄名* @param descDirName 目標(biāo)目錄名* @param coverlay 如果目標(biāo)目錄存在,是否覆蓋* @return 如果復(fù)制成功返回true,否則返回false*/public static boolean copyDirectoryCover(String srcDirName, String descDirName, boolean coverlay) {File srcDir = new File(srcDirName);// 判斷源目錄是否存在if (!srcDir.exists()) {logger.debug("復(fù)制目錄失敗,源目錄 {} 不存在!", srcDirName);return false;}// 判斷源目錄是否是目錄else if (!srcDir.isDirectory()) {logger.debug("復(fù)制目錄失敗,{} 不是一個(gè)目錄!", srcDirName);return false;}// 如果目標(biāo)文件夾名不以文件分隔符結(jié)尾,自動(dòng)添加文件分隔符String descDirNames = descDirName;if (!descDirNames.endsWith(File.separator)) {descDirNames = descDirNames + File.separator;}File descDir = new File(descDirNames);// 如果目標(biāo)文件夾存在if (descDir.exists()) {if (coverlay) {// 允許覆蓋目標(biāo)目錄logger.debug("目標(biāo)目錄已存在,準(zhǔn)備刪除!");if (!com.sapit.compensation.common.util.FileUtilsExt.delFile(descDirNames)) {logger.debug("刪除目錄 {} 失敗!", descDirNames);return false;}} else {logger.debug("目標(biāo)目錄復(fù)制失敗,目標(biāo)目錄 {} 已存在!", descDirNames);return false;}} else {// 創(chuàng)建目標(biāo)目錄logger.debug("目標(biāo)目錄不存在,準(zhǔn)備創(chuàng)建!");if (!descDir.mkdirs()) {logger.debug("創(chuàng)建目標(biāo)目錄失敗!");return false;}}boolean flag = true;// 列出源目錄下的所有文件名和子目錄名File[] files = srcDir.listFiles();for (int i = 0; i < files.length; i++) {// 如果是一個(gè)單個(gè)文件,則直接復(fù)制if (files[i].isFile()) {flag = com.sapit.compensation.common.util.FileUtilsExt.copyFile(files[i].getAbsolutePath(), descDirName + files[i].getName());// 如果拷貝文件失敗,則退出循環(huán)if (!flag) {break;}}// 如果是子目錄,則繼續(xù)復(fù)制目錄if (files[i].isDirectory()) {flag = com.sapit.compensation.common.util.FileUtilsExt.copyDirectory(files[i].getAbsolutePath(), descDirName + files[i].getName());// 如果拷貝目錄失敗,則退出循環(huán)if (!flag) {break;}}}if (!flag) {logger.debug("復(fù)制目錄 {} 到 {} 失敗!", srcDirName, descDirName);return false;}logger.debug("復(fù)制目錄 {} 到 {} 成功!", srcDirName, descDirName);return true;}/*** 刪除文件,可以刪除單個(gè)文件或文件夾** @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);}}}/*** 刪除單個(gè)文件** @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());// 如果刪除文件失敗,則退出循環(huán)if (!flag) {break;}}// 刪除子目錄else if (files[i].isDirectory()) {flag = com.sapit.compensation.common.util.FileUtilsExt.deleteDirectory(files[i].getAbsolutePath());// 如果刪除子目錄失敗,則退出循環(huán)if (!flag) {break;}}}if (!flag) {logger.debug("刪除目錄失敗!");return false;}// 刪除當(dāng)前目錄if (dirFile.delete()) {logger.debug("刪除目錄 {} 成功!", dirName);return true;} else {logger.debug("刪除目錄 {} 失敗!", dirName);return false;}}/*** 創(chuàng)建單個(gè)文件** @param descFileName 文件名,包含路徑* @return 如果創(chuàng)建成功,則返回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("{} 為目錄,不能創(chuàng)建目錄!", descFileName);return false;}if (!file.getParentFile().exists() && !file.getParentFile().mkdirs()) {// 如果文件所在的目錄不存在,則創(chuàng)建目錄logger.debug("創(chuàng)建文件所在的目錄失敗!");return false;}// 創(chuàng)建文件try {if (file.createNewFile()) {logger.debug("{} 文件創(chuàng)建成功!", descFileName);return true;} else {logger.info("{} 文件創(chuàng)建失敗!", descFileName);return false;}} catch (Exception e) {logger.info("{} 文件創(chuàng)建失敗!", descFileName);return false;}}/*** 創(chuàng)建目錄** @param descDirName 目錄名,包含路徑* @return 如果創(chuàng)建成功,則返回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;}// 創(chuàng)建目錄if (descDir.mkdirs()) {logger.debug("目錄 {} 創(chuàng)建成功!", descDirNames);return true;} else {logger.debug("目錄 {} 創(chuàng)建失敗!", descDirNames);return false;}}/*** 寫(xiě)入文件** @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("文件 {} 寫(xiě)入成功!", fileName);} catch (IOException e) {logger.info("文件 {} 寫(xiě)入失敗! {}", fileName, e.getMessage());}}/*** 寫(xiě)入文件** @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("文件 {} 寫(xiě)入成功!", fileName);} catch (IOException e) {logger.info("文件 {} 寫(xiě)入失敗! {}", fileName, e.getMessage());}}/*** 壓縮文件或目錄** @param srcDirName 壓縮的根目錄* @param fileName 根目錄下的待壓縮的文件名或文件夾名,其中*或""表示跟目錄下的全部文件* @param descFileName 目標(biāo)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()) {// 如果是文件,則調(diào)用文件壓縮方法com.sapit.compensation.common.util.FileUtilsExt.zipFilesToZipFile(dirPath, files[i], zouts);} else {// 如果是目錄,則遞歸調(diào)用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;// 創(chuàng)建復(fù)制緩沖區(qū)byte[] buf = new byte[4096];int readByte;if (file.isFile()) {try {// 創(chuàng)建一個(gè)文件輸入流fin = new FileInputStream(file);// 創(chuàng)建一個(gè)ZipEntryentry = new ZipEntry(getEntryName(dirPath, file));// 存儲(chǔ)信息到壓縮文件zouts.putNextEntry(entry);// 復(fù)制字節(jié)到壓縮文件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的名字,即相對(duì)于跟目錄的相對(duì)路徑名** @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();// 對(duì)于目錄,必須在entry名字后面加上"/",表示它將以目錄項(xiàng)存儲(chǔ)if (file.isDirectory()) {filePath += "/";}int index = filePath.indexOf(dirPaths);return filePath.substring(index + dirPaths.length());}/*** 根據(jù)“文件名的后綴”獲取文件內(nèi)容類(lèi)型(而非根據(jù)File.getContentType()讀取的文件類(lèi)型)** @param returnFileName 帶驗(yàn)證的文件名* @return 返回文件類(lèi)型*/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;}/*** 獲取文件擴(kuò)展名(返回小寫(xiě))** @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));}/*** 獲取文件名,不包含擴(kuò)展名** @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>功能描述: [自動(dòng)創(chuàng)建多層目錄](méi) </p>* @Title mkdirs* @param destPath*/public static void mkdirs(String destPath) {File file = new File(destPath);// 當(dāng)文件夾不存在時(shí),mkdirs會(huì)自動(dòng)創(chuàng)建多層目錄,區(qū)別于mkdir.(mkdir如果父目錄不存在則會(huì)拋出異常)if (!file.exists() && !file.isDirectory()) {file.mkdirs();}} }時(shí)間戳工具類(lèi)
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");}// 當(dāng)前時(shí)間public static Timestamp crunttime() {return new Timestamp(System.currentTimeMillis());}// 獲取當(dāng)前時(shí)間的字符串 2006-07-07public static String getCurrentDate() {Timestamp d = crunttime();return d.toString().substring(0, 10);}// 獲取當(dāng)前時(shí)間的字符串 2006-07-07 22:10:10public static String getCurrentDateTime() {Timestamp d = crunttime();return d.toString().substring(0, 19);}// 獲取給定時(shí)間的字符串,只有日期 2006-07-07public static String getStrDate(Timestamp t) {return t.toString().substring(0, 10);}// 獲取給定時(shí)間的字符串,只有日期 20060707public static String getStringDate() {Timestamp t = crunttime();return t.toString().substring(0, 10).replace("-", "");}// 獲取給定時(shí)間的字符串 2006-07-07 22:10:10public static String getStrDateTime(Timestamp t) {return t.toString().substring(0, 19);}// 獲取當(dāng)前日期之前的日期字符串 如 2007-04-15 前5月 就是 2006-11-15public 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 正數(shù):向前推xxx個(gè)月,負(fù)數(shù):向后推xxx個(gè)月* @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());}// 獲取當(dāng)前日期之后的日期字符串 如 2007-04-15 后一天 就是 2007-04-16public 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-16public 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();}/*** 得到當(dāng)前的毫秒日期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:(得到兩個(gè)日期相減的結(jié)果)** @param @param minuend(被減數(shù))* @param @param subtrahend(減數(shù))* @param @param returnType(返回類(lèi)型:1-毫秒,2-秒,3-分,4-小時(shí),5-天,6-月,7-年)* @param @return* @return long DOM對(duì)象* @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;}/*** 取得當(dāng)前日期是多少周** @param date* @return*/public static int getWeekOfYear(Date date) {Calendar c = Calendar.getInstance();c.setFirstDayOfWeek(Calendar.MONDAY);/*** 設(shè)置一年中第一個(gè)星期所需的最少天數(shù),例如,如果定義第一個(gè)星期包含一年第一個(gè)月的第一天,則使用值 1 調(diào)用此方法。* 如果最少天數(shù)必須是一整個(gè)星期,則使用值 7 調(diào)用此方法。**/c.setMinimalDaysInFirstWeek(1);c.setTime(date);return c.get(Calendar.WEEK_OF_YEAR);}/*** 得到某一年周的總數(shù)** @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);// 設(shè)置周一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); // Sundayc.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);}/*** 獲取當(dāng)月的 天數(shù)*/public static int getCurrentMonthDay() {Calendar a = Calendar.getInstance();a.set(Calendar.DATE, 1);a.roll(Calendar.DATE, -1);return a.get(Calendar.DATE);}/*** 根據(jù)年 月 獲取對(duì)應(yīng)的月份 天數(shù)*/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);}/*** 根據(jù)日期 找到對(duì)應(yīng)日期的 星期*/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個(gè)月的月份,返回2014-03public 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;} }總結(jié)
以上是生活随笔為你收集整理的【zip导出】下载导出包含图片,excel,pdf的zip压缩包的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 基于Android的APP开发可行性,基
- 下一篇: http://www.proxyie.c