当前位置: 首页 > 面试题库 >

如何使用HSSF(Apache POI)在现有Excel中的两行之间插入一行

孟栋
2023-03-14
问题内容

我以某种方式设法在现有excel文件的两行之间创建新行。问题是,随着行的移动,某些格式未包括在内。

其中之一是,在转移过程中,皮的行相对不走。我的意思是(例如),从20到30的行被隐藏,但是当创建新的行时,格式仍然存在。隐藏的行在插入/创建新行时也必须移动,应该为21到31。

另一件事是,工作表中不在单元格中的其他对象。像文本框一样,创建新行后不会随之移动。这些对象的位置固定。但是我希望它移动,就像我在excel中插入新行或粘贴行一样。如果有插入新行的功能,请告诉我。

这就是我现在所拥有的,只是我代码中的一小段。

HSSFWorkbook wb = new HSSFWorkbook(template); //template is the source of file
HSSFSheet sheet = wb.getSheet("SAMPLE");
HSSFRow newRow;
HSSFCell cellData;

int createNewRowAt = 9; //Add the new row between row 9 and 10

sheet.shiftRows(createNewRowAt, sheet.getLastRowNum(), 1, true, false);
newRow = sheet.createRow(createNewRowAt);
newRow = sheet.getRow(createNewRowAt);

如果可以复制和粘贴行,那将有很大帮助。但是我已经在这里问了,找不到解决方案。因此,我决定创建一行作为临时解决方案。我已经完成了,但是有这样的问题。

任何帮助都感激不尽。谢谢!


问题答案:

辅助功能从这里无耻地复制行

import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.util.CellRangeAddress;

import java.io.FileInputStream;
import java.io.FileOutputStream;

public class RowCopy {

    public static void main(String[] args) throws Exception{
        HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream("c:/input.xls"));
        HSSFSheet sheet = workbook.getSheet("Sheet1");
        copyRow(workbook, sheet, 0, 1);
        FileOutputStream out = new FileOutputStream("c:/output.xls");
        workbook.write(out);
        out.close();
    }

    private static void copyRow(HSSFWorkbook workbook, HSSFSheet worksheet, int sourceRowNum, int destinationRowNum) {
        // Get the source / new row
        HSSFRow newRow = worksheet.getRow(destinationRowNum);
        HSSFRow sourceRow = worksheet.getRow(sourceRowNum);

        // If the row exist in destination, push down all rows by 1 else create a new row
        if (newRow != null) {
            worksheet.shiftRows(destinationRowNum, worksheet.getLastRowNum(), 1);
        } else {
            newRow = worksheet.createRow(destinationRowNum);
        }

        // Loop through source columns to add to new row
        for (int i = 0; i < sourceRow.getLastCellNum(); i++) {
            // Grab a copy of the old/new cell
            HSSFCell oldCell = sourceRow.getCell(i);
            HSSFCell newCell = newRow.createCell(i);

            // If the old cell is null jump to next cell
            if (oldCell == null) {
                newCell = null;
                continue;
            }

            // Copy style from old cell and apply to new cell
            HSSFCellStyle newCellStyle = workbook.createCellStyle();
            newCellStyle.cloneStyleFrom(oldCell.getCellStyle());
            ;
            newCell.setCellStyle(newCellStyle);

            // If there is a cell comment, copy
            if (oldCell.getCellComment() != null) {
                newCell.setCellComment(oldCell.getCellComment());
            }

            // If there is a cell hyperlink, copy
            if (oldCell.getHyperlink() != null) {
                newCell.setHyhtml" target="_blank">perlink(oldCell.getHyperlink());
            }

            // Set the cell data type
            newCell.setCellType(oldCell.getCellType());

            // Set the cell data value
            switch (oldCell.getCellType()) {
                case Cell.CELL_TYPE_BLANK:
                    newCell.setCellValue(oldCell.getStringCellValue());
                    break;
                case Cell.CELL_TYPE_BOOLEAN:
                    newCell.setCellValue(oldCell.getBooleanCellValue());
                    break;
                case Cell.CELL_TYPE_ERROR:
                    newCell.setCellErrorValue(oldCell.getErrorCellValue());
                    break;
                case Cell.CELL_TYPE_FORMULA:
                    newCell.setCellFormula(oldCell.getCellFormula());
                    break;
                case Cell.CELL_TYPE_NUMERIC:
                    newCell.setCellValue(oldCell.getNumericCellValue());
                    break;
                case Cell.CELL_TYPE_STRING:
                    newCell.setCellValue(oldCell.getRichStringCellValue());
                    break;
            }
        }

        // If there are are any merged regions in the source row, copy to new row
        for (int i = 0; i < worksheet.getNumMergedRegions(); i++) {
            CellRangeAddress cellRangeAddress = worksheet.getMergedRegion(i);
            if (cellRangeAddress.getFirstRow() == sourceRow.getRowNum()) {
                CellRangeAddress newCellRangeAddress = new CellRangeAddress(newRow.getRowNum(),
                        (newRow.getRowNum() +
                                (cellRangeAddress.getLastRow() - cellRangeAddress.getFirstRow()
                                        )),
                        cellRangeAddress.getFirstColumn(),
                        cellRangeAddress.getLastColumn());
                worksheet.addMergedRegion(newCellRangeAddress);
            }
        }
    }
}


 类似资料:
  • 我有一个excel文件,其中有2列。我想使用java程序在现有的第一列和第二列之间添加一个新列。为此,我正在尝试使用Apache POI。我浏览了api文档和一些相关的栈溢出问题,但是我可以找到只删除/更新单元格(而不是插入整个列)的例子。 有谁能分享一些有用的线索吗?我现在能想到的唯一解决方案是创建一个新的3列工作表,从旧的工作表中复制第1列和第3列的值

  • 我正在开发一个与Excel表相关的桌面应用程序。我在两行之间插入行时遇到一些问题。在使用ApachePOI的Java中是否有可能这样做?

  • 怎么用代码实现向Excel中插入一列的操作? 比如说往A列和B列中间插入一列,要怎么办?最好是Java

  • 嗨,我想在第一行搜索一个字符串,如果找到了,我想移动那一列。

  • 我插入数据到一个电子表格与新的谷歌工作表API v4,代码完美的工作和数据它是插入良好的工作表。 但是如何找出最后一行有数据来添加后面的数据呢? A1符号中有什么技巧吗? 我需要一个相当于。

  • 批量订单 Purchorder 我已经试了一个星期了。我有这两个表,batchporder和purchord在batchporder表中,我需要插入一行,并获得传递给purchord插入的主id。在purchord中,我需要插入多行,因此我使用了insert\u batch。 控制器 模型 错误1 遇到PHP错误严重性:警告 消息:array_keys()要求参数1为数组,字符串为给定值 文件名: