java - 如何使用 Apache POI 将现有 Excel 工作表中的一行复制到新的 Excel 工作表?

标签 java excel apache-poi

我想比较两个 excel 工作表,看看是否有任何行不同,如果有,我想将与该 excel 不同的单行复制到新 excel 中的新行。下面是我从网上获取并尝试过的代码片段,但是如果我将现有 excel 的第 10 行(例如)复制到新 excel 的第一行,第一行在新 excel 中正确复制但所有剩余行从第一个 excel 也复制到新的。我认为问题出在我写入新 excel 的方式 [workbook.write(out)] 请帮忙!!提前致谢!!

    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.setHyperlink(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;
        }
    }
}

最佳答案

只需修改copyRow方法,添加参数HSSFSheet resultSheet,然后修改方法中的newRow变量,从resultSheet<获取像这样

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

从您的目标“output.xls”中获取结果表

关于java - 如何使用 Apache POI 将现有 Excel 工作表中的一行复制到新的 Excel 工作表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22627691/

相关文章:

java - 使用 Apache POI 打印电话号码(字符串)以显示为科学计数法 (4.165551234E9)

java - 提取数组中的 Excel 单元格值

Java:Oracle XMLType + JDBC

java - 如何在 Java 中从 Excel 中的列名中读取值

python - 将值写入python中 Pandas 工作表中的特定单元格

java - 没有写在excel表中

java - 这是聚合吗?

java - 为什么原生 libmpg123 在带有 libgdx 的 Android 上花费这么长时间?

java - MGWT ScrollPanel 不可滚动?

c# - 卡住多个工作表中的 Pane C#