由于导出excel表格功能在公司是非常常见的需求,但是实现的方式有很多种,大多数实现的代码过于复杂且臃肿,特别是在处理跨行跨列的时候,需要自己动态的计算,导致增加了复杂性,本人在工作遇到了这种情况,并对原有的excel模板进行了封装改造。

优势:使用本案例你可以简单快速的实现导出excel的功能,提高开发效率、简化代码,在遇到复杂跨行跨列的时候也可以从容处理,并且你可以指定每列的宽度让用户能更方便使用,你只需要通过遍历原始数据来构建excel模型数据即可,不啰嗦了,先看效果。

上图中实现类跨行,跨列,途中的跨列的数据,理论上是在第一行显示,但由于是demo所以就没处理了。

excel导出controller实现类

/***** @description 下载报表数据demo* @author jxp* @param request* @param response* @param dialysisCampaignPO* @return*/@RequestMapping("/downloadExample")@ResponseBodypublic void downloadExample(HttpServletRequest request, HttpServletResponse response) throws IOException {ReportExcelRowModelTemplate excel = new ReportExcelRowModelTemplate();String[] sheetNames = { "药品出入库明细" };String[] colNames = { "患者姓名", "日期", "药品名称", "规格", "出库", "入库", "当前库存", "执行人" };List<List<ReportRowModel>> dataRows = Lists.newArrayList();//构建excel导出模型数据//构建第一行为跨列数据List<ReportRowModel> cols = Lists.newArrayList();cols.add(new ReportRowModel("基础信息", 1, 2));cols.add(new ReportRowModel("基础信息", 1, 1));cols.add(new ReportRowModel("药品信息", 1, 2));cols.add(new ReportRowModel("药品信息", 1, 1));//开始跨列,不同HTML的table元素,excel的跨行跨列被跨行或跨列的单元格仍需要保持元素存在,因为excel要根据单元格的下标后续结构,因此我们只需让excel单元格占位即可cols.add(new ReportRowModel("库存信息", 1, 3));cols.add(new ReportRowModel("库存信息", 1, 1));//保留单元格占位,目的是获取单元格时没有下标异常cols.add(new ReportRowModel("库存信息", 1, 1));cols.add(new ReportRowModel("执行人", 1, 1));dataRows.add(cols);List<ReportRowModel> rows = Lists.newArrayList();rows.add(new ReportRowModel("龚圆圆", 1, 1));rows.add(new ReportRowModel("2020-07-02 08:40", 1, 1));rows.add(new ReportRowModel("依诺肝素钠注射液(依喏佳)", 1, 1));rows.add(new ReportRowModel("4000IU", 1, 1));rows.add(new ReportRowModel("1", 1, 1));rows.add(new ReportRowModel("8", 1, 1));rows.add(new ReportRowModel("7", 1, 1));rows.add(new ReportRowModel("甘丽娇", 1, 1));dataRows.add(rows);List<ReportRowModel> rows1 = Lists.newArrayList();//同理跨行的实现,开始跨行rows1.add(new ReportRowModel("龚国文", 2, 1));//跨行实现rows1.add(new ReportRowModel("2020-07-02 08:40", 1, 1));rows1.add(new ReportRowModel("依诺肝素钠注射液(依喏佳)", 1, 1));rows1.add(new ReportRowModel("4000IU", 1, 1));rows1.add(new ReportRowModel("1", 1, 1));rows1.add(new ReportRowModel("8", 1, 1));rows1.add(new ReportRowModel("7", 1, 1));rows1.add(new ReportRowModel("甘丽娇", 1, 1));dataRows.add(rows1);List<ReportRowModel> rows2 = Lists.newArrayList();rows2.add(new ReportRowModel("龚国文", 1, 1));//保留单元格占位rows2.add(new ReportRowModel("2020-07-02 08:40", 1, 1));rows2.add(new ReportRowModel("左卡尼汀注射液", 1, 1));rows2.add(new ReportRowModel("4000IU", 1, 1));rows2.add(new ReportRowModel("1", 1, 1));rows2.add(new ReportRowModel("8", 1, 1));rows2.add(new ReportRowModel("7", 1, 1));rows2.add(new ReportRowModel("甘丽娇", 1, 1));dataRows.add(rows2);Integer[] colWidths = { 10, 17, 30, 10, 7, 7, 10, 8 };int rowNum = 0;// 设置自定义列宽HSSFSheet[] sheet = excel.createSheetWithSelf(sheetNames, 18, 15, Arrays.asList(colWidths));rowNum = excel.createHeadRowWithRowModel(0, rowNum, colNames, "药品出入库明细");rowNum = excel.createContentWithRowModel(0, rowNum, dataRows);sheet[0].autoSizeColumn(1, true);excel.writeToOutStream(request, response, "药品出入库明细" + ".xls");}

excel导出模板类:ReportExcelRowModelTemplate

/**   * @Title: ExcelReportUtil.java * @Package com.xtt.txgl.report.util* Copyright: Copyright (c) 2015* @author: bruce   * @date: 2016年5月30日 上午9:01:26 **/
package com.xtt.txgl.report.util;import java.io.IOException;
import java.io.OutputStream;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Set;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apache.commons.lang.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFPalette;
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.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.util.CellRangeAddress;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import com.xtt.platform.util.lang.CollectionUtil;
import com.xtt.txgl.report.util.entity.ReportSheetEntity;
import com.xtt.txgl.report.vo.ReportRowModel;public class ReportExcelRowModelTemplate {protected Logger log = LoggerFactory.getLogger(getClass());private HSSFWorkbook wb;/** 标题样式 */private CellStyle titleStyle;/** 头部单元格样式 */private CellStyle headCellStyle;/** 奇数行单元格样式 */private CellStyle contentOddCellStyle;/** 偶数行单元格样式 */private CellStyle contentEvenCellStyle;public ReportExcelRowModelTemplate() {wb = new HSSFWorkbook();initStyle();}public ReportExcelRowModelTemplate(ReportSheetEntity[] sheetEntitys) {wb = new HSSFWorkbook();initStyle();for (ReportSheetEntity sheetEntity : sheetEntitys) {if (sheetEntity == null) {continue;}HSSFSheet sheet = createSheet(sheetEntity.getSheetName());// 创建sheetcreateTitle(sheet, sheetEntity);// 创建标题createHeadRow(sheet, sheetEntity);// 创建表头createContents(sheet, sheetEntity);// 创建表单内容}}/******************************************* 样式 start *******************************************//** 样式初始化 */private void initStyle() {{// 自定义颜色addCustomColor((short) 58, (byte) (192), (byte) (192), (byte) (192));// headlinecoloraddCustomColor((short) 59, (byte) (225), (byte) (225), (byte) (225));// contentlinecoloraddCustomColor((short) 60, (byte) 233, (byte) 234, (byte) 236);// headcoloraddCustomColor((short) 61, (byte) (254), (byte) (254), (byte) (254));// oddcoloraddCustomColor((short) 62, (byte) (246), (byte) (246), (byte) (246));// evencolor}{// 样式初始化titleStyle = generateTitleCellStyle();headCellStyle = generateHeadCellStyle();contentOddCellStyle = generateContentCellStyle(true);contentEvenCellStyle = generateContentCellStyle(false);}}/*** 自定义颜色,index须位于1到63之间;超出无效* * @Title: addCustomColor* @param index* @param r* @param g* @param b* */public void addCustomColor(short index, byte r, byte g, byte b) {HSSFPalette palette = this.wb.getCustomPalette();palette.setColorAtIndex(index, r, g, b);}/*** @Description: 初始化标题行样式*/private CellStyle generateTitleCellStyle() {Font titleFont = wb.createFont();titleFont.setFontName("宋体");titleFont.setFontHeightInPoints((short) 20);titleFont.setBoldweight(Font.BOLDWEIGHT_BOLD);titleFont.setCharSet(Font.DEFAULT_CHARSET);titleFont.setColor(IndexedColors.BLUE_GREY.index);CellStyle titleStyle = wb.createCellStyle();titleStyle.setAlignment(CellStyle.ALIGN_CENTER);titleStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);titleStyle.setFont(titleFont);titleStyle.setFillBackgroundColor(IndexedColors.SKY_BLUE.index);return titleStyle;}/*** @Description: 初始化表头行样式*/private CellStyle generateHeadCellStyle() {CellStyle style = wb.createCellStyle();Font font = wb.createFont();font.setFontName("宋体");font.setFontHeightInPoints((short) 11);font.setBoldweight(Font.BOLDWEIGHT_BOLD);font.setCharSet(Font.DEFAULT_CHARSET);font.setColor(HSSFColor.BLACK.index);style.setFont(font);style.setAlignment(CellStyle.ALIGN_CENTER);style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);// style.setFillBackgroundColor(HSSFColor.YELLOW.index);style.setFillForegroundColor((short) 60);style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);style.setBorderTop(CellStyle.BORDER_MEDIUM);style.setBorderBottom(CellStyle.BORDER_MEDIUM);style.setBorderLeft(CellStyle.BORDER_MEDIUM);style.setBorderRight(CellStyle.BORDER_MEDIUM);style.setTopBorderColor((short) 58);style.setBottomBorderColor((short) 58);style.setLeftBorderColor((short) 58);style.setRightBorderColor((short) 58);style.setWrapText(true);return style;}/*** @Description: 初始化内容行样式*/public CellStyle generateContentCellStyle(boolean isOdd) {CellStyle style = wb.createCellStyle();Font font = wb.createFont();font.setFontName("宋体");font.setFontHeightInPoints((short) 10);font.setBoldweight(Font.BOLDWEIGHT_NORMAL);font.setCharSet(Font.DEFAULT_CHARSET);font.setColor(HSSFColor.BLACK.index);style.setFont(font);style.setAlignment(CellStyle.ALIGN_CENTER);style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);if (isOdd) {// 奇数行style.setFillForegroundColor((short) 61);} else {style.setFillForegroundColor((short) 62);}style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);style.setBorderTop(CellStyle.BORDER_MEDIUM);style.setBorderBottom(CellStyle.BORDER_THIN);style.setBorderLeft(CellStyle.BORDER_THIN);style.setBorderRight(CellStyle.BORDER_THIN);style.setTopBorderColor((short) 59);style.setBottomBorderColor((short) 59);style.setLeftBorderColor((short) 59);style.setRightBorderColor((short) 59);style.setWrapText(true);return style;}/*** 获取excel头部单元格样式* * @Title: getContentCellStyle* @return* */public CellStyle getHeadCellStyle() {return headCellStyle;}/*** 获取正文单元格样式* * @Title: getContentCellStyle* @param isOdd*            (是否是奇数行)* @return* */public CellStyle getContentCellStyle(boolean isOdd) {if (isOdd) {return contentOddCellStyle;} else {return contentEvenCellStyle;}}/******************************************* 样式 end *******************************************//*** 批量创建sheet* * @Title: createSheets* @param sheetNames* */public void createSheets(String[] sheetNames) {for (String sheetName : sheetNames) {createSheet(sheetName);}}/*** 创建sheet* * @Title: createSheet* @param sheetName* */public HSSFSheet createSheet(String sheetName) {HSSFSheet sheet = wb.createSheet(sheetName);sheet.setDefaultColumnWidth(27);// 设置默认宽度return sheet;}/*** 创建sheet,并自定义列宽** @Title: createSheet* @param sheetName**/public HSSFSheet createSheetWithSelf(String sheetName, int width, Integer height, List<Integer> colWidth) {HSSFSheet sheet = wb.createSheet(sheetName);sheet.setDefaultColumnWidth(width);// 设置默认宽度if (height != null) {height = height * 20;sheet.setDefaultRowHeight(height.shortValue());}// 设置自定义列宽if (CollectionUtil.isNotEmpty(colWidth)) {for (int i = 0; i < colWidth.size(); i++) {sheet.setColumnWidth(i, colWidth.get(i) * 256);}}return sheet;}/*** 创建标题* * @Title: createTitle* @param sheet* @param sheetEntity* */public void createTitle(HSSFSheet sheet, ReportSheetEntity sheetEntity) {String title = sheetEntity.getTitle();if (StringUtils.isNotEmpty(title)) {int cellNum = sheetEntity.getHeadNames().length;// 判断是否需要序号,如果需要需要,需多合并一列if (sheetEntity.isHasRowNo()) {cellNum++;}CellRangeAddress titleRange = new CellRangeAddress(0, 0, 0, cellNum);sheet.addMergedRegion(titleRange);HSSFRow titleRow = createRow(sheet, sheetEntity);titleRow.setHeight(ReportRowModelConstants.TITLE_HEIGHT_800);HSSFCell titleCell = titleRow.createCell(0);titleCell.setCellStyle(titleStyle);titleCell.setCellValue(title);}}/*** 创建表头*/public void createHeadRow(HSSFSheet sheet, ReportSheetEntity sheetEntity) {// 表头HSSFRow headRow = createRow(sheet, sheetEntity);headRow.setHeight(ReportRowModelConstants.HEAD_HEIGHT_500);// 判断是否需要序号int cellNum = 0;if (sheetEntity.isHasRowNo()) {HSSFCell snCell = headRow.createCell(cellNum++);snCell.setCellStyle(headCellStyle);snCell.setCellValue("序号");}// 列头名称String[] headNames = sheetEntity.getHeadNames();for (int i = 0; i < headNames.length; i++, cellNum++) {HSSFCell cell = headRow.createCell(cellNum);cell.setCellStyle(headCellStyle);cell.setCellValue(headNames[i]);}}/*** 创建表单内容* * @Title: createContents* @param sheet* @param sheetEntity* */public void createContents(HSSFSheet sheet, ReportSheetEntity sheetEntity) {String[] columnNames = sheetEntity.getColumnNames();List<?> contents = sheetEntity.getContents();Set<String> mergeColumns = sheetEntity.getMergeColumnNames();// Class<T> clazz = sheetEntity.getClazz();for (int i = 0; i < contents.size(); i++) {Object content = contents.get(i);HSSFRow contentRow = createRow(sheet, sheetEntity);int cellNum = 0;if (sheetEntity.isHasRowNo()) {HSSFCell snCell = contentRow.createCell(cellNum++);snCell.setCellStyle(getContentCellStyle(sheet.getLastRowNum() % 2 == 0));snCell.setCellValue(i + 1);}for (String columnName : columnNames) {String getterMethodName = "get" + StringUtils.capitalize(columnName);if (getterMethodName.equals("getOkIndex")) {System.out.println(1);}String result = getContentValue(content, getterMethodName);HSSFCell contentCell = contentRow.createCell(cellNum);contentCell.setCellStyle(getContentCellStyle(sheet.getLastRowNum() % 2 == 0));contentCell.setCellValue(result);// 合并单元格int rowIndex = sheetEntity.getRowNum() - 1;// 每次创建行时自增1,所以需先-1,才是当前行坐标if (mergeColumns != null) {if (mergeColumns.contains(columnName)) {// 从第二行开始,比较是否和上一个相同,相同则已被合并,直接结束本次循环if (i > 0) {Object prevContent = contents.get(i - 1);String prevResult = getContentValue(prevContent, getterMethodName);if (prevResult.equals(result)) {rowIndex++;cellNum++;continue;}}// 当前行和下面合并,如果达标标示一致,则合并,不一致,跳出本次循环int rowspan = 0;for (int j = i + 1; j < contents.size(); j++) {Object nextContent = contents.get(j);String nextResult = getContentValue(nextContent, getterMethodName);if (nextResult.equals(result)) {rowspan++;} else {break;}}if (rowspan > 0) {CellRangeAddress cellRange = new CellRangeAddress(rowIndex, rowIndex + rowspan, cellNum, cellNum);sheet.addMergedRegion(cellRange);}}}cellNum++;}}}/*** 创建表单底部,一般用于汇总计算* * @Title: createFoot* @param sheet* @param sheetEntity* */public void createFoot(HSSFSheet sheet, ReportSheetEntity sheetEntity) {}// 获取表体内容private static String getContentValue(Object content, String getterMethodName) {Class<? extends Object> clazz = content.getClass();Object obj = null;String result = "";try {obj = clazz.getDeclaredMethod(getterMethodName).invoke(content);if (obj != null) {result = obj.toString();}} catch (Exception e) {if ((clazz = clazz.getSuperclass()) != null) {try {obj = (String) clazz.getDeclaredMethod(getterMethodName).invoke(content);if (obj != null) {result = obj.toString();}} catch (Exception e1) {e1.printStackTrace();}}}return result;}/*** 创建sheet页* * @Title: createSheet* @param sheetNames* @return* */public HSSFSheet[] createSheet(String[] sheetNames) {return createSheet(sheetNames, null);}/*** 创建sheet页* * @Title: createSheet* @param sheetNames* @param columnWidth* @return* */public HSSFSheet[] createSheet(String[] sheetNames, Integer columnWidth) {HSSFSheet[] sheets = new HSSFSheet[sheetNames.length];for (int i = 0; i < sheetNames.length; i++) {// sheet页 不支持"/"字符sheets[i] = createSheet(sheetNames[i]);}return sheets;}public HSSFSheet[] createSheetWithSelf(String[] sheetNames, Integer columnWidth, Integer height, List<Integer> colWidths) {HSSFSheet[] sheets = new HSSFSheet[sheetNames.length];for (int i = 0; i < sheetNames.length; i++) {// sheet页 不支持"/"字符sheets[i] = createSheetWithSelf(sheetNames[i], columnWidth, height, colWidths);}return sheets;}/*** 创建单个sheet页* * @Title: createSheet* @param sheetName* @param columnWidth* @return**/public HSSFSheet createSheet(String sheetName, Integer columnWidth) {// sheet页 不支持"/"字符HSSFSheet sheet = wb.createSheet(sheetName.replace("/", " "));if (columnWidth != null) {sheet.setDefaultColumnWidth(columnWidth);// 设置默认宽度} else {sheet.autoSizeColumn(1, true);// 设置自适应宽度}return sheet;}/*** 设置sheet页默认宽度* * @Title: setDefaultColumnWidth* @param sheetIndex**/public void setDefaultColumnWidth(int sheetIndex, Integer columnWidth) {wb.getSheetAt(sheetIndex).setDefaultColumnWidth(columnWidth);}/*** 创建行,且自增行索引下标* * @Title: createRow* @param sheet* @param sheetEntity* @return* */public HSSFRow createRow(HSSFSheet sheet, ReportSheetEntity sheetEntity) {HSSFRow row = sheet.createRow(sheetEntity.incrementRow());row.setHeight(ReportRowModelConstants.HEAD_HEIGHT_500);return row;}/*** 创建head行* * @Title: createHeadRow* @param sheetIndex第几个sheet页* @param rowNum起始行* @param colNames列名* @return rowNum* */public int createHeadRow(int sheetIndex, int rowNum, String[] colNames) {return createHeadRow(sheetIndex, rowNum, colNames, null);}/*** 创建head行* * @Title: createHeadRow* @param sheetIndex第几个sheet页* @param rowNum起始行* @param colNames列名* @param titleStr合并标题列*            (为空时不生成)* @return rowNum* */public int createHeadRow(int sheetIndex, int rowNum, String[] colNames, String titleStr) {HSSFSheet sheet = wb.getSheetAt(sheetIndex);if (StringUtils.isNotBlank(titleStr)) {// 生成日期行HSSFRow row = sheet.createRow(rowNum);for (int i = 0; i < colNames.length; i++) {row.setHeight((short) 500);row.createCell(i).setCellStyle(getHeadCellStyle());if (i == 0)row.getCell(i).setCellValue(titleStr);}sheet.addMergedRegion(new CellRangeAddress(rowNum, rowNum, 0, colNames.length - 1));rowNum++;}HSSFRow row = sheet.createRow(rowNum);for (int i = 0; i < colNames.length; i++) {row.setHeight((short) 500);row.createCell(i).setCellStyle(getHeadCellStyle());row.getCell(i).setCellValue(colNames[i]);}return ++rowNum;}/**** @description 单独创建excel标题* @author jxp        * @param sheetIndex * @param rowNum * @param excel 列的长度 * @param titleStr 标题* @return */public int createHeadTitle(int sheetIndex, int rowNum, int colLength, String titleStr) {HSSFSheet sheet = wb.getSheetAt(sheetIndex);sheet.setDefaultRowHeightInPoints(19);if (StringUtils.isNotBlank(titleStr)) {// 生成日期行HSSFRow row = sheet.createRow(rowNum);row.setHeight((short) 300);row.setHeightInPoints(19);row.createCell(0).setCellStyle(getHeadCellStyle());row.getCell(0).setCellValue(titleStr);sheet.addMergedRegion(new CellRangeAddress(rowNum, rowNum, 0, colLength - 1));rowNum++;}return rowNum;}/***** @description 同时创建标题与excel列* @author jxp        * @param sheetIndex * @param rowNum * @param colNames * @param titleStr* @return */public int createHeadRowWithRowModel(int sheetIndex, int rowNum, String[] colNames, String titleStr) {HSSFSheet sheet = wb.getSheetAt(sheetIndex);sheet.setDefaultRowHeightInPoints(19);if (StringUtils.isNotBlank(titleStr)) {// 生成日期行HSSFRow row = sheet.createRow(rowNum);row.setHeight((short) 300);row.setHeightInPoints(19);row.createCell(0).setCellStyle(getHeadCellStyle());row.getCell(0).setCellValue(titleStr);sheet.addMergedRegion(new CellRangeAddress(rowNum, rowNum, 0, colNames.length - 1));rowNum++;}HSSFRow row = sheet.createRow(rowNum);for (int i = 0; i < colNames.length; i++) {row.setHeight((short) 300);row.setHeightInPoints(19);row.createCell(i).setCellStyle(getHeadCellStyle());row.getCell(i).setCellValue(colNames[i]);}return ++rowNum;}/*** 创建正文* * @Title: createContent* @param sheetIndex第几个sheet页* @param rowNum起始行* @param rowData行数据* @return rowNum* */public int createContent(int sheetIndex, int rowNum, List<List<String>> rowData) {HSSFSheet sheet = wb.getSheetAt(sheetIndex);int contentInx = 1;for (List<String> dataRow : rowData) {HSSFRow row = sheet.createRow(rowNum);row.setHeight((short) 750);int cellNum = 0;for (String str : dataRow) {row.createCell(cellNum).setCellValue(str);row.getCell(cellNum).setCellStyle(getContentCellStyle(contentInx % 2 != 0));cellNum++;}rowNum++;contentInx++;}return rowNum;}/*** 创建正文,通过列的基本属性去创建,跨行跨列** @Title: createContent* @param sheetIndex第几个sheet页* @param rowNum起始行* @param rowData行数据* @return rowNum**/public int createContentWithRowModel(int sheetIndex, int rowNum, List<List<ReportRowModel>> rowData) {HSSFSheet sheet = wb.getSheetAt(sheetIndex);int contentInx = 1;for (List<ReportRowModel> dataRow : rowData) {HSSFRow row = sheet.createRow(rowNum);row.setHeight((short) 300);row.setHeightInPoints(19);int cellNum = 0;for (ReportRowModel model : dataRow) {row.createCell(cellNum).setCellValue(model.getContent());row.getCell(cellNum).setCellStyle(getContentCellStyle(contentInx % 2 != 0));// 设置跨行数据if (model.getRowspan() != null && model.getRowspan() > 1) {CellRangeAddress cra = new CellRangeAddress(rowNum, rowNum + model.getRowspan() - 1, cellNum, cellNum);sheet.addMergedRegion(cra);}// 设置跨列数据if (model.getColspan() != null && model.getColspan() > 1) {CellRangeAddress cra = new CellRangeAddress(rowNum, rowNum, cellNum, cellNum + model.getColspan() - 1);sheet.addMergedRegion(cra);}cellNum++;}rowNum++;contentInx++;}return rowNum;}/*** 将excel文件以流的方式生成* * @Title: writeToOutStream* @param request* @param response* @param fileName*            (文件名称)* @throws IOException* */public void writeToOutStream(HttpServletRequest request, HttpServletResponse response, String fileName) throws IOException {fileName = URLDecoder.decode(fileName, "UTF-8");String agent = request.getHeader("User-Agent").toLowerCase();if (agent.indexOf("firefox") != -1) {response.setHeader("Content-Disposition", "attachment; filename=" + new String(fileName.getBytes("utf-8"), "iso8859-1"));} else {response.setHeader("Content-Disposition","attachment; filename=" + URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20").replaceAll("%28", "\\(").replaceAll("%29", "\\)").replaceAll("%3B", ";").replaceAll("%40", "@").replaceAll("%23", "\\#").replaceAll("%26", "\\&"));}response.setContentType("application/octet-stream;charset=utf-8");OutputStream outputStream = response.getOutputStream();wb.write(outputStream);outputStream.flush();outputStream.close();}/*** 获取到当前时间,作为我excle标题* * @Title: getCurrentTime* @return String**/public String getCurrentTime(String timeStyle) {SimpleDateFormat dateFormat = new SimpleDateFormat(timeStyle);Date date = new Date();String currentTime = dateFormat.format(date);return currentTime;}public HSSFWorkbook getWorkbook() {return wb;}/** 自动调整列宽 */public void autoAdjustColumnSize(int sheetIndex) {HSSFSheet sheet = wb.getSheetAt(sheetIndex);for (int j = 0; j < sheet.getLastRowNum() + 1; j++) {sheet.autoSizeColumn(j, true);}}/*** 冻结行、列* * @Title: freezePane* @param sheetIndex* @param colNum* @param rowNum**/public void freezePane(int sheetIndex, int colNum, int rowNum) {HSSFSheet sheet = wb.getSheetAt(sheetIndex);sheet.createFreezePane(colNum, rowNum);}}class ReportRowModelConstants {public static final short HEAD_HEIGHT_500 = 500;// 表头高度public static final short TITLE_HEIGHT_800 = 800;// 标题高度public static final short CONTENT_HEIGHT_700 = 700;// 标题高度
}

ReportRowModel

package com.xtt.txgl.report.vo;/**** @description:导出excel数据的模型* @author: jxp* @date: 2020年06月17日 14:26* @version: V1.0*/
public class ReportRowModel {private String content;// 内容private Integer rowspan;// 跨行private Integer colspan;// 跨列public ReportRowModel() {}public ReportRowModel(String content, Integer rowspan, Integer colspan) {this.content = content;this.rowspan = rowspan;this.colspan = colspan;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}public Integer getRowspan() {return rowspan;}public void setRowspan(Integer rowspan) {this.rowspan = rowspan;}public Integer getColspan() {return colspan;}public void setColspan(Integer colspan) {this.colspan = colspan;}
}

简单高效实现导出excel数据表格相关推荐

  1. php把数据创建一个表格,PHP创建(导出Excel数据表格)

    /** * 创建(导出Excel数据表格) * @param  array   $list 要导出的数组格式的数据 * @param  string  $filename 导出的Excel表格数据表的 ...

  2. Vue导出Excel数据表格

    这两天在做一个有关Vue框架导出Excel数据表格的项目练习,因为之前并未写过有关导出功能的练习,所以有感而发记录一下,也请各位一起共同各抒己见.(这是我第一次写博客,不足之处敬请指教) 我的情况是后 ...

  3. EasyExcel导入和导出excel数据表格用法示例

    说明:平时项目中经常有需要把excel表格中的数据导入库中,或者需要把查询出来的数据导出到excel文件中,今天就来介绍阿里的 easyexcel 的用法 一.SpringBoot集成EasyExce ...

  4. csv和excel php 解析_PHP 高效导入导出Excel(csv)方法之fgetcsv()和fputcsv()函数

    CSV,是Comma Separated Value(逗号分隔值)的英文缩写,通常都是纯文本文件. 一.CSV数据导入函数fgetcsv() fgetcsv() 函数从文件指针中读入一行并解析 CSV ...

  5. python导入excel数据-Python数据处理之导入导出excel数据

    欢迎点击上方"AntDream"关注我 .Python的一大应用就是数据分析了,而数据分析中,经常碰到需要处理Excel数据的情况.这里做一个Python处理Excel数据的总结, ...

  6. java excel data 导入数据_java实现导入导出excel数据

    项目需要,要实现一个导入导出excel的功能,于是,任务驱动着我学习到了POI和JXL这2个java操作Excel的插件. 一.POI和JXL介绍 1.POI:是对所有office资源进行读写的一套工 ...

  7. 自定义注解导出excel数据

    自定义注解导出excel数据 利用自定义注解方式,对数据列表进行简单的导出操作.即在实体对象的属性域上添加导出标识的注解,在对实体进行导出时,利用自定义注解进行反射的方法,获取实体需要导出的属性及值. ...

  8. toad导入数据_Oracle 使用TOAD实现导入导出Excel数据

    在Oracle应用程序的开发过程中,访问数据库对象和编写SQL程序是一件乏味且耗费时间的工作,对数据库进行日常管理也是需要很多SQL脚本才能完成的.Quest Software为此提供了高效的Orac ...

  9. java 动态导入excel_java实现导入导出excel数据

    项目需要,要实现一个导入导出excel的功能,于是,任务驱动着我学习到了POI和JXL这2个java操作Excel的插件. 一.POI和JXL介绍 1.POI:是对所有office资源进行读写的一套工 ...

  10. php导出excel数据使用csv替代xls格式

    为什么80%的码农都做不了架构师?>>>    php导出excel数据使用csv替代xls格式 一直以来需要将某些后台数据导出来以供运营人员查看,因为他们都用excel.所以最初的 ...

最新文章

  1. 本科生如何自学机器学习?
  2. Python标准库:itertools迭代器函数
  3. python字符串与列表与运算_[Python学习笔记1]Python语言基础 数学运算符 字符串 列表...
  4. java中三种转string的方法_java中int,char,string三种类型的相互转换
  5. [Python爬虫] Selenium实现自动登录163邮箱和Locating Elements介绍
  6. 视图、存储函数、存储过程、触发器:MySQL系列之五
  7. 我们凭什么相信 5G 很安全?
  8. 终于有人把安卓程序员必学知识点全整理出来了,送大厂面经一份!
  9. 计算机图形学基础教程论文,计算机图形学小论文
  10. freemarker取数
  11. oracle not like优化,oracle的like优化,对比了一下,效果确实比like好些。
  12. android 分组柱状图_Android自定义柱状图控件
  13. 程序员的我,为何来了大北京
  14. 一文理解 ISO、快门、光圈、曝光概念 以及 光圈、焦距与景深的关系
  15. Android之微信界面设计
  16. Horizon client PcoIP连接桌面后黑屏断开,报:与远程计算机的连接终止
  17. ARM64开发板配置Java环境 OrangePi
  18. 如何修改Android应用程序的图标和名字
  19. linux-python升级到最新版本
  20. 奥付云荣获2017年度企业级创新应用 Top 50

热门文章

  1. 虚拟机上安装win7系统
  2. TC与CATIA集成使用说明
  3. 淘客基地淘客小程序微信审核通过率90%以上的独家秘籍
  4. 三点估算 Sigma(σ)的值,期望值,标准差
  5. cesium obj格式转换为gltf、glb
  6. Spotfire使用经验-自定义饼图中显示的数据量(Top N分析,排名分析)
  7. python如何合并txt文件_Python实现将目录中TXT合并成一个大TXT文件的方法
  8. PHP手机网店管理系统
  9. Appinventor——蓝牙app(蓝牙遥控器、串口助手、温湿度显示、切换界面蓝牙依旧保持连接)
  10. Java 一个简单的接口使用案例