1.引入pom文件

<!-- 操作以 .xls 为后缀的 Excel --><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><!-- 操作以 .xlsx 为后缀的 Excel --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>4.1.2</version></dependency>

2.创建util:PoiExcelUtils:

package io.renren.common.utils;import java.util.ArrayList;
import java.util.List;import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;/*** 功能: poi导出excel工具类*/
public class PoiExcelUtils {/*** 获取单元格的值** @param fCell* @return*/public static String getCellValue(Cell fCell) {if (fCell == null)return "";return fCell.toString();}/*** 把单元格内容全部转为String* @param cell* @return*/public static String getCellString(Cell cell){if (cell == null ) return "";cell.setCellType(CellType.STRING);return cell.getStringCellValue();}/*** 合并单元格处理,获取合并行** @param sheet* @return List<CellRangeAddress>*/public static List<CellRangeAddress> getCombineCell(Sheet sheet) {List<CellRangeAddress> list = new ArrayList<CellRangeAddress>();// 获得一个 sheet 中合并单元格的数量int sheetmergerCount = sheet.getNumMergedRegions();// 遍历所有的合并单元格for (int i = 0; i < sheetmergerCount; i++) {// 获得合并单元格保存进list中CellRangeAddress ca = sheet.getMergedRegion(i);list.add(ca);}return list;}public static int getRowNum(List<CellRangeAddress> listCombineCell, Cell cell, Sheet sheet) {int xr = 0;int firstC = 0;int lastC = 0;int firstR = 0;int lastR = 0;for (CellRangeAddress ca : listCombineCell) {// 获得合并单元格的起始行, 结束行, 起始列, 结束列firstC = ca.getFirstColumn();lastC = ca.getLastColumn();firstR = ca.getFirstRow();lastR = ca.getLastRow();//cell.getRowIndex()获取单元格所在行号  cell.getColumnIndex()获取列号if (cell.getRowIndex() >= firstR && cell.getRowIndex() <= lastR) {if (cell.getColumnIndex() >= firstC && cell.getColumnIndex() <= lastC) {xr = lastR;}}}return xr;}/*** 判断单元格是否为合并单元格,是的话则将单元格的值返回** @param listCombineCell*            存放合并单元格的list* @param cell*            需要判断的单元格* @param sheet*            sheet* @return*/public static String isCombineCell(List<CellRangeAddress> listCombineCell, Cell cell, Sheet sheet) throws Exception {int firstC = 0;int lastC = 0;int firstR = 0;int lastR = 0;String cellValue = null;for (CellRangeAddress ca : listCombineCell) {// 获得合并单元格的起始行, 结束行, 起始列, 结束列firstC = ca.getFirstColumn();lastC = ca.getLastColumn();firstR = ca.getFirstRow();lastR = ca.getLastRow();if (cell.getRowIndex() >= firstR && cell.getRowIndex() <= lastR) {if (cell.getColumnIndex() >= firstC && cell.getColumnIndex() <= lastC) {Row fRow = sheet.getRow(firstR);Cell fCell = fRow.getCell(firstC);cellValue = getCellValue(fCell);break;}} else {cellValue = "";}}return cellValue;}/*** 获取合并单元格的值** @param sheet* @param row* @param column* @return*/public static String getMergedRegionValue(Sheet sheet, int row, int column) {int sheetMergeCount = sheet.getNumMergedRegions();for (int i = 0; i < sheetMergeCount; i++) {CellRangeAddress ca = sheet.getMergedRegion(i);int firstColumn = ca.getFirstColumn();int lastColumn = ca.getLastColumn();int firstRow = ca.getFirstRow();int lastRow = ca.getLastRow();if (row >= firstRow && row <= lastRow) {if (column >= firstColumn && column <= lastColumn) {Row fRow = sheet.getRow(firstRow);Cell fCell = fRow.getCell(firstColumn);return getCellValue(fCell);}}}return null;}/*** 判断指定的单元格是否是合并单元格** @param sheet* @param row*            行下标* @param column*            列下标* @return*/public static boolean isMergedRegion(Sheet sheet, int row, int column) {int sheetMergeCount = sheet.getNumMergedRegions();for (int i = 0; i < sheetMergeCount; i++) {CellRangeAddress range = sheet.getMergedRegion(i);int firstColumn = range.getFirstColumn();int lastColumn = range.getLastColumn();int firstRow = range.getFirstRow();int lastRow = range.getLastRow();if (row >= firstRow && row <= lastRow) {if (column >= firstColumn && column <= lastColumn) {return true;}}}return false;}}

3.代码

public R importTarget(MultipartFile file, Integer taskId) throws IOException {try {//解析Excel,根据Excel文件创建工作簿//传入输入流的对象InputStream,获取Workbook//Workbook工作簿的高级表现形式,是sheet的上级对象。一个excel就是一个工作簿,一个工作簿含有多个工作表(sheet)Workbook wb = WorkbookFactory.create(file.getInputStream());//1.2.获取SheetSheet sheet = wb.getSheetAt(0);//参数:索引//row函数的含义,返回所选择的某一个单元格的行数。Row row;//合并单元格处理,获取合并行List<CellRangeAddress> cras = PoiExcelUtils.getCombineCell(sheet);//getPhysicalNumberOfRows()获得的实际行数,不一定有数据的行数。for (int i = 1; i < sheet.getPhysicalNumberOfRows(); i++) {//sheet.getRow(i)获取第i行的所有数据Row BigRow = sheet.getRow(i);if (BigRow == null) {break;}row = sheet.getRow(i);//判断指定的单元格是否是合并单元格if (PoiExcelUtils.isMergedRegion(sheet, i, 0)) {//sheet.getRow(i).getCell(0)获取第i行第1个格int lastRow = PoiExcelUtils.getRowNum(cras, sheet.getRow(i).getCell(0), sheet);for (; i <= lastRow; i++) {row = sheet.getRow(i);// 判断该行第1列是合并单元格if (PoiExcelUtils.isMergedRegion(sheet, i, 0)) {int lastRow2 = PoiExcelUtils.getRowNum(cras, sheet.getRow(i).getCell(4), sheet);for (; i <= lastRow2; i++) {Row nextRow = sheet.getRow(i);//实体类ExcelTarget target = new ExcelTarget();buildTarget(row, BigRow, nextRow, target);targetService.save(target);}} else {ExcelTarget target = new ExcelTarget();buildTarget(row, BigRow, row, target);targetService.save(target);}}i--;} else {row = sheet.getRow(i);ExcelTarget target = new ExcelTarget();buildTarget(row, BigRow, row, target);targetService.save(target);}}return R.ok("导入成功");}catch (IOException e){e.printStackTrace();return R.error("导入失败");}}private void buildTarget(Row row, Row BigRow, Row nextRow, ExcelTarget target) {//下标从0开始读取final String name = PoiExcelUtils.getCellString(BigRow.getCell(1)); // 姓名target.setName(name);String sex = PoiExcelUtils.getCellString(BigRow.getCell(2)); // 性别(1:男2:女)if (sex.equals("男")){target.setSex(1);}else if (sex.equals("女")){target.setSex(2);}target.setCreateTime(new Date());}

Poi导入excel(合并单元格)相关推荐

  1. Java POI 对Excel合并单元格的数据处理

    Java POI 对Excel合并单元格的数据处理 最近在项目开发过程中,有个一个导入Excel文件处理合并单元格数据的需求,就自己在网上找了一个模板,自己进行二次开发来开发需求. Excel工具类 ...

  2. poi 读取excel合并单元格两种方式

    说明: excel合并是用选择的两个或更多单元格创建一个单元格的过程.合并单元格时,如果有多个选择的单元格包含数据,则将保留左上角或右上角(取决于当前的视图方向)单元格中的数据,并删除其余的所有数据. ...

  3. POI导出EXCEL合并单元格对象嵌套List数据

    导出EXCEL 在实际的开发过程当中,我们会遇到一些比较复杂的导出需求,例如需要导出的实体类中需要嵌套集合对象等,正好最近碰到了所以分享出来,希望对大家有帮助 一.POI是什么 简单的说就是Apach ...

  4. poi导出Excel合并单元格、设置打印参数页眉页脚等

    由于生成文件不能落地,使用SXSSFWorkBook来对excel的导出工作 生成excel步骤: 1.创建workbook SXSSFWorkbook workbook=new SXSSFWorkb ...

  5. java合并单元格的快捷键_Java使用POI操作Excel合并单元格

    合并单元格的方法: 指定 4 个参数,起始行,结束行,起始列,结束列.然后这个区域将被合并. CellRangeAddress region = new CellRangeAddress(startR ...

  6. java POI导出excel,合并单元格边框消失

    业务是导出一个报表,要求有一个跨多列的表头,肯定要用到合并单元格,但合并后边框消失.网上的一些解决办法是重写合并单元格方法,但弄清楚原因后,其实没必要. 原来是这样的: 合并后就第一个有边框,其余全成 ...

  7. poi导出excel合并单元格

    /*导出服务*/@RequestMapping(value = "/exportMaintenance.html")public void exportMaintenance(Ht ...

  8. springboot项目导出excel 合并单元格表格

    springboot项目导出excel 合并单元格表格 导出效果 业务controller 业务数据 业务实体类 注解MyExcel.java 注解 MyExcels 导出工具类MyExcelUtil ...

  9. poi删除带有合并单元格的行的问题

    在网上搜了很久关于poi删除带有合并单元格的一行后,下面行数据向上移动一行时,出现乱合并的问题,看到有人提过这个问题,但是郁闷的很没有一个人回答过,而且大部分的文章都是关于什么合并单元格,读取Exce ...

最新文章

  1. 使用Depth Texture
  2. 生成服务器密码的shell脚本
  3. DL之Attention-ED:基于TF NMT利用带有Attention的 ED模型训练、测试(中英文平行语料库)实现将英文翻译为中文的LSTM翻译模型过程全记录
  4. Qt智能指针--QSharedPointer
  5. FreeMarker插件的安装
  6. IE浏览器下DOM节点被替换后获取边界offsetParent / getBoundingClientRect 的BUG解决(版本 EXT 2.0/ 2.0.1)...
  7. 关于softmax loss这个概念
  8. 【转】源码分析C++的string实现
  9. 如何在A用户下建立视图,这个视图是A的表与B的表进行关联的?
  10. python基础之面向对象编程
  11. 【实用工具】adb检测android设备
  12. mysql的瓶颈_MySQL 瓶颈分析及优化
  13. android计算器括号,计算器(一)——加减和括号
  14. 高一计算机基础知识题简答题,高一信息技术试题及答案
  15. java实验指导书 王立新,java实验指导书
  16. VBA实现EXCEL随机本地随机刷题
  17. 无线上网认证之Portal认证——企业WiFi管家
  18. 微信小程序登陆(两种写法)
  19. 国美易卡借助云平台,国美易卡提升了用户体验
  20. html表格标题标签_HTML标题标签

热门文章

  1. 关于pingpp(招行一网通)-混淆
  2. 硬盘柱面损坏怎么办_硬盘扇区损坏怎么办
  3. 什么是.NET?什么是.NET Framework?什么是.NET Core?
  4. Rinne Loves Sequence
  5. DWG中注记类型属性转换
  6. pdf在线翻译_推荐可以pdf等格式直接在线翻译的免费工具
  7. TESLA M40折腾笔记
  8. 编程实践--决策树分类算法--隐形眼镜材质分类
  9. 【大数据技术应用实战】【大数据与人工智能视角下数字孪生和元宇宙】二、新一轮大数据与人工智能变革
  10. vue + elementui table 列内容相同 自动合并单元格 完整代码