原始结果:
期望结果:
关键代码通用类如下:
SchoolController 部分代码:
@RequestMapping(value="/exportExcel") public String exportExcel(HttpServletResponse response) { response.setContentType("application/binary;charset=ISO8859_1"); try { ServletOutputStream outputStream = response.getOutputStream(); String fileName = new String(("导出excel例子").getBytes(), "ISO8859_1"); response.setHeader("Content-disposition", "attachment; filename=" + fileName + ".xlsx");// 组装附件名称和格式 String[] titles = { "省份", "市", "人名" , "学校名"}; schoolService.exportExcel(titles, outputStream); } catch (IOException e) { e.printStackTrace(); } return null; }
SchoolServiceImpl部分代码:
@Override public void exportExcel(String[] titles, ServletOutputStream outputStream) { School school = new School(); // 该类就不贴出代码了,建议自己按照图示,拼装学校集合 List<School> schools = schoolDao.getSchoolList(school); // 创建一个workbook 对应一个excel应用文件 XSSFWorkbook workBook = new XSSFWorkbook(); // 在workbook中添加一个sheet,对应Excel文件中的sheet XSSFSheet sheet = workBook.createSheet("导出excel例子"); // 自适应列宽度 sheet.autoSizeColumn(1, true); ExportUtil exportUtil = new ExportUtil(workBook, sheet); XSSFCellStyle headStyle = exportUtil.getHeadStyle(); XSSFCellStyle bodyStyle = exportUtil.getBodyStyle(); // 构建表头 XSSFRow headRow = sheet.createRow(0); XSSFCell cell = null; for (int i = 0; i < titles.length; i++) { cell = headRow.createCell(i); cell.setCellStyle(headStyle); cell.setCellValue(titles[i]); } // 构建表体数据 if (schools != null && schools.size() > 0) { for (int j = 0; j < schools.size(); j++) { XSSFRow bodyRow = sheet.createRow(j + 1); School schoolInner = schools.get(j); cell = bodyRow.createCell(0); cell.setCellStyle(bodyStyle); cell.setCellValue(schoolInner.getProvinces()); cell = bodyRow.createCell(1); cell.setCellStyle(bodyStyle); cell.setCellValue(schoolInner.getCity()); cell = bodyRow.createCell(2); cell.setCellStyle(bodyStyle); cell.setCellValue(schoolInner.getLinker()); cell = bodyRow.createCell(3); cell.setCellStyle(bodyStyle); cell.setCellValue(schoolInner.getSchoolName()); } // /* // * 设定合并单元格区域范围 // * firstRow 0-based // * lastRow 0-based // * firstCol 0-based // * lastCol 0-based // */ // sheet.addMergedRegion(new CellRangeAddress(2, 7, 0, 0)); // sheet.addMergedRegion(new CellRangeAddress(2, 3, 1, 1)); // sheet.addMergedRegion(new CellRangeAddress(4, 7, 1, 1)); int lastRowNum = sheet.getLastRowNum(); exportUtil.mergerData(sheet, 0, 1 , lastRowNum); Map<String,String> map = exportUtil.mergerData(sheet, 1, 1 , lastRowNum); // System.out.println("map: "+JSON.toJSONString(map)); for(String value : map.values()){ String [] strArr = value.split(","); int firstRow = Integer.parseInt(strArr[0])-1; int lastRow = Integer.parseInt(strArr[1])-1; exportUtil.mergerData(sheet, 2, firstRow, lastRow); } } try { workBook.write(outputStream); outputStream.flush(); outputStream.close(); } catch (IOException e) { e.printStackTrace(); } finally { try { outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } }
ExportUtil:代码
package com.bugyun.util; import java.util.HashMap; import java.util.Map; import org.apache.poi.hssf.util.HSSFColor; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFCellStyle; import org.apache.poi.xssf.usermodel.XSSFFont; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class ExportUtil { private XSSFWorkbook wb = null; private XSSFSheet sheet = null; /** * @param wb * @param sheet */ public ExportUtil(XSSFWorkbook wb, XSSFSheet sheet) { this.wb = wb; this.sheet = sheet; } /** * 合并单元格后给合并后的单元格加边框 * * @param region * @param cs */ public void setRegionStyle(CellRangeAddress region, XSSFCellStyle cs) { int toprowNum = region.getFirstRow(); for (int i = toprowNum; i <= region.getLastRow(); i++) { XSSFRow row = sheet.getRow(i); for (int j = region.getFirstColumn(); j <= region.getLastColumn(); j++) { XSSFCell cell = row.getCell(j);// XSSFCellUtil.getCell(row, // (short) j); cell.setCellStyle(cs); } } } /** * 设置表头的单元格样式 * * @return */ public XSSFCellStyle getHeadStyle() { // 创建单元格样式 XSSFCellStyle cellStyle = wb.createCellStyle(); // 设置单元格的背景颜色为淡蓝色 cellStyle.setFillForegroundColor(HSSFColor.PALE_BLUE.index); cellStyle.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND); // 设置单元格居中对齐 cellStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER); // 设置单元格垂直居中对齐 cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER); // 创建单元格内容显示不下时自动换行 cellStyle.setWrapText(true); // 设置单元格字体样式 XSSFFont font = wb.createFont(); // 设置字体加粗 font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD); font.setFontName("宋体"); font.setFontHeight((short) 200); cellStyle.setFont(font); // 设置单元格边框为细线条 cellStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN); cellStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN); cellStyle.setBorderRight(XSSFCellStyle.BORDER_THIN); cellStyle.setBorderTop(XSSFCellStyle.BORDER_THIN); return cellStyle; } /** * 设置表体的单元格样式 * * @return */ public XSSFCellStyle getBodyStyle() { // 创建单元格样式 XSSFCellStyle cellStyle = wb.createCellStyle(); // 设置单元格居中对齐 cellStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER); // 设置单元格垂直居中对齐 cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER); // 创建单元格内容显示不下时自动换行 cellStyle.setWrapText(true); // 设置单元格字体样式 XSSFFont font = wb.createFont(); // 设置字体加粗 // font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD); font.setBoldweight(XSSFFont.BOLDWEIGHT_NORMAL); font.setFontName("宋体"); font.setFontHeight((short) 200); cellStyle.setFont(font); // 设置单元格边框为细线条 cellStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN); cellStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN); cellStyle.setBorderRight(XSSFCellStyle.BORDER_THIN); cellStyle.setBorderTop(XSSFCellStyle.BORDER_THIN); return cellStyle; } /** * @param sheet * @param colIndex 合并的第几列 (下标从0开始) * @param startRowIndex 从第几行开始合并(算上标题,从0开始算) * @param endRowIndex 从第几行结束合并 */ public Map<String,String> mergerData(XSSFSheet sheet,int colIndex, int startRowIndex , int endRowIndex) { Map<String,String> map = new HashMap<>(); breakFor: for (int i = startRowIndex; i <= endRowIndex; i++) { Cell cell = sheet.getRow(i).getCell(colIndex); for (int j = i + 1; j <= endRowIndex; j++) { Cell celltemp = sheet.getRow(j).getCell(colIndex); // 如果下一行与被比较行相等,则继续该循环,直到不等才跳出 if (!celltemp.getStringCellValue().equals(cell.getStringCellValue())) { int temp = j-1; if (temp > i) { // 合并单元格 map.put(cell.getStringCellValue(), i+1+","+j); sheet.addMergedRegion(new CellRangeAddress(i, temp, colIndex, colIndex)); } i = temp; break; } if (j == endRowIndex) { map.put(cell.getStringCellValue(), i+1+","+j); sheet.addMergedRegion(new CellRangeAddress(i, endRowIndex, colIndex, colIndex)); break breakFor; } } } return map ; } }
pom.xml 引入包:
<!-- poi 导出Excel包 --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.14</version> </dependency>
School类字段 ,参考代码就不一一贴出来了;
参考文章:
http://bbs.csdn.net/topics/390420021
http://blog.csdn.net/hehexiaoyou/article/details/37873131
相关推荐
总结,Java通过Apache POI库可以方便地处理Excel文件,包括合并单元格。这个过程涉及到创建工作簿和工作表,定义合并范围,写入数据并保存文件。在开发过程中,灵活运用这些方法可以满足各种复杂的Excel操作需求。
java POI导出Excel文件多表头文件
### POI 获取合并单元格详解 #### 一、概述 Apache POI 是一个流行的 Java 库,用于处理 Microsoft Office 格式的文档,如 Word、Excel 和 PowerPoint。在本篇文章中,我们将详细介绍如何使用 POI 处理 Excel 文件...
POI 合并单元格 及 注意事项
POI操作Excel 合并单元格 边框问题解决方法,这个方法是我亲自测试,并运用于项目中的,可以放心使用,还一并写出了很多注释,其中有写poi的bug的解决方法
本文将深入探讨如何使用Java的Apache POI库来读取Excel文件,并处理其中合并单元格的数据,同时将这些数据存储到实体类中以供后续使用。 Apache POI是一个强大的库,允许程序员使用Java来创建、修改和显示Microsoft...
### 使用Apache POI获取含有合并单元格的Excel数据并存储为List 在处理Excel文档时,经常需要读取其中的数据并进行进一步的操作。当Excel文件中含有合并单元格时,简单的读取方法可能无法准确地获取到所有数据。...
在探讨“poi读取合并单元格帮助类”的知识点时,我们首先需要理解Apache POI库在Java中的作用以及如何处理Excel文件中的合并单元格。Apache POI是一个开源的API,它允许程序创建、修改和显示Microsoft Office格式的...
利用poi进行excel相同内容合并单元格,只摘要了传入部分功能,请关注addMergedRegion方法
EasyUIPoI是一款基于Apache POI的Java工具库,专门用于简化Excel的导出操作,尤其在处理模板和合并单元格方面提供了便利。这个库主要适用于那些需要在Web应用中生成Excel报告或导出数据的场景,比如数据分析、报表...
关于java EXCEL poi 合并后无法显示或无法设置边框问题 【本人亲测】 excel poi 新手! 坑了1.5天!
在本示例中,我们将重点讨论如何使用 Apache POI 来生成 Excel 文件,并进行单元格的合并操作。 首先,我们需要引入 Apache POI 的相关依赖库。如果你使用的是 Maven,可以在项目的 `pom.xml` 文件中添加以下依赖:...
poi导入/导出Excel表格,合并单元格的读取和设置
在本示例中,我们看到如何使用Java POI来填充Word文档,包括合并单元格、添加图片以及设置字号。以下是对代码的详细解释: 1. **初始化Document对象**: 首先,`Document`类是Apache POI库中的核心类,用于表示...
本主题将深入探讨如何利用Java的Apache POI库中的XSSFWorkbook类来实现自由合并单元格,并设置单元格样式。Apache POI是一个流行的API,它允许开发者读取、创建和修改Microsoft Office格式的文件,包括Excel。 首先...
2. **数据处理问题**:在编程中,如Python的Pandas库或Java的Apache POI库处理Excel时,合并单元格可能导致数据读取不一致。例如,如果一个列中的某些单元格被合并,那么对应的行数将无法与未合并的数据对齐,从而...
这个“excel poi工具类”是利用Apache POI库来实现对Excel文件进行导入、导出、合并单元格以及处理计算公式的功能。下面我们将深入探讨这些知识点。 **1. Apache POI库介绍** Apache POI是一个开源项目,它为Java...
本项目提供了一个解决方案,它支持合并单元格和合并行,无需依赖Microsoft Office,这对于那些无法安装Office环境或者希望在服务器端执行此操作的用户来说,具有很高的实用价值。 首先,我们要理解HTML表格...
本文将深入探讨如何使用阿里云开发的开源库EasyExcel来处理大数据导出,并结合Apache POI库,以及SpringBoot框架,实现上万条数据的自定义策略合并单元格导出。我们将基于提供的技术栈——EasyExcel 2.1.7,Apache ...
【JAVA】easypoi根据Excel模板导出 循环遍历合并单元格处理