Java使用POI操作Excel表格,从合并单元格取值

排行老几 2019-01-21 09:19:12


如上图,要将这组数据从Excel取出来,请教下应该怎么处理。打印结果如下图:


...全文
710 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_38757817 2019-09-04
  • 打赏
  • 举报
回复
PageOffice操作Excel表格,从合并单元格取值,也很方便的
JUIYI 2019-08-15
  • 打赏
  • 举报
回复
package cn.boccaccio.qdjxhzqzhxxpt.self.baseInfo.service.imp; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.poi.hssf.usermodel.HSSFWorkbook; 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.usermodel.Workbook; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xssf.usermodel.XSSFWorkbook; /** * 导入包含合并单元格的Excel文档 * */ public class mergeCellExcelImport { public static void main(String[] args) throws FileNotFoundException { File file = new File("d://111.xlsx"); InputStream is = new FileInputStream(file); mergeCellExcelImport ti = new mergeCellExcelImport(); // 读取Excel文件工作表 Workbook wb = ti.readFile(is, "111.xlsx"); //取得第一个工作表 Sheet sheet = wb.getSheetAt(0); // 获取工作表数据 List<Map<Integer,Object>> list = ti.getBody(sheet,8); for(Map<Integer,Object> item : list) { System.out.println(item); } } /** * 读取Excel文件工作表 * @param inputStream 文件流 * @param fileName 文件名称 * @return */ public Workbook readFile(InputStream inputStream,String fileName){ Workbook wb = null; //判断是否是excel2007格式 boolean isE2007 = false; if(fileName.endsWith("xlsx")){ isE2007 = true; } try { //建立输入流 InputStream input = inputStream; //根据文件格式(2003或者2007)来初始化 if(isE2007){ wb = new XSSFWorkbook(input); }else{ wb = new HSSFWorkbook(input); } } catch (IOException e) { e.printStackTrace(); } return wb; } /** * 获取内部内容 * @param sheet 工作表 * @param column 有效数据列数 * @return */ public List<Map<Integer,Object>> getBody(Sheet sheet, int column){ //总行数 int count = sheet.getLastRowNum()+1; //sheet中所有合并的单元格信息 List<CellRangeAddress> cras = getCombineCell(sheet); //存储行信息 List<Map<Integer,Object>> irs = new ArrayList<>(); //表头只有2行 for(int i = 2; i < count;i++){ //存储列信息 Map<Integer,Object> map = new HashMap<Integer,Object>(); for(int x = 0;x < column;x++) { // 判断当前处理单元格是不是合并单元格 CellRangeAddress range = isMergedRegion(cras,i,x); // 如果当前单元格属于合并单元格 if(null != range){ //拿到合并单元格的开始行数和开始列数 int firstColumn = range.getFirstColumn(); int firstRow = range.getFirstRow(); //根据开始行数和开始列数获取单元格的值 Row row = sheet.getRow(firstRow); map.put(x,getCellValue(row.getCell(firstColumn))); }else{ //如果不是合并单元格,直接拿当前单元格的值 Row row = sheet.getRow(i); map.put(x,getCellValue(row.getCell(x))); } } irs.add(map); } return irs; } /** * 获取sheet中合并的单元格信息,并返回合并的单元格list * @param sheet 需要导入的工作表 * @return List<CellRangeAddress> 合并的单元格list */ public 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; } /** * 判断指定的单元格是否是合并单元格 * @param cras 合并的单元格list * @param row 行下标 * @param column 列下标 * @return */ private CellRangeAddress isMergedRegion(List<CellRangeAddress> cras,int row ,int column) { for (CellRangeAddress range : cras) { 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 range; } } } return null; } /** * 获取单元格的值 * @param cell * @return */ public String getCellValue(Cell cell){ if(cell == null) { return ""; } else { if(cell.getCellType() == Cell.CELL_TYPE_STRING){ return cell.getStringCellValue(); } else { cell.setCellType(Cell.CELL_TYPE_STRING); return cell.getStringCellValue(); } } } }

50,523

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧