package com.jsh.erp.utils; import java.io.*; import java.text.SimpleDateFormat; import java.util.*; import jxl.*; import lombok.extern.slf4j.Slf4j; import org.springframework.util.StringUtils; import jxl.format.*; import jxl.write.Label; import jxl.write.WritableCellFormat; import jxl.write.WritableFont; import jxl.write.WritableSheet; import jxl.write.WritableWorkbook; import javax.servlet.http.HttpServletResponse; @Slf4j public class ExcelUtils { public static InputStream getPathByFileName(String template, String tmpFileName) { File tmpFile = new File(template, tmpFileName); InputStream path = null; //判断文件或文件夹是否存在 if (tmpFile.exists()) { try { path = new FileInputStream(tmpFile); } catch (FileNotFoundException e) { log.error("", e); } } return path; } /** * 导出excel,带多sheet * * @param wtwb * @param tip * @param names * @param title * @param index * @param objects * @return * @throws Exception */ public static void exportObjectsManySheet(WritableWorkbook wtwb, String tip, String[] names, String title, int index, List objects) throws Exception { WritableSheet sheet = wtwb.createSheet(title, index); sheet.getSettings().setDefaultColumnWidth(12); // 标题的格式-红色 WritableFont redWF = new WritableFont(WritableFont.ARIAL, 12, WritableFont.BOLD, false, UnderlineStyle.NO_UNDERLINE, Colour.RED); WritableCellFormat redWFFC = new WritableCellFormat(redWF); redWFFC.setVerticalAlignment(VerticalAlignment.CENTRE); redWFFC.setBorder(Border.ALL, BorderLineStyle.THIN); // 标题的格式-黑色 WritableFont blackWF = new WritableFont(WritableFont.ARIAL, 12, WritableFont.BOLD, false, UnderlineStyle.NO_UNDERLINE, Colour.BLACK); WritableCellFormat blackWFFC = new WritableCellFormat(blackWF); blackWFFC.setVerticalAlignment(VerticalAlignment.CENTRE); blackWFFC.setBorder(Border.ALL, BorderLineStyle.THIN); // 设置字体以及单元格格式 WritableFont wfont = new WritableFont(WritableFont.createFont("楷书"), 12); WritableCellFormat format = new WritableCellFormat(wfont); format.setAlignment(Alignment.LEFT); format.setVerticalAlignment(VerticalAlignment.TOP); format.setBorder(jxl.format.Border.ALL,jxl.format.BorderLineStyle.THIN); // 第一行写入提示 if(com.jsh.erp.utils.StringUtil.isNotEmpty(tip) && tip.contains("*")) { sheet.addCell(new Label(0, 0, tip, redWFFC)); } else { sheet.addCell(new Label(0, 0, tip, blackWFFC)); } // 第二行写入标题 for (int i = 0; i < names.length; i++) { if(StringUtil.isNotEmpty(names[i]) && names[i].contains("*")) { sheet.addCell(new Label(i, 1, names[i], redWFFC)); } else { sheet.addCell(new Label(i, 1, names[i], blackWFFC)); } } // 其余行依次写入数据 int rowNum = 2; for (int j = 0; j < objects.size(); j++) { String[] obj = objects.get(j); for (int h = 0; h < obj.length; h++) { sheet.addCell(new Label(h, rowNum, obj[h], format)); } rowNum = rowNum + 1; } } /** * 导出excel,带单个sheet * * @param fileName * @param names * @param title * @param objects * @return * @throws Exception */ public static File exportObjectsOneSheet(String fileName, String tip, String[] names, String title, List objects) throws Exception { File excelFile = new File("/opt/"+ fileName); WritableWorkbook wtwb = Workbook.createWorkbook(excelFile); WritableSheet sheet = wtwb.createSheet(title, 0); sheet.getSettings().setDefaultColumnWidth(12); // 标题的格式-红色 WritableFont redWF = new WritableFont(WritableFont.ARIAL, 12, WritableFont.BOLD, false, UnderlineStyle.NO_UNDERLINE, Colour.RED); WritableCellFormat redWFFC = new WritableCellFormat(redWF); redWFFC.setVerticalAlignment(VerticalAlignment.CENTRE); redWFFC.setBorder(jxl.format.Border.ALL,jxl.format.BorderLineStyle.THIN); // 标题的格式-黑色 WritableFont blackWF = new WritableFont(WritableFont.ARIAL, 12, WritableFont.BOLD, false, UnderlineStyle.NO_UNDERLINE, Colour.BLACK); WritableCellFormat blackWFFC = new WritableCellFormat(blackWF); blackWFFC.setVerticalAlignment(VerticalAlignment.CENTRE); blackWFFC.setBorder(jxl.format.Border.ALL,jxl.format.BorderLineStyle.THIN); // 设置字体以及单元格格式 WritableFont wfont = new WritableFont(WritableFont.createFont("楷书"), 12); WritableCellFormat format = new WritableCellFormat(wfont); format.setAlignment(Alignment.LEFT); format.setVerticalAlignment(VerticalAlignment.TOP); format.setBorder(jxl.format.Border.ALL,jxl.format.BorderLineStyle.THIN); // 第一行写入提示 if(StringUtil.isNotEmpty(tip) && tip.contains("*")) { sheet.addCell(new Label(0, 0, tip, redWFFC)); } else { sheet.addCell(new Label(0, 0, tip, blackWFFC)); } // 第二行写入标题 for (int i = 0; i < names.length; i++) { if(StringUtil.isNotEmpty(names[i]) && names[i].contains("*")) { sheet.addCell(new Label(i, 1, names[i], redWFFC)); } else { sheet.addCell(new Label(i, 1, names[i], blackWFFC)); } } // 其余行依次写入数据 int rowNum = 2; for (int j = 0; j < objects.size(); j++) { String[] obj = objects.get(j); for (int h = 0; h < obj.length; h++) { sheet.addCell(new Label(h, rowNum, obj[h], format)); } rowNum = rowNum + 1; } wtwb.write(); wtwb.close(); return excelFile; } public static String getContent(Sheet src, int rowNum, int colNum) { if(colNum < src.getRow(rowNum).length) { return src.getRow(rowNum)[colNum].getContents().trim(); } else { return null; } } /** * 获取真实的行数,剔除掉空白行 * @param src * @return */ public static int getRightRows(Sheet src) { int rsRows = src.getRows(); //行数 int rsCols = src.getColumns(); //列数 int nullCellNum; int rightRows = rsRows; for (int i = 1; i < rsRows; i++) { //统计行中为空的单元格数 nullCellNum = 0; for (int j = 0; j < rsCols; j++) { String val = src.getCell(j, i).getContents().trim(); if (StringUtils.isEmpty(val)) { nullCellNum++; } } if (nullCellNum >= rsCols) { //如果nullCellNum大于或等于总的列数 rightRows--; //行数减一 } } return rightRows; } public static void downloadExcel(File excelFile, String fileName, HttpServletResponse response) throws Exception{ response.setContentType("application/octet-stream"); fileName = new String(fileName.getBytes("gbk"),"ISO8859_1"); response.setHeader("Content-Disposition", "attachment;filename=\"" + fileName + ".xls" + "\""); FileInputStream fis = new FileInputStream(excelFile); OutputStream out = response.getOutputStream(); int SIZE = 1024 * 1024; byte[] bytes = new byte[SIZE]; int LENGTH = -1; while((LENGTH = fis.read(bytes)) != -1){ out.write(bytes,0,LENGTH); } out.flush(); fis.close(); } }