使用poi复制指定行的内容并插入

本文介绍了使用Java通过FileInputStream操作Excel文件,读取数据,定位特定行(&dataEnd)并创建新行进行数据和样式的复制,包括公式复制的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上代码


        FileInputStream in = new FileInputStream(new File("xxxx\\测试.xlsx"));
        //通过输入流读取指定的Excel文件
        XSSFWorkbook workbook = new XSSFWorkbook(in);
        //获取Excel文件的第1个Sheet页
        Sheet sheet = workbook.getSheetAt(0);
        int dataEnd = 0;
        for (Row row : sheet) {
            for (Cell cell : row) {
                if (cell.getCellType().equals(CellType.STRING)) {
            //这里的DATA_END为final static String DATA_END = "&dataEnd"; 
            //&dataEnd 是我在xlsx文件中的标识用来获取这个标识定位
                    if (cell.getRichStringCellValue().getString().equals(DATA_END)) {
                        dataEnd = cell.getRowIndex();
                    }
                }
            }
        }
       
        sheet.shiftRows(dataEnd, sheet.getLastRowNum(), 1, true, false);
        Row previousRow = sheet.getRow(dataEnd - 1);
        CellStyle rowStyle = previousRow.getRowStyle();
        // 创建新行并复制样式和数据
        Row newRow = sheet.createRow(dataEnd);
        newRow.setRowStyle(rowStyle);

        for (int i = 0; i < previousRow.getLastCellNum(); i++) {
            Cell oldCell = previousRow.getCell(i);
            Cell newCell = newRow.createCell(i);
            if (oldCell != null) {
                newCell.setCellStyle(oldCell.getCellStyle());
                switch (oldCell.getCellType()) {
                    case BLANK:
                        break;
                    case BOOLEAN:
                        newCell.setCellValue(oldCell.getBooleanCellValue());
                        break;
                    case ERROR:
                        newCell.setCellErrorValue(oldCell.getErrorCellValue());
                        break;
                    case FORMULA:
                        //注意这里复制的函数也跟上一行的相等  这里需要自己处理
                        //目前我还没想到怎么填充公式下来 ┭┮﹏┭┮
                        System.out.println(oldCell.getCellFormula());
                        newCell.setCellFormula(oldCell.getCellFormula()); // 复制公式
                        break;
                    case NUMERIC:
                        newCell.setCellValue(oldCell.getNumericCellValue());
                        break;
                    case STRING:
                        newCell.setCellValue(oldCell.getStringCellValue());
                        break;
                }
            }
        }
        FileOutputStream fileOut = new FileOutputStream("xxxxx\\测试1.xlsx");
        workbook.write(fileOut);
        fileOut.close();
        workbook.close();
        in.close();

图中&dataEnd 就是我要插入数据的位置。

谢谢支持

### 如何在 Apache POI插入空白使用 Apache POI 操作 Excel 文件时,可以通过创建新的 `HSSFRow` 或 `XSSFRow` 对象来实现插入空白的效果。需要注意的是,POI 未直接提供“插入”的方法,因此需要手动调整现有的位置创建新。 以下是具体实现方式: #### 创建一个新的空白 通过调用 `Sheet.createRow(int rowIndex)` 方法可以指定索引位置创建一。如果该索引处已有数据,则会覆盖原有数据[^2]。为了防止这种情况发生,在创建新之前应先移动后续的数据到更高的索引位置。 #### 移动现有的 由于 POI 不支持直接移动的操作,需逐一遍历受影响的单元格将它们复制到目标位置。完成后再删除原始即可模拟出“插入”效果。 下面是一个完整的 Java 实现示例代码用于向特定位置插入空白: ```java import org.apache.poi.ss.usermodel.*; import java.io.FileOutputStream; import java.util.List; public class InsertBlankRowExample { public static void main(String[] args) throws Exception{ Workbook workbook = new XSSFWorkbook(); // or HSSFWorkbook for .xls files Sheet sheet = workbook.createSheet("New Sheet"); // 原始数据填充 String[][] data = {{"A1", "B1"}, {"A2", "B2"}, {"A3", "B3"}}; int rowNum = 0; for (String[] rowData : data){ Row row = sheet.createRow(rowNum++); int colNum = 0; for (String field : rowData){ Cell cell = row.createCell(colNum++); cell.setCellValue(field); } } // 插入空白逻辑 int insertRowAt = 1; // 要插入空白的位置 shiftRows(sheet, insertRowAt, sheet.getLastRowNum(), 1); try(FileOutputStream fileOut = new FileOutputStream("workbook.xlsx")){ workbook.write(fileOut); } workbook.close(); } /** * 将从 start 到 end 的所有向下偏移 n . */ private static void shiftRows(Sheet sheet, int start, int end, int n){ if(n == 0 || start > end){ return ; } for(int i=end;i>=start;i--){ Row oldRow=sheet.getRow(i); if(oldRow != null){ Row newRow=sheet.createRow(i+n); copyRow(sheet,oldRow,newRow); sheet.removeRow(oldRow); } } } /** * 复制内容至目标. */ private static void copyRow(Sheet sheet, Row srcRow, Row destRow){ for(Cell srcCell:srcRow){ Cell newCell=destRow.createCell(srcCell.getColumnIndex()); copyCell(sheet,srcCell,newCell); } } /** * 单元格内容拷贝函数. */ private static void copyCell(Sheet sheet, Cell srcCell, Cell destCell){ switch(srcCell.getCellType()){ case STRING: destCell.setCellValue(srcCell.getStringCellValue()); break; case NUMERIC: destCell.setCellValue(srcCell.getNumericCellValue()); break; default : System.out.println("Unsupported Cell Type"); } } } ``` 此代码展示了如何在一个工作表中插入空白以及如何处理可能存在的其他数据位移问题[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值