导入excel 文件解析,一行数据,有一列分两行显示,解析时如何 合为一行?
来源:互联网 发布:哪个看书软件全部免费 编辑:程序博客网 时间:2024/06/03 18:10
现象如图
实现代码:
1主方法测试
public static void main(String[] args) throws FileNotFoundException, IOException {
if (args.length < 1) {
System.out.println("请提供Excel文件名作为参数。");
System.exit(-1);
}
String fileName = args[0];
FileInputStream fis = new FileInputStream(fileName);
POIFSFileSystem fs = new POIFSFileSystem(fis);
HSSFWorkbook wb = new HSSFWorkbook(fs);
HSSFSheet sheet = wb.getSheetAt(0);
HSSFSheet ns = MergeRows(sheet, 2, 0);
wb.write(new FileOutputStream(fileName + "1.xls"));
}
2实现方法
/**
* @param sheet
* 需要处理的ExcelSheet
* @param startRow
* 开始行
* @param checkColumn
* 进行合并行的依据列,即如果该行的值不为空则需要保留,如果为空则需要将内容合并至上端非空的行
* @return
*/
public static HSSFSheet MergeRows(HSSFSheet sheet, int startRow, int checkColumn) {
ExcelReader excelReader = new ExcelReader();
HSSFSheet newSheet = sheet.getWorkbook().createSheet(UUIDGenerator.getUUID());
if (sheet.getLastRowNum() == 0 && sheet.getRow(0) == null || startRow < 0 || checkColumn < 0
|| checkColumn > sheet.getPhysicalNumberOfRows()) {
// 空表同样返回空表
// 无效起始行
// 无效判断列
return newSheet;
}
{
// 复制表头
for (int i = 0; i < startRow && i < (sheet.getLastRowNum() + 1); i++) {
HSSFRow newRow = newSheet.createRow(i);
if (sheet.getRow(i) == null) {
continue;
}
Iterator<Cell> it = sheet.getRow(i).cellIterator();
while (it.hasNext()) {
Cell cell = (Cell) it.next();
if (cell.isPartOfArrayFormulaGroup() && cell.getArrayFormulaRange().getFirstRow() != i) {
// 合并数据,并且开始行非当前行,忽略,继续下一个单元格
continue;
}
String v = excelReader.getCellFormatValue((HSSFCell) cell);
if (v != null && v.length() > 0) {
// 非空单元格,复制至新的Sheet
newRow.createCell(cell.getColumnIndex()).setCellValue(v);
}
}
}
}
{
// 如果checkColumn的值不为空,则创建新的行,否则直接添加至最后一行
HSSFRow rowNew = null;
for (int i = startRow; i < sheet.getLastRowNum() + 1; i++) {
HSSFRow rowOrg = sheet.getRow(i);
HSSFCell checkCell = rowOrg.getCell(checkColumn);
String checkCellValue = excelReader.getCellFormatValue(checkCell);
if (!StringUtils.isHaveNullOrBlankTrim(checkCellValue)) {
if (newSheet.getRow(newSheet.getLastRowNum()) == null) {
rowNew = newSheet.createRow(newSheet.getLastRowNum());
} else {
rowNew = newSheet.createRow(newSheet.getLastRowNum() + 1);
}
// 复制本行的值
Iterator<Cell> it = rowOrg.cellIterator();
while (it.hasNext()) {
Cell cell = (Cell) it.next();
if (cell.isPartOfArrayFormulaGroup() && cell.getArrayFormulaRange().getFirstRow() != i) {
// 合并数据,并且开始行非当前行,忽略,继续下一个单元格
continue;
}
String v = excelReader.getCellFormatValue((HSSFCell) cell);
if (v != null && v.length() > 0) {
// 非空单元格,复制至新的Sheet
rowNew.createCell(cell.getColumnIndex()).setCellValue(v);
}
}
} else {
// 关键列值为空,需要将本行数据合并至最后一行
if (rowNew != null) {
Iterator<Cell> it = rowOrg.cellIterator();
while (it.hasNext()) {
Cell cell = (Cell) it.next();
if (cell.isPartOfArrayFormulaGroup() && cell.getArrayFormulaRange().getFirstRow() != i) {
// 合并数据,并且开始行非当前行,忽略,继续下一个单元格
continue;
}
String v = excelReader.getCellFormatValue((HSSFCell) cell);
if (v != null && v.length() > 0) {
// 非空单元格,创建或追加至新的Sheet
HSSFCell c = rowNew.getCell(cell.getColumnIndex());
if (c == null) {
rowNew.createCell(cell.getColumnIndex()).setCellValue(v);
} else {
c.setCellValue(excelReader.getCellFormatValue(c) + v);
}
}
}
}
}
}
}
return newSheet;
}
笑图:
- 导入excel 文件解析,一行数据,有一列分两行显示,解析时如何 合为一行?
- sql server中将一列多行的数据转成一列一行,和一行数据解析成一行多列
- sql server 一列显示为一行
- excel引用最后一行一列
- QT操控excel1:如何实现读取excel文件的任意一行一列的值
- 一个简单的方法查询一列数据为一行
- 导入excel解析数据
- Excel导入解析数据
- 显示excel最后一行
- mysql多行多列合并为一行一列
- mysql多行多列合并为一行一列 【转】
- hive一行数据中一列拆分成多行
- hive一行数据中一列拆分成多行
- hive一行数据中一列拆分成多行
- execl 如何同时冻结一行与一列
- SQLite3 一列多行合并为一列一行
- SQLite3 一列多行合并为一列一行
- excel将一行或一列转换为10个的方阵
- Allegro PCB gerber快速生成光绘文件。
- vector, list, deque的区别
- java数据结构和算法
- 【Android】getLeft(),getRight()值为0,应在何时正确获取他们的值
- InvocationHandler中invoke()方法的调用问题
- 导入excel 文件解析,一行数据,有一列分两行显示,解析时如何 合为一行?
- DBGridEh设置选中的行的颜色
- 先锋机器人实践(二):RosAria_client代码注释
- JDBCUtils
- Tomcat connector 实现原理
- Codeforces Round #433 B.Maxim Buys an Apartment
- 项目1——C/C++语言中参数传递的三种方式
- TensorFlow
- 正则表达式