在网上搜了很久关于poi删除带有合并单元格的一行后,下面行数据向上移动一行时,出现乱合并的问题,看到有人提过这个问题,但是郁闷的很没有一个人回答过,而且大部分的文章都是关于什么合并单元格,读取Excel,写入Excel,真搞不懂,能来一个创新点的吗,唉!我出现的情况,如下图情况
原模板文件:
删除地11行带有合并单元格的行后,后面的数据上移,导致第12行上移后出现乱合并问题
我现在只有这种方法:因为是读取模板,向模板中写入数据,即模板就会固定,则通过找到要操作的带有合并单元格的行,通过removeMergedRegion(int i)这个方法来移除合并单元格,移除和即对应的行没有合并单元格了,再将后面的数据上移sheet.shiftRows(lastRowNum-4,lastRowNum,-1),根据这个思路看下面的代码:
public class PoiExcel {
public static void main(String[] args) {
try {
InputStream is = new FileInputStream("report.xls");
try {
HSSFWorkbook workbook = new HSSFWorkbook(is);//找到工作博
//获取sheet
HSSFSheet sheet = workbook.getSheetAt(0);//找到sheet
int lastRowNum = sheet.getLastRowNum();
HSSFRow row = null;
if(sheet.getRow(0)==null){
row = sheet.createRow(0);
}else{
row = sheet.getRow(0);
}
// 向模板中写入数据
HSSFCell cell = row.createCell(0);
cell.setCellValue("100000");
if(sheet.getRow(10)==null){
row = sheet.createRow(10);
}else{
row = sheet.getRow(10);
}
HSSFRow rows = sheet.getRow(lastRowNum-5);
rows.createCell(0).setCellValue("11111");
rows.createCell(1).setCellValue("9283");
rows.createCell(2).setCellValue("2222");
rows.createCell(3).setCellValue("5555");
rows.createCell(4).setCellValue("444");
//寻找指定的合并单元格,再移除
removeMergedRegion(sheet, lastRowNum-5, 1);
//再将后面的数据向上移动
sheet.shiftRows(lastRowNum-4,lastRowNum,-1);
OutputStream os = new FileOutputStream("D:/保费报表.xls");
workbook.write(os);//将内存的中excel写入到保费报表.xls中
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
public static void removeMergedRegion(HSSFSheet sheet,int row ,int column)
{
int sheetMergeCount = sheet.getNumMergedRegions();//获取所有的单元格
int index = 0;//用于保存要移除的那个单元格序号
for (int i = 0; i < sheetMergeCount; i++) {
CellRangeAddress ca = sheet.getMergedRegion(i); //获取第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)
{
index = i;
}
}
}
sheet.removeMergedRegion(index);//移除合并单元格
}
}
删除后的结果: