概述
POI进行Excel的合并单元格数据处理
近日接到一个要处理合并Excel单元格的上料表的需求,就到网上找了一些模板,发现有的技术大牛还是挺厉害的,对他们致以敬意。
合并单元格工具类
在这个类中将传入的文件转化成流对象,再对其进行具体的数据处理
public class ExcelUtilsMerge {
public static Map<String, Object> readFileContentToEntity(InputStream inputStream) {
Map<String, Object> excelMap = new HashMap<>(16);
List<List<ExcelEntity>> result = new ArrayList<>();
Workbook wb = null;
try {
wb = WorkbookFactory.create(inputStream);
} catch (IOException e) {
}
if (wb == null) {
return excelMap;
}
// 获取excel中存在的sheet个数
int sheetsNum = wb.getNumberOfSheets();
if (sheetsNum <= 0) {
return excelMap;
}
for (int i = 0; i < sheetsNum; i++) {
Sheet sheet = wb.getSheetAt(i);
// 读取excel数据
if (sheet.getPhysicalNumberOfRows() <= 0) {
continue;
}
int coloumNum = sheet.getRow(0).getPhysicalNumberOfCells();
result.addAll(dealWithExcelSheet(sheet));
// 列总数
excelMap.put("totalColumnNumber", coloumNum);
// 数据集
excelMap.put("data", result);
}
return excelMap;
}
/**
* @Description: 读取sheet中的数据
* @author: drj
* @date: 2019/5/22 17:14
*/
private static List<List<ExcelEntity>> dealWithExcelSheet(Sheet sheet) {
List<List<ExcelEntity>> result = new ArrayList<>();
// 遍历sheet行
for (int i = 0; i < sheet.getPhysicalNumberOfRows(); i++) {
List<ExcelEntity> record = new ArrayList<>();
Row row = sheet.getRow(i); //首先獲取Excel的行
// 遍历行中的没有个单元格
if (row == null || row.getPhysicalNumberOfCells() <= 0) {
continue;
}
//循環列
for (int j = 0; j < row.getPhysicalNumberOfCells(); j++) {
Cell cell = row.getCell(j); //獲取沒個單元的值
if (cell == null) {
continue;
}
// 读取单元格数据格式(标记为字符串)
cell.setCellType(CellType.STRING);
String value = cell.getStringCellValue();
// 处理有值的cell
if (StringUtils.isEmpty(value)) {
continue;
}
try {
value = value.trim();
ExcelEntity entity = new ExcelEntity(); //初始化封裝好的返回Excel實體類
// 起始行数
entity.setStartRow(i);
// 结束行数
entity.setEndRow(getMergeRowNum(cell, sheet) + i - 1); //加上当前行数,因为获取的当前行数加了1,所以要减1
// 起始列数
entity.setStartCol(j);
// 结束列数
entity.setEndCol(getMergeColumNum(cell, sheet) + j - 1); //加上当前列数,因为获取的当前列数加了1,所以要减1
// 单元格数据
entity.setValue(value); //将获取的值添加Value里
record.add(entity);
} catch (NumberFormatException e) {
}
}
result.add(record);
}
return result;
}
/**
* @param cell 当前cell
* @param sheet 当前sheet
* @Description: 获取当前cell合并的行数
* @author: drj
* @date: 2019/5/22 18:00
*/
public static int getMergeRowNum(Cell cell, Sheet sheet) {
int mergeSize = 1;
List<CellRangeAddress> mergedRegions = sheet.getMergedRegions(); //獲取的是合併的區域
for (CellRangeAddress cellRangeAddress : mergedRegions) { //對合併區域進行循環
if (cellRangeAddress.isInRange(cell)) { //判斷傳入單元格是否在合併區域中
//获取合并的行数
mergeSize = cellRangeAddress.getLastRow() - cellRangeAddress.getFirstRow() + 1;
break;
}
}
return mergeSize;
}
/**
* @param cell 当前cell
* @param sheet 当前sheet
* @Description: 获取合并的列数
* @author: drj
* @date: 2019/5/22 17:59
*/
public static int getMergeColumNum(Cell cell, Sheet sheet) {
int mergeSize = 1;
List<CellRangeAddress> mergedRegions = sheet.getMergedRegions();
for (CellRangeAddress cellRangeAddress : mergedRegions) {
if (cellRangeAddress.isInRange(cell)) {
//获取合并的列数
mergeSize = cellRangeAddress.getLastColumn() - cellRangeAddress.getFirstColumn() + 1;
break;
}
}
return mergeSize;
}
}
返回的Excel对象实体类
这个类定义了要返回的结果集对象,封装了开始行结束行,开始列结束列,以及单元格的值.
public class ExcelEntity {
/**
* 开始行
*/
private int startRow;
/**
* 结束行
*/
private int endRow;
/**
* 开始列
*/
private int startCol;
/**
* 结束列
*/
private int endCol;
/**
* 单元格值
*/
private String value;
public int getStartRow() {
return startRow;
}
public void setStartRow(int startRow) {
this.startRow = startRow;
}
public int getEndRow() {
return endRow;
}
public void setEndRow(int endRow) {
this.endRow = endRow;
}
public int getStartCol() {
return startCol;
}
public void setStartCol(int startCol) {
this.startCol = startCol;
}
public int getEndCol() {
return endCol;
}
public void setEndCol(int endCol) {
this.endCol = endCol;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
测试类
返回的结果集的数据类型是List,然后每一行封装为一个类型为ExcelEntity的List.
InputStream inputStream = file.getInputStream();
Map<String, Object> result = ExcelUtilsMerge.readFileContentToEntity(inputStream);
List<List<ExcelEntity>> data = (List<List<ExcelEntity>>) result.get("data");
网上的技术点琳琅满目,而在这样杂而乱的网络环境中,亦要吸取其精华,让它变为自己的东西,这才是真正的学习~
最后
以上就是怕孤独小懒虫为你收集整理的POI进行Excel的合并单元格数据处理POI进行Excel的合并单元格数据处理的全部内容,希望文章能够帮你解决POI进行Excel的合并单元格数据处理POI进行Excel的合并单元格数据处理所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复