为什么使用Apache POI 框架导出Excel?

POI 是Apache 基于Java语言顶级开源项目,功能强大,稳定,符合Office openXML规范,入门简单 。

能够处理Microsoft office 大多数文件。如:Word , Excel , PowerPoint。加上Apache的光环,所以是不二之选。

JXL是一套提供对Excel操作的类库,操作效率低,功能较为单一,对函数表达式,导出图片支持不好。

为什么为封装此工具类?

由于公司供应链部门业务需要,对Excel处理这块有较为严苛的要求。为了使导出的Excel保持统一的风格和提高开发效率,从实际项目出发封装了通用自定义导出Excel工具类。

基于POI 3.9 版本,建议读者在使用该工具类的时候升级为最新版本,最新版本对以前老版本的一些Bug做了修复,性能会更好。

此工具类只支持Offece 2007 及以上版本,如果读者要支持2003版本可以对该工具类进行扩展。

功能概述

  1. 支持在任意位置填充字符,数字,图片
  2. 支持在任意位置填充一行值
  3. 支持在任意位置填充列表值
  4. 支持设置列宽,行高
  5. 支持在任意位置填充标题
  6. 支持自定义单元格样式风格

效果预览

1. 定义模板

2.添加模板到项目模板目录

3.执行填充逻辑,生成Excel

填充列表效果:

设计思想

设计原则:简单易用。由于导出模板的多样性和不确定性,则需要封装常用的数据结构和样式风格,由开发人员根据业务需求对数据进行组装填充模板,满足业务需求。

采用策略模式,符合开闭原则。

对象关系

对象 说明
ExportExcelCustom 自定义导出接口类,封装了常用导出excel方式
ExportExcelCustomXlsx xlsx格式excel导出实现
AbstractExcelData 数据实体抽象基类,抽象通用数据字段
ExcelConfigExt 扩展配置实体,用于扩展其它功能传递参数
ExcelTextData  单列内容实体,支持字符,数字,时间
ExcelTitleData 列表标题实体,支持自定义风格
ExcelRowSignData 单行内容实体
ExcelRowMultiData 列表内容实体
ExcelPictureData 图片内容实体
ExcelFontEnum 通用字体样式枚举
ExcelStyleEnum 通用样式枚举

使用注意点

由于操作Excel文件一般较大,建议对JVM调优,将大对象直接放在老年代,具体调优方式,网上资料很多。

待优化点

没有采用annation的方式

待扩充功能点

1. 基于模板导出,导出一个对象,使用表达式,自动填充字段名(不需要指定%s)支持重复填充

2. 导出一个list自动填充一个列表

3. 样式扩展优化(列表标题自动固定样式)

4.添加函数表达式

5. logo 添加

6. 单元格下拉选择

7. 合并单元格

8. 由于该工具类使用JDK 1.7 ,可以升级到JDK1.8或JDK1.9 使用函数式变成和lambda进行代码结构优化

有兴趣的同学可以对此工具类进行扩展。

核心代码

/*** @version V1.0* @Author: Vachel Wang* @Date: 2017/5/2* @Time: 下午8:19* @Description: 列的内容*/
public abstract class AbstractExcelData {private Object data;private Integer rowIndex;private Integer colIndex;private Integer colWidth;private Integer rowHeight;private Integer sheetIndex;private ExportExcelCustom exportExcelCustom;private ExcelConfigExt excelConfigExt;private static final Logger LOG = LoggerFactory.getLogger(AbstractExcelData.class);/*** @param exportExcelCustom 处理Excel对象* @param data              数据* @param colIndex          列坐标* @param rowIndex          行坐标* @param colWidth          列宽* @param rowHeight         行高* @param sheetIndex        sheet下标* @param excelConfigExt    扩展配置*/public AbstractExcelData(ExportExcelCustom exportExcelCustom, Object data, Integer colIndex, Integer rowIndex, Integer colWidth, Integer rowHeight, Integer sheetIndex, ExcelConfigExt excelConfigExt) {this.setExportExcelCustom(exportExcelCustom);this.setData(data);this.setRowIndex(rowIndex);this.setColIndex(colIndex);this.setColWidth(colWidth);this.setRowHeight(rowHeight);this.setSheetIndex(sheetIndex);if (excelConfigExt == null)excelConfigExt = new ExcelConfigExt();this.setExcelConfigExt(excelConfigExt);}public abstract void fillData();public Integer getSheetIndex() {return sheetIndex;}public void setSheetIndex(Integer sheetIndex) {this.sheetIndex = sheetIndex;}public Object getData() {return data;}public void setData(Object data) {this.data = data;}public Integer getRowIndex() {return rowIndex;}public void setRowIndex(Integer rowIndex) {this.rowIndex = rowIndex;}public Integer getColIndex() {return colIndex;}public void setColIndex(Integer colIndex) {this.colIndex = colIndex;}public Integer getColWidth() {return colWidth;}public void setColWidth(Integer colWidth) {this.colWidth = colWidth;}public Integer getRowHeight() {return rowHeight;}public void setRowHeight(Integer rowHeight) {this.rowHeight = rowHeight;}public ExportExcelCustom getExportExcelCustom() {return exportExcelCustom;}public void setExportExcelCustom(ExportExcelCustom exportExcelCustom) {this.exportExcelCustom = exportExcelCustom;}public ExcelConfigExt getExcelConfigExt() {return excelConfigExt;}public void setExcelConfigExt(ExcelConfigExt excelConfigExt) {this.excelConfigExt = excelConfigExt;}
}
/*** @Author: Vachel Wang* @Date: 2017/5/3下午7:42* @Version: V1.0* @Description: 设值font必须要在设值cellStyle之前*/
public class ExcelConfigExt {// 新创建sheet名称private String newSheetName;// 字体样式private XSSFFont font;// 单元格样式private XSSFCellStyle cellStyle;public String getNewSheetName() {return newSheetName;}public void setNewSheetName(String newSheetName) {this.newSheetName = newSheetName;}public XSSFFont getFont() {return font;}public void setFont(XSSFFont font) {this.font = font;if(this.cellStyle!=null){this.cellStyle.setFont(this.font);}}public XSSFCellStyle getCellStyle() {return cellStyle;}public void setCellStyle(XSSFCellStyle cellStyle) {this.cellStyle = cellStyle;this.cellStyle.setFont(font);}
}
/*** @Author: Vachel Wang* @Date: 2017/5/2* @Time: 下午8:27* @Version: V1.0* @Description: 图片内容*/
public class ExcelPictureData extends AbstractExcelData {/*** @param exportExcelCustom 处理Excel对象* @param data              数据内容* @param startColIndex     开始列坐标* @param startRowIndex     开始行坐标* @param endColIndex       结束列坐标* @param endRowIndex       结束行坐标* @param colWidth          列宽* @param rowHeight         行高* @param sheetIndex        sheet下标* @param excelConfigExt    扩展配置*/public ExcelPictureData(ExportExcelCustom exportExcelCustom, byte[] data, int startColIndex, int startRowIndex, int endColIndex, int endRowIndex, Integer colWidth, Integer rowHeight, Integer sheetIndex, ExcelConfigExt excelConfigExt) {super(exportExcelCustom, data, startColIndex, startRowIndex, colWidth, rowHeight, sheetIndex, excelConfigExt);this.startColIndex = startColIndex;this.startRowIndex = startRowIndex;this.endColIndex = endColIndex;this.endRowIndex = endRowIndex;}private Integer startRowIndex;private Integer endRowIndex;private Integer startColIndex;private Integer endColIndex;public Integer getStartRowIndex() {return startRowIndex;}public void setStartRowIndex(Integer startRowIndex) {this.startRowIndex = startRowIndex;this.setRowIndex(startRowIndex);}public Integer getEndRowIndex() {return endRowIndex;}public void setEndRowIndex(Integer endRowIndex) {this.endRowIndex = endRowIndex;}public Integer getStartColIndex() {return startColIndex;}public void setStartColIndex(Integer startColIndex) {this.startColIndex = startColIndex;this.setColIndex(startColIndex);}public Integer getEndColIndex() {return endColIndex;}public void setEndColIndex(Integer endColIndex) {this.endColIndex = endColIndex;}@Overridepublic void fillData() {this.getExportExcelCustom().fillPictureData(this);}
}
/*** @Author: Vachel Wang* @Date: 2017/5/2* @Time: 下午8:30* @Version: V1.0* @Description: 多行内容*/
public class ExcelRowMultiData extends AbstractExcelData {/*** @param exportExcelCustom 处理excel对象* @param rowData           行内容* @param colIndex          列坐标* @param rowIndex          行坐标* @param colWidth          列宽* @param rowHeight         行高* @param sheetIndex        sheet下标* @param excelConfigExt    扩展配置*/public ExcelRowMultiData(ExportExcelCustom exportExcelCustom, List<ArrayList<AbstractExcelData>> rowData, Integer colIndex, Integer rowIndex, Integer colWidth, Integer rowHeight, Integer sheetIndex, ExcelConfigExt excelConfigExt) {super(exportExcelCustom, rowData, colIndex, rowIndex, colWidth, rowHeight, sheetIndex, excelConfigExt);}@Overridepublic void fillData() {this.getExportExcelCustom().fillRowMultiData(this);}
}
/*** @Author: Vachel Wang* @Date: 2017/5/2* @Time: 下午8:29* @Version: V1.0* @Description: 单行内容*/
public class ExcelRowSignData extends AbstractExcelData {/*** @param exportExcelCustom 处理excel对象* @param rowData           数据内容* @param colIndex          填充列坐标* @param rowIndex          填充行坐标* @param colWidth          列宽* @param rowHeight         行高* @param sheetIndex        sheet下标* @param excelConfigExt    扩展配置*/public ExcelRowSignData(ExportExcelCustom exportExcelCustom, List<AbstractExcelData> rowData, Integer colIndex, Integer rowIndex, Integer colWidth, Integer rowHeight, Integer sheetIndex, ExcelConfigExt excelConfigExt) {super(exportExcelCustom, rowData, colIndex, rowIndex, colWidth, rowHeight, sheetIndex, excelConfigExt);}@Overridepublic void fillData() {this.getExportExcelCustom().fillRowSignData(this);}
}
/*** @Author: Vachel Wang* @Date: 2017/5/2* @Time: 下午8:24* @Version: V1.0* @Description: 单列内容,内容暂时未做限制,仅支持*/
public class ExcelTextData extends AbstractExcelData {/*** @param exportExcelCustom 处理excel对象* @param data              数据* @param colIndex          列坐标* @param rowIndex          行坐标* @param colWidth          列宽* @param rowHeight         行高* @param sheetIndex        sheet下标* @param excelConfigExt    扩展配置*/public ExcelTextData(ExportExcelCustom exportExcelCustom, Object data, Integer colIndex, Integer rowIndex, Integer colWidth, Integer rowHeight, Integer sheetIndex, ExcelConfigExt excelConfigExt) {super(exportExcelCustom, data, colIndex, rowIndex, colWidth, rowHeight, sheetIndex, excelConfigExt);}@Overridepublic void fillData() {this.getExportExcelCustom().fillTextData(this);}}
/*** @Author: Vachel Wang* @Date: 2017/5/2* @Time: 下午8:28* @Version: V1.0* @Description: 标题内容*/
public class ExcelTitleData extends AbstractExcelData {/*** @param exportExcelCustom 处理excel对象* @param dataArr           数据* @param colIndex          列坐标* @param rowIndex          行坐标* @param colWidth          列宽* @param rowHeight         行高* @param sheetIndex        sheetIndex* @param excelConfigExt    扩展配置*/public ExcelTitleData(ExportExcelCustom exportExcelCustom, String[] dataArr, Integer colIndex, Integer rowIndex, Integer colWidth, Integer rowHeight, Integer sheetIndex, ExcelConfigExt excelConfigExt) {super(exportExcelCustom, dataArr, colIndex, rowIndex, colWidth, rowHeight, sheetIndex, excelConfigExt);}@Overridepublic void fillData() {this.getExportExcelCustom().fillExcelTitleData(this);}
}
/*** @Author: Vachel Wang* @Date: 2017/5/2* @Time: 下午8:28* @Version: V1.0* @Description: 重构自定义导出* 1.具体导出规则由子类实现,方便后期维护和添加导出其它格式,符合开闭原则* 2.重构代码结构去掉冗余代码,优化导出方式*/
public interface ExportExcelCustom {/*** 模板替换字符串*/String REPLACE_CHAR = "%s";/*** 高度换算率=1px*/double HEIGIT_TIMES = 15.625;/*** 宽度度换算率=1px*/double WIDTH_TIMES = 35.7;/*** 导出** @param fileName 文件名* @param response response*/void export(String fileName, HttpServletResponse response);/*** 填充文本数据** @param textData 数据*/void fillTextData(ExcelTextData textData);/*** 填充图片数据** @param pictureData 数据*/void fillPictureData(ExcelPictureData pictureData);/*** 填充单行数据** @param rowSignData 数据*/void fillRowSignData(ExcelRowSignData rowSignData);/*** 填充多行数据** @param rowMultiData 数据*/void fillRowMultiData(ExcelRowMultiData rowMultiData);/*** 填充标题数据** @param titleData 数据*/void fillExcelTitleData(ExcelTitleData titleData);/*** 获取Workbook对象** @return Workbook*/Workbook getWorkbook();
}
/*** 通过自定义模板导出excel 仅支持导出xlsx格式** @author Vachel.Wang* @version V1.1* @date 2016年7月4日 下午1:52:23*/
public class ExportExcelCustomXlsx implements ExportExcelCustom {private XSSFWorkbook workbook = null;private static final Logger LOG = LoggerFactory.getLogger(ExportExcelCustomXlsx.class);private Map<String,XSSFFont> fontMap = null ;private Map<String,XSSFCellStyle> styleMap = null ;/*** 构造** @param templatePath*            模板路径,可填项* @throws IOException* @throws InvalidFormatException*/public ExportExcelCustomXlsx(String templatePath) throws IOException, InvalidFormatException {if (templatePath == null) {workbook = new XSSFWorkbook();} else {File file = new File(templatePath);if (!file.exists())throw new IOException("文件不存在:" + templatePath);workbook = (XSSFWorkbook) WorkbookFactory.create(file);}styleMap = ExcelStyleEnum.setWorkbookStyle(workbook);fontMap = ExcelFontEnum.setWorkbookFont(workbook);}/*** 导出** @param fileName* @param response*/@Overridepublic void export(String fileName, HttpServletResponse response) {OutputStream outputStream = null;try {response.reset();response.setContentType("application/octet-stream; charset=utf-8");response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));outputStream = response.getOutputStream();workbook.write(outputStream);} catch (IOException e) {LOG.info(e.getMessage(), e);throw new GenericException("导出excel异常");} finally {try {if (null != outputStream) {outputStream.flush();outputStream.close();}} catch (IOException e) {LOG.info(e.getMessage(), e);}}}/*** 根据下标获取sheet,如果不存在则创建** @param sheetIndex* @param newSheetName* @return*/private XSSFSheet getSheet(Integer sheetIndex, String newSheetName) {XSSFSheet sheet;if (workbook.getNumberOfSheets() < (sheetIndex + 1)) {if (newSheetName == null)newSheetName = "newsheet" + (sheetIndex + 1);sheet = workbook.createSheet(newSheetName);} else {sheet = workbook.getSheetAt(sheetIndex);}return sheet;}/*** 根据行下标获取Row不存在则创建** @param sheet* @param rowIndex* @return*/private XSSFRow getRow(XSSFSheet sheet, Integer rowIndex) {XSSFRow row = sheet.getRow(rowIndex);if (row == null)row = sheet.createRow(rowIndex);return row;}/*** 插入一行** @param sheet* @param rowIndex* @return*/private XSSFRow createRow(XSSFSheet sheet, Integer rowIndex) {XSSFRow row = null;if (sheet.getRow(rowIndex) != null) {int lastRowNo = sheet.getLastRowNum();sheet.shiftRows(rowIndex, lastRowNo, 1);}row = sheet.createRow(rowIndex);return row;}/*** 根据下标获取cell不存在则创建** @param row* @param colIndex* @return*/private XSSFCell getCell(XSSFRow row, Integer colIndex) {XSSFCell cell = row.getCell(colIndex);if (cell == null)cell = row.createCell(colIndex);return cell;}/*** 设置单元格宽高度** @param abstractExcelData* @param sheet* @param row*/private void setWidthAndHeight(AbstractExcelData abstractExcelData, XSSFSheet sheet, XSSFRow row) {if (abstractExcelData.getRowHeight() != null)row.setHeight((short) (HEIGIT_TIMES * abstractExcelData.getRowHeight()));if (abstractExcelData.getColWidth() != null)sheet.setColumnWidth(abstractExcelData.getColIndex(), (short) (WIDTH_TIMES * abstractExcelData.getColWidth()));}@Overridepublic void fillTextData(ExcelTextData textData) {// 获取sheetXSSFSheet sheet = getSheet(textData.getSheetIndex(), textData.getExcelConfigExt().getNewSheetName());// 获取rowXSSFRow row = getRow(sheet, textData.getRowIndex());// 获取cellXSSFCell cell = getCell(row, textData.getColIndex());// 设置尺寸setWidthAndHeight(textData, sheet, row);// 填充数据fillCellContent(cell, textData.getData(), textData.getExcelConfigExt());}@Overridepublic void fillPictureData(ExcelPictureData pictureData) {// 获取sheetXSSFSheet sheet = getSheet(pictureData.getSheetIndex(), pictureData.getExcelConfigExt().getNewSheetName());// 获取rowXSSFRow row = getRow(sheet, pictureData.getStartRowIndex());// 获取cellXSSFCell cell = getCell(row, pictureData.getStartColIndex());// 设置尺寸setWidthAndHeight(pictureData, sheet, row);// 填充数据fillCellPicture(sheet, pictureData);}@Overridepublic void fillRowSignData(ExcelRowSignData rowSignData) {List<AbstractExcelData> rowData = (List<AbstractExcelData>) rowSignData.getData();XSSFSheet sheet = getSheet(rowSignData.getSheetIndex(), rowSignData.getExcelConfigExt().getNewSheetName());createRow(sheet, rowSignData.getRowIndex());for (int j = 0; j < rowData.size(); j++) {AbstractExcelData abstractExcelData = rowData.get(j);// 图片if (abstractExcelData instanceof ExcelPictureData) {ExcelPictureData pictureData = (ExcelPictureData) abstractExcelData;pictureData.setStartColIndex(rowSignData.getColIndex() + j);pictureData.setEndColIndex(rowSignData.getColIndex() + j + 1);pictureData.setStartRowIndex(rowSignData.getRowIndex());pictureData.setEndRowIndex(rowSignData.getRowIndex() + 1);pictureData.setSheetIndex(rowSignData.getSheetIndex());} else if (abstractExcelData instanceof ExcelTextData) { // 文本ExcelTextData excelTextData = (ExcelTextData) abstractExcelData;excelTextData.setColIndex(rowSignData.getColIndex() + j);excelTextData.setRowIndex(rowSignData.getRowIndex());excelTextData.setSheetIndex(rowSignData.getSheetIndex());}abstractExcelData.fillData();}}@Overridepublic void fillRowMultiData(ExcelRowMultiData rowMultiData) {List<ArrayList<AbstractExcelData>> multiData = (List<ArrayList<AbstractExcelData>>) rowMultiData.getData();// 行for (int k = 0; k < multiData.size(); k++) {ArrayList<AbstractExcelData> columnDataList = multiData.get(k);ExcelRowSignData signData = new ExcelRowSignData(rowMultiData.getExportExcelCustom(), columnDataList,rowMultiData.getColIndex(), rowMultiData.getRowIndex() + k, rowMultiData.getColWidth(),rowMultiData.getRowHeight(), rowMultiData.getSheetIndex(), rowMultiData.getExcelConfigExt());signData.fillData();}}@Overridepublic void fillExcelTitleData(ExcelTitleData titleData) {if (titleData.getExcelConfigExt().getFont() == null) {/* 默认标题字体 */XSSFFont titleFont = fontMap.get(ExcelFontEnum.TITLE_SIZE16_BLOLD.toString());titleData.getExcelConfigExt().setFont(titleFont);}if (titleData.getExcelConfigExt().getCellStyle() == null) {/* 默认标题样式 */XSSFCellStyle titleStyle = styleMap.get(ExcelStyleEnum.STYLE_ALIGN_CENTER_VERTICAL_CENTER_BORDER.toString());titleData.getExcelConfigExt().setCellStyle(titleStyle);}// 获取sheetXSSFSheet sheet = getSheet(titleData.getSheetIndex(), titleData.getExcelConfigExt().getNewSheetName());// 获取rowXSSFRow row = getRow(sheet, titleData.getRowIndex());String[] titleDataArr = (String[]) titleData.getData();for (int i = 0; i < titleDataArr.length; i++) {XSSFCell cell = getCell(row, titleData.getColIndex() + i);cell.setCellValue(titleDataArr[i]);cell.setCellStyle(titleData.getExcelConfigExt().getCellStyle());}}/*** 填充内容** @param cell* @param data*/private void fillCellContent(XSSFCell cell, Object data, ExcelConfigExt configExt) {if (cell == null)return;if (data == null) {String cellData = getStringCellValue(cell);cell.setCellValue(cellData.replaceAll(REPLACE_CHAR, ""));return;}String cellData = getStringCellValue(cell);// 字符串if (data instanceof String) {String strData = data.toString();if (cellData.indexOf(REPLACE_CHAR) != -1) {cellData = String.format(cellData, strData.split(";"));} else {cellData += strData;}cell.setCellValue(cellData);}// 整数else if (data instanceof Integer) {Integer integerData = (Integer) data;if (cellData.equals("")) {cell.setCellValue(integerData);} else if (cellData.indexOf(REPLACE_CHAR) != -1) {cellData = cellData.replaceAll(REPLACE_CHAR, String.valueOf(integerData));cell.setCellValue(cellData);} else {cell.setCellValue(integerData);}}// 长整数else if (data instanceof Long) {Long longData = (Long) data;if (cellData.equals("")) {cell.setCellValue(longData);} else if (cellData.indexOf(REPLACE_CHAR) != -1) {cellData = cellData.replaceAll(REPLACE_CHAR, String.valueOf(longData));cell.setCellValue(cellData);} else {cell.setCellValue(longData);}}// 小数else if (data instanceof Double) {Double doubleData = (Double) data;if (cellData.equals("")) {cell.setCellValue(doubleData);} else if (cellData.indexOf(REPLACE_CHAR) != -1) {cellData = cellData.replaceAll(REPLACE_CHAR, String.valueOf(doubleData));cell.setCellValue(cellData);} else {cell.setCellValue(doubleData);}}// 时间else if (data instanceof Date) {Date dateData = (Date) data;if (cellData.equals("")) {cell.setCellValue(dateData);} else if (cellData.indexOf(REPLACE_CHAR) != -1) {cellData = cellData.replace(REPLACE_CHAR, DateUtil.formatYYYYMMDDHHMMSS(dateData));cell.setCellValue(cellData);} else {cell.setCellValue(DateUtil.formatYYYYMMDDHHMMSS(dateData));}}// 数组else if (data instanceof String[]) {String[] strArr = (String[]) data;String str = "";if (cellData.equals("")) {for (String s : strArr) {str += "," + s;}if (str.length() > 0)str = str.substring(1);} else if (cellData.indexOf(REPLACE_CHAR) != -1) {str = String.format(cellData, strArr);}cell.setCellValue(str);}// 其它else {cell.setCellValue(data + "");}cell.setCellStyle(configExt.getCellStyle());}/*** 填充图片** @param sheet* @param pictureData*/private void fillCellPicture(XSSFSheet sheet, ExcelPictureData pictureData) {if (pictureData == null || pictureData.getData() == null)return;byte bytes[] = (byte[]) pictureData.getData();int pictureIdx = workbook.addPicture(bytes, XSSFWorkbook.PICTURE_TYPE_JPEG);Drawing drawing = sheet.createDrawingPatriarch();XSSFClientAnchor anchor = new XSSFClientAnchor(0, 0, 255, 255, pictureData.getStartColIndex(),pictureData.getStartRowIndex(), pictureData.getEndColIndex(), pictureData.getEndRowIndex());drawing.createPicture(anchor, pictureIdx);}@Overridepublic XSSFWorkbook getWorkbook() {return workbook;}}
/*** Excel 样式枚举* @author Vachel Wang*/
public enum ExcelFontEnum {TITLE_SIZE16_BLOLD((short)16,null,"Courier New",true,false,false,FontUnderline.NONE),CONTENT_SIZE12((short)12,null,"Courier New",false,false,false,FontUnderline.NONE),CONTENT_SIZE12_BLOLD((short)12,null,"Courier New",true,false,false,FontUnderline.NONE),CONTENT_SIZE12_BLOLD_UNDERLINE((short)12,null,"Courier New",true,false,false,FontUnderline.SINGLE),;ExcelFontEnum(Short fontSize, XSSFColor fontColor , String fontName, Boolean bold, Boolean italic, Boolean strikeout,FontUnderline fontUnderline) {if(fontSize!=null)this.fontSize = fontSize;if(fontColor!=null)this.fontColor = fontColor;if(fontName!=null)this.fontName = fontName;if(bold!=null)this.bold = bold;if(italic!=null)this.italic = italic;if(strikeout!=null)this.strikeout = strikeout;if(fontUnderline!=null)this.fontUnderline = fontUnderline;}// 字体大小private Short fontSize = 12 ;// 字体颜色private XSSFColor fontColor = new XSSFColor(new Color(0,0,0,1)) ;// 字体名private String fontName = "Courier New" ;// 是否加粗private Boolean bold = false ;// 斜体private Boolean italic = false ;// 删除线private Boolean strikeout = false ;// 下划样式private FontUnderline fontUnderline = FontUnderline.NONE ;public static Map<String,XSSFFont> setWorkbookFont(XSSFWorkbook workbook){Map<String,XSSFFont> fontMap = new HashMap<>() ;for(ExcelFontEnum fontEnum : ExcelFontEnum.values()){XSSFFont font = workbook.createFont() ;font.setFontHeightInPoints(fontEnum.fontSize);font.setColor(fontEnum.fontColor);font.setFontName(fontEnum.fontName);font.setBold(fontEnum.bold);font.setItalic(fontEnum.italic);font.setStrikeout(fontEnum.strikeout);font.setUnderline(fontEnum.fontUnderline);fontMap.put(fontEnum.toString(),font) ;}return fontMap ;}}
/*** Excel 样式枚举* @author Vachel Wang*/
public enum ExcelStyleEnum {STYLE_ALIGN_CENTER_VERTICAL_CENTER_BORDER(CellStyle.ALIGN_CENTER,CellStyle.VERTICAL_CENTER,new XSSFColor(new java.awt.Color(220,220,220)),CellStyle.SOLID_FOREGROUND,new XSSFColor(new java.awt.Color(0,0,0)), BorderStyle.THIN),STYLE_ALIGN_LEFT_VERTICAL_CENTER(CellStyle.ALIGN_LEFT,CellStyle.VERTICAL_CENTER,new XSSFColor(new java.awt.Color(220,220,220)),CellStyle.SOLID_FOREGROUND,null,null),;ExcelStyleEnum(Short alignment, Short verticalAlignment, XSSFColor fillForegroundColor, Short fillPattern,XSSFColor borderColor,BorderStyle borderStyle) {if(alignment!=null)this.alignment = alignment;if(verticalAlignment!=null)this.verticalAlignment = verticalAlignment;if(fillForegroundColor!=null)this.fillForegroundColor = fillForegroundColor;if(fillPattern!=null)this.fillPattern = fillPattern;if(borderColor!=null)this.borderColor = borderColor;if(borderStyle!=null)this.borderStyle = borderStyle;}// 水平对齐方式private Short alignment = CellStyle.ALIGN_LEFT ;// 垂直对齐方式private Short verticalAlignment = CellStyle.VERTICAL_BOTTOM ;// 前景色private XSSFColor fillForegroundColor = null ;// 前景色填充模式private Short fillPattern = CellStyle.SOLID_FOREGROUND;// 边框颜色private XSSFColor borderColor = null ;// 边框样式private BorderStyle borderStyle = BorderStyle.NONE ;public static Map<String,XSSFCellStyle> setWorkbookStyle(XSSFWorkbook workbook){Map<String,XSSFCellStyle> styleMap = new HashMap<>() ;for(ExcelStyleEnum styleEnum : ExcelStyleEnum.values()){XSSFCellStyle cellStyle = workbook.createCellStyle();cellStyle.setAlignment(styleEnum.alignment);cellStyle.setVerticalAlignment(styleEnum.verticalAlignment);cellStyle.setFillForegroundColor(styleEnum.fillForegroundColor);cellStyle.setFillPattern(styleEnum.fillPattern);if(styleEnum.borderColor!=null){cellStyle.setBottomBorderColor(styleEnum.borderColor);cellStyle.setTopBorderColor(styleEnum.borderColor);cellStyle.setLeftBorderColor(styleEnum.borderColor);cellStyle.setRightBorderColor(styleEnum.borderColor);}if(styleEnum.borderStyle!=null){cellStyle.setBorderBottom(styleEnum.borderStyle);cellStyle.setBorderTop(styleEnum.borderStyle);cellStyle.setBorderRight(styleEnum.borderStyle);cellStyle.setBorderLeft(styleEnum.borderStyle);}styleMap.put(styleEnum.toString(),cellStyle);}return styleMap;}}

Java模板导出Excel相关推荐

  1. java使用模板导出Excel表格

    java使用模板导出Excel表格 文章目录 java使用模板导出Excel表格 模板示例 一.引入依赖 二.使用步骤 1.添加工具类 2.导出Excel 模板示例 一.引入依赖 <depend ...

  2. java poi导出excel模板_POI通过模板导出EXCEL文件的实例

    一般的EXCEL导出使用POI先创建一个HSSFWorkbook,然后通过不断创建HSSFRow,HSSFCell后设置单元格内容便可以完成导出. 这次在项目中需要用到模板,导出的内容包括(1.模板中 ...

  3. java easypoi使用模板导出Excel,合并单元格

    工作几年,每年都有java数据导出Excel的需求,从最初的POI到公司封装的工具再到阿里的EasyExcel.总是有这个那个的小痛点,最近发现easypoi比较满足工作需求,可以很好的导出数据并处理 ...

  4. java 动态导出excel表单 无模板文件下载

    java 动态导出excel表单 无模板文件下载 public ResponseEntity<byte[]> exportStanding(@PathVariable Long signu ...

  5. java 动态导出excel表单 无模板本地生成

    java 动态导出excel表单 无模板本地生成 这里使用的是alibaba的公共类excelWriter,注意在pom文件中要引入easyExcel的依赖 public void exportExc ...

  6. java 根据excel模板导出excel

    java 根据excel模板导出excel 由于项目需求,最近做了一个需要根据查询接口导出excel表格数据的需求 pom依赖: <dependency><groupId>or ...

  7. java 分析excel模板,java 根据excel模板导出excel

    java 根据excel模板导出excel 由于项目需求,最近做了一个需要根据查询接口导出excel表格数据的需求 pom依赖: org.apache.poi poi 3.16 org.apache. ...

  8. java实现导出Excel多行表头复杂模板

    java实现导出Excel多行表头复杂模板 一般我们都会选择poi来导出,选择一个比较好的ExcelUtils 但是对于初学者而言不了解poi的,还需从poi API文档去学习,如果是自学的话更好,如 ...

  9. springboot使用jxls导出excel___(万能通用模板)--- SpringBoot导入、导出Excel文件___SpringBoot整合EasyExcel模板导出Excel

    springboot使用jxls导出excel 实现思路: 首先在springBoot(或者SpringCloud)项目的默认templates目录放入提前定义好的Excel模板,然后在具体的导出接口 ...

最新文章

  1. Python:模拟登录、点击和执行 JavaScript 语句案例
  2. leetcode算法题--三数之和
  3. 学习笔记----周志华《机器学习》第五章(神经网络)(一)
  4. Vuex新手的理解与使用
  5. 我的asp.net学习心得
  6. win7 32位 安装opencv-python后,运行时提示 from .cv2 import *: DLL load failed: 找不到指定的模块 的解决办法...
  7. 噪声与振动控制工程手册_仨亿技术丨工程机械噪声与控制分析
  8. 飞畅科技——视频光端机用光模块的选型详解
  9. MlLib--逻辑回归笔记
  10. 【Python学习】 - sklearn学习 - 数据集分割方法 - 随机划分与K折交叉划分与StratifiedKFold与StratifiedShuffleSplit
  11. Django创建第一个应用
  12. SPOJ COT Count on a tree 主席树
  13. linux svn 面板,Linux下SVN服务器搭建(CentOS+Subversion)
  14. npm 常见用法小结
  15. linux木马查杀工具,【Kali】linux木马查杀
  16. 数学建模-数学规划模型
  17. 自动驾驶(八十一)---------Apollo之感知模块
  18. yolo v4 weights 权重
  19. 十分透彻:电容去耦原理
  20. 麒麟系统ip连接数据库

热门文章

  1. 千万不要天真的以为努力就可以成功,埋头走路,也要抬头看天。
  2. java listfiles方法_JAVA IO流:File方法listFiles()文件过滤器
  3. dfs算法详解(n皇问题实现)
  4. csdn中c币、积分 获取方法
  5. RK3399 系列 U-BOOT (U-Boot 2014.10)
  6. 如何清理卸下应用的残余文件_怎么清理CorelDRAW卸载残余文件
  7. 数字形态学-QRS波中的R波检测
  8. PCB 720全景图嵌入登入界面应用实现
  9. mate10鸿蒙系统升级,华为Mate10怎么升级鸿蒙系统 Mate10升级鸿蒙系统教程
  10. 2021丹东二中高考14班成绩查询,2021年丹东中考成绩和分数线什么时候公布(附查询入口)...