POI获取excle合并单元格以及没有合并单元格的数据 5C

问题描述:如果excle表里最后一行数据是没有合并的,就取不到值,如果最后一行是合并过的数据,就都能取得到了(合并未合并的都可以获取到)。有大神可以帮忙看一下代码解决一下吗,谢谢啦。

package service;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;

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.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import entity.Table;

public class ExcelOp {
public String excelPath;

public ExcelOp(String excelPath) {
    this.excelPath = excelPath;
}

public String getExcelPath() {
    return excelPath;
}

public void setExcelPath(String excelPath) {
    this.excelPath = excelPath;
}


/**
 * 
 * @param excelPath:excel路径
 * @param args:需要操作的列
 * @throws IOException 
 */
@SuppressWarnings("resource")
public ArrayList<Table>  readExcel() throws IOException{
    File excelFile = new File(excelPath);
    InputStream is = new FileInputStream(excelFile); // 获取文件输入流  

    ArrayList<Table> list = null;

    String suffix = excelPath.substring(excelPath.lastIndexOf(".")+1);
    if(suffix.equals("xls")){
        HSSFWorkbook workbook = null;
        workbook = new HSSFWorkbook(is);

        if(workbook != null){  

            HSSFSheet sheet = workbook.getSheetAt(1);//获取第二张表
            if(sheet == null){
                System.out.println();
                return null;
            }
            list = new ArrayList<Table>(); 

            int combineLines = 1;
            int number = 1;
            //读取行
            for (int rowNum = 3; rowNum < sheet.getLastRowNum(); rowNum+=combineLines) {
                HSSFRow row = sheet.getRow(rowNum);

                if (row == null) continue;
                Table tb = new Table(); 
                tb.setNumber("3.1." + number);
//              tb.setTestData(row.getCell(0).toString());
                tb.setTitle(row.getCell(1).toString());
                //Word换行主要有两大类,一类是表格单元格文本的换行,另一类是表格之外的文本的换行。对于表格外的文本我们可以使用“\r”或者“(char)11”来换行,然而对于表格内的文本我们只能使用“(char)11”来进行换行操作。

// tb.setFunctionPoint(row.getCell(2).toString().replace('\n', (char)11));
tb.setFunctionPoint(row.getCell(2).toString());
combineLines = isMergedRegion(sheet, rowNum, 1);
String process = "";
String conclusion = "";
Set s = new HashSet();
for (int i = rowNum; i< rowNum + combineLines; i++) {
//步骤
HSSFRow r1 = sheet.getRow(i);
// process += r1.getCell(5).toString() + (char)11 + (char)11;
process += r1.getCell(5).toString() + "\n" + "\n";
//结果
String result = r1.getCell(7).toString();
s.add(result);
}

                tb.setProcess(process);
                tb.setConclusion(conclusion);
                number++;
                list.add(tb);
            }
        }
    }

return list;
}

//返回合并单元格占用行数
public int isMergedRegion(Sheet sheet, int row, int column) {
    int sheetMergeCount = sheet.getNumMergedRegions();
    for (int i = 0; i < sheetMergeCount; i++) {
        CellRangeAddress range = sheet.getMergedRegion(i);
        int firstRow = range.getFirstRow();
        int lastRow = range.getLastRow();
        int firstColumn = range.getFirstColumn(); 
        int lastColumn = range.getLastColumn();   
        if (row >= firstRow && row <= lastRow) {
            if(column >= firstColumn && column <= lastColumn){ 
                return lastRow - firstRow + 1;
            }
        }
    }
    return 1;
}

}

0

2个回答

没有理解你需要解决的是什么

0

已经解决了,在getLastRowNum()+1即可

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
poi读取excel,支持合并单元格
框架技术:ssm excel表: sheet0:订货表   中间的sheet:供货表   工具类: package com.jixi.utils; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apac...
java 用模板导出excel,并且合并单元格
编写步骤: 1.写一个excel模板 topicMap为后台Map中的key值,value值为一个list,在这里进行遍历; 2.在webapp下建一个文件夹,将该模板放入; 3.上代码 我是用的springMvc @RequestMapping(value = &quot;xxxxxxx&quot;) public void exportByYjfx(HttpServletRespo...
POI-获取Excel中合并单元格问题
项目需要读取上传的excel中的合并单元格。于是找到POI包: 主要是poi-x.x.jar 和 poi-ooxml-x.x.jar包 首先是判断当前sheet页是否存在合并单元格,使用getNumMergedRegions()获取当前sheet页中的合并单元格总数. 如下表总共有8行3列【行:0-7;列:0-2】;其中共有合并单元格A、B、E、F、G、H 6个; int
poi导出数据(需要合并单元格)
import java.io.IOException; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.m
关于java EXCEL poi 合并后无法显示或无法设置边框问题
关于java EXCEL poi 合并后无法显示或无法设置边框问题 【本人亲测】 excel poi 新手! 坑了1.5天!
Java读取Excel并合并表格中所需的列的数据
HSSFWorkbook:是操作Excel2003以前(包括2003)的版本,扩展名是.xls XSSFWorkbook:是操作Excel2007的版本,扩展名是.xlsx 对于不同版本的EXCEL文档要使用不同的工具类,如果使用错了,会提示如下错误信息。 org.apache.poi.openxml4j.exceptions.InvalidOperationException ...
poi解析excel,读取合并列或者行的值
用poi解析有合并单元格的excel ProjectExplainExcelUtil.java [code=&quot;java&quot;] package com.concom.imports.project.util; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import ...
Java使用POI解析各种单元格合并的行数、列数和单元格值
因近期工作需要,要做一个Excel解析的事情,这里要解析的文件为任意Excel文件,其中会包含各种各样的行合并、列合并等操作,需要解析出该Excel中具体行、列、Cell中的值信息,故编写此文章做以记录,如有问题还请指正,谢谢! 1. pom.xml中引用poi相关的包: &lt;dependency&gt; &lt;groupId&gt;org.apache.poi&lt;...
poi 读取excel合并单元格两种方式
说明:  excel合并是用选择的两个或更多单元格创建一个单元格的过程。合并单元格时,如果有多个选择的单元格包含数据,则将保留左上角或右上角(取决于当前的视图方向)单元格中的数据,并删除其余的所有数据。 操作方法:  1 首先创建三个单元格,填充的数据都一致 2 然后再空白地方创建合并单元格,然后选择合并的单元格格式刷就可以对A1:B1:C1进行格式化操作 上面就可以完成格式化操...
使用poi导出excel,及合并单元格边框显示问题
使用poi导出excel,及合并单元格边框显示问题。
poi获取合并单元格的值
poi获取合并单元格时,如果是遍历获取合并单元格的所有子单元格的值,office的excel都会有值,wps的excel只会第一个子单元格有值,其他子单元格都没值,即cell=null。故意凡是获取合并单元格的值,都获取第一个子单元格的值即可 以下是用到的操作类 package com.csair.tang.carmanager.utils; import com.csair.tang.ca
利用poi进行excel相同内容合并单元格并转成流输出
利用poi进行excel相同内容合并单元格,只摘要了传入部分功能,请关注addMergedRegion方法
java导出Excel合并单元格
网上java导出excel表格并合并单元格的资料不完全,我整理了一份,并亲测能用,附截图。 ①java导出excel用到POI所有jar包,大家可以直接到下面地址下载点击打开链接 ②模拟数据类 package org; public class WorkSheetDetail { //工作内容 private String workCtx; // 用工人总数 工日数
POI实战-java开发excel详解(第四章 常用操作-单元格合并与数据读取)
4.2单元格合并与数据读取 POI中支持单元格合并,主要类为org.apache.poi.hssf.util.Region,通过new Region(rowFrom, colFrom, rowTo, colTo)设置合并的行列,四个参数说明如下: 参数 说明 rowFrom 合并单元格的起始行(POI中row的标号) co
Java poi 实现自动合并单元格excel的导出
直接上代码 三个方法,一个DTO public static void exportExcel(ExcelDecorationDTO decorationDTO, HttpServletResponse res, List&amp;lt;Object[]&amp;gt; data) { //从第几行插入进去 int startRowNum = 3; ...
POI导出excel,合并单元格。标题列有的单元格数据填入失败。
恩,我这题目描述的有点瑕疵。 其实数据填入成功了,但是因为合并单元格的问题(主要是列合并),生成cell的下标顺序不能再是0,1,2,3....中间如果有合并列,那么需要把列数算进去。cell的下标顺序可能是这样:0,1,3,5...这种。 如图:G-J  K-N进行了单元格合并。但是因为cell下标的问题,G-J  K-N单元格的值其实放在了 D E 列。 可能说的不是很明白。希望对你的...
POI解析合并单元格
excel中的合并单元格其实就是首单元格,只不过该单元格增加了 rowspan和colspan两个属性。 并且把该单元格的高度和宽度变成(例如rowspan=2,colspan=3)2行,3列的的标尺长度,再把被合并的单元格(除了首单元格的其余5个单元格)隐藏。 [code=&quot;java&quot;] public class ExcelUtils{ private void rea...
Java实战—POI操作Excel文档、读取、写入、合并单元格
一、POI项目简介 POI全称 Poor Obfuscation Implementation,利用POI接口可以通过JAVA操作Microsoft office 套件工具的读写功能。官网:http://poi.apache.org ,POI支持office的所有版本。 ...
关于POI导出excel合并相同数据单元格,添加备注
合并相同数据单元格 int departRow = 0; String departValue = &quot;&quot;; System.out.println(&quot;sheet.getLastRowNum()=&quot; + sheet.getLastRowNum()); for (int i = 2; i &amp;lt;= sheet.getLastRowNum() + 1; i++) { HSSFRow rows ...
POI shiftRows后合并单元格丢失的解决办法
最近在写模板导出,插入行要使用shiftRows,结果移动的行所有的合并格式都丢失了。在google了一下也没找到解决办法,stackoverflow也没解决的办法,说是poi的一个bug。 自己想了一个解决办法,供大家参考:InputStream template = TestExport.class.getResourceAsStream("/template/offering_list.xl
POI读取Excel合并单元格并储存
Java操纵POI解析Excel表,根据表头将内容储存。通过实体类set、get方便其它方法引用
Java 树形 数据 合并单元格导出Excel
场景:  数据库 表 是 父子关系 的树形 数据 ,需要导出Excel 模板
Excel转Html(八)--POI-解析获取合并单元格-按照X-Y坐标解析-与handsontable数据展示/存储一致
  public static List&amp;lt;DmFormMergedDto&amp;gt; getMergedCells(Sheet sheet, int rowIndex, int cellIndex, Long formId) {         List&amp;lt;CellRangeAddress&amp;gt; list = sheet.getMergedRegions();         List&amp;...
POI获取指定元素的合并单元格数
POI获取指定元素的合并单元格数 如下: public static int GetMergeNum(Cell cell, Sheet sheet) { int mergeSize = 1; List&amp;lt;CellRangeAddress&amp;gt; mergedRegions = sheet.getMergedRegions(); for (CellRangeAddress cellRang...
Java poi操作合并单元格后写入内容
今天做这个东西,开始一直显示不出来,不知道是先写还是先合并,发现都不行,网上找了下,好像没什么人注意这个问题,经过本人的实验,发现poi合并单元格过后他的列数是不变的,比如你第一行第一列和第四列合并,第一行第五列和第八列合并,你要往这两个合并单元格里面书写内容,正确的操作是找到合并单元格的开始那个单元格,比如上面那两个就应该往第一列和第五列里面写你要放的内容,这样才能显示你写入的数据。
java POI excel导出,并合并单元格设置宽度高度
最近在网上学习了java POI excel导出 整了一个例子,代码也简单,创建行、列、设置宽度高度、合并列 下面贴出我滴代码: public class Total{ private Integer payWay; private Float amount; private String creatTime; private String endTime;
poi合并单元格
POI进行跨行需要用到对象HSSFSheet对象,现在就当我们程序已经定义了一个HSSFSheet对象sheet。 跨第1行第1个到第2个单元格的操作为 sheet.addMergedRegion(new Region(0,(short)0,0,(short)1)); 跨第1行第1个到第2行第1个单元格的操作为 sheet.addMergedRegion(new Region(0,(short)...
java操作excel合并单元格,出现框线显示不全
// 提前设好的单元格样式 CellStyle cs = wb.createCellStyle(); cs.setVerticalAlignment(VerticalAlignment.CENTER); cs.setAlignment(HorizontalAlignment.CENTER); Font font = wb.createFont(); font.setBold(true); cs.s...
excel导出工具类(包含合并单元格)
package com.hime.util; import java.io.OutputStream; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.persistence.criteria.CriteriaBuilder.In; import javax.se
解决POI合并单元格后边框不显示问题
我这里用的方法可能比较笨,就是合并后其间的每个单元格都设置同样的单元格样式,便可以解决这个问题了,如果大家有更简单更好的方法,可以告诉一下,一起学习。 //定义Excel文档对象 XSSFWorkbook xssfWorkbook = new XSSFWorkbook(); //定义sheet Sheet sheet = xssfWorkbook.createSheet("demo"); //...
POI 导出Excel实现合并单元格以及列自适应宽度
目录   POI 导出Excel 1. 合并单元格 2. 自适应列宽度: 2.2 强调的是设置自适应列宽: 3. 设置列宽 3.1 字符串 3.2 单元格是公式单元格(单元格存的是公式) 4. POI IndexedColors 所有颜色索引   参考推荐: Java HSSFWorkbook 生成 excel POI 简易帮助文档系列--给Excel设置样式 Java...
poi导出excel合并单元格(包括列合并、行合并)
1 工程所需jar包如下: commons-codec-1.5.jar commons-logging-1.1.jar log4j-1.2.13.jar junit-3.8.1.jar poi-3.9-20121203.jar 2 Code: [code=&quot;java&quot;] /** * 导出设备信息Excel * @param form 和 HTTP 请求相...
java 利用poi 实现excel合并单元格后出现边框有的消失的解决方法
/** * 合并单元格后出现边框有的消失的解决方法 * @param borderStyle * @param region * @param sheet */ public static void setBorderStyle(BorderStyle borderStyle, CellRangeAddress region, XSSFSheet sheet){ RegionUtil.setBor...
java poi关于合并单元格时的问题
在使用addMergedRegion进行合并单元格时,如果合并的单元格内已有合并的单元格,那么合并后样式会显示不正常,如下图 此时,文字"hello"不在正中间 解决方法:合并前先解除原来的合并
poi 实现合并单元格
cell.setCellValue(&quot;销售订单&quot;); cell.setCellStyle(cellStyle1); PoiExcelUtil.setRegionStyle(sheet,new CellRangeAddress(0, 0, 0, 8), cellStyle1); PoiExcelUtil.mergeCell(sheet, 0, 0, 0, 8);  注意: 1、依赖于帮...
poi导出excel 合并单元格 边框问题
poi导出excel 纵向合并单元格后,边框消失的问题。 如上图,原本是合并了A/B/C/D/E列的第2、3行。但边框却有了。 网上搜索了几篇文章,最后是以下网址中得到答案: https://zhouchaofei2010.iteye.com/blog/1070857 具体解决办法记录如下: //合并A~J列第1、2行:             CellRangeAddress r...
poi导入/导出Excel表格,合并单元格的读取和设置
poi导入/导出Excel表格,合并单元格的读取和设置
poi合并单元格的处理
1、获取真实的单元格行数 2、判断是否有合并行 package util; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import org.apache.commons.io.Fi...
POI合并单元格边框显示问题,笨方法解决。如有更好的方法,欢迎留言,求指教告知
网上找了好多关于POI合并单元格的文章,无奈智商捉鸡,玩不出来,最后弄了个最麻烦的 //导出excel,含有合并单元格 @Test public void exoprtExc_MergedRegion() { String realpath = PoiTemplate.class.getResource("/").getPath() + "土地报批台账.xls"; String
合并单元格之后,写入信息到表格无法显示
我的问题是合并单元格之后,一直都只能显示上午,并不能显示下午 sheet.addMergedRegion(new CellRangeAddress(1, 1, 2, 5)); sheet.addMergedRegion(new CellRangeAddress(1, 1, 7, 10)); SXSSFRow row1 = sheet.crea...

相似问题