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

2023-11-30

不知何故,我设法在现有 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);

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

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


无耻地复制行的辅助函数改编自here

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

        // 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);
            }
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 在javascript中检索被点击元素的getAttribute

    我的网页上有很多图片 img src 1 jpg br img src 2 jpg 我正在尝试使用下面的 javascript 获取单击图像的 src var getImageName function document onclick f
  • HTTP 404 - 找不到文件 Internet Explorer V6

    我有 ang 404 代码 如果找不到该页面 它将重定向到该网站 它在火狐浏览器中运行正常 但是 当我使用 Internet Explorer v6 该网站将收到错误消息 HTTP 404 文件未找到 Internet Explore 我怎
  • Microsoft Office Access 数据库引擎无法打开或写入该文件

    我收到以下异常 Microsoft Office Access 数据库引擎无法打开或写入 文件 它已被其他用户独占打开 或者您 需要查看和写入其数据的权限 at Econ Open public partial class LBMIS1Ne
  • android 已建立的连接被主机中的软件中止

    2014 03 30 19 55 57 ddmlib An established connection was aborted by the software in your host machine java io IOExceptio
  • 如何通过为所有具有相同日期的文件创建一个存档来存档超过 7 天的文件?

    我正在寻找可以帮助我制定计划任务以自动将日志文件移动到 RAR 存档中的人 它不一定是批处理文件解决方案 如果您有其他想法请分享 我得到了它的基本代码 这是我到目前为止的批处理文件代码 C Program Files WinRAR rar
  • 如何通过我的代码访问 iPhone 的设置?

    我想要做的就是能够判断我的应用程序的用户是否使用 24 小时制 我意识到我无法设置这些设置 我只想读取它们 如果您不知道我在说什么 我希望能够读取用户在 iPhone 内置 设置 应用程序中设置的值 以灰色齿轮为图标的那个 我尝试用谷歌搜索
  • 每页的 Mat 分页器项目在 Angular 9 中不起作用

    我正在从可观察对象渲染表数据 然后将数据源分配给分页器 下一页箭头以及首页和最后一页按钮都可以使用 当我尝试更改每页的项目时 它不起作用 我尝试了 ngAfterViewInit 和页面事件调用 但它们没有任何区别 import Compo
  • 受保护的静态方法可见性

    考虑这种情况 请注意 为了简洁起见 类型和方法体已被省略 当我需要这样做时 这可以让我连接到数据 public abstract class DatabaseAccessor protected static object GetDataF
  • Perl 代码分析工具

    我需要测试 Perl 应用程序 文件操作 数据库操作等 我正在寻找 Perl 代码的配置工具 Linux 中是否有类似 gprof 的 Perl 代码分析工具 有些人可能建议使用 Devel DProf 作为最标准的方法 但如果你仔细观察
  • 仅当用户不在另一个表中时才从一个表中选择用户

    我们有两张表 用户 id name borrower 1 Peter 1 2 John 1 3 Mark 1 4 David 0 贷款 id from to amount 1 1 2 100 我需要输出 Peter 没有借过任何钱并且借款人
  • 运行带有太多空格的程序

    我有一个在命令提示符下运行良好的命令 CMD C C Program Files x86 VideoLAN VLC VLC vvv http www foo com 8085 video mp4 playlist m3u8 wmsAuthS
  • 如何递归遍历目录树并仅查找文件?

    我正在研究一个scp调用以下载远程系统上存在的文件夹 下载的文件夹有子文件夹 在这些子文件夹中有一堆文件 我想将它们作为参数传递给 python 脚本 如下所示 scp r email protected SomeName SomeName
  • 如果有新版本可用,如何强制更新 Android 应用程序?

    我正在开发一个应用程序 如果游戏商店上有新版本 我想向应用程序用户强制更新 该应用程序应该向用户显示一条对话框消息 public class ForceUpdateAsync extends AsyncTask
  • 选择套接字输出接口:SO_BINDTODEVICE 与连接前绑定

    我正在尝试在具有两个接口的系统上设置套接字的输出接口 我用谷歌搜索了很多 发现了不同的答案 有人说我可以bind调用之前的套接字connect选择一个特定的接口 如套接字如何知道要使用哪个网络接口控制器 但其他人说这还不够 如http co
  • 如何使用弹性框重新排序 div?

    我试图为我的 DOM 保持 seo 友好和语义结构 而不重复整个元素以在不同位置显示它们 我的布局基于display flex项目 我尝试实现以下目标 需要了解的重要事项 我不想根据窗口宽度显示 隐藏 div 以避免不必要的重复 所有 di
  • 移动时修改 SKNode 的属性

    我有一个 SKNode 的子类 它充当我的 生物 它们使用 SKActions 自动在场景中移动 我有兴趣在生物移动时修改 减少 能量 属性 Int 不保证生物能够移动 SKAction 的整个长度 它可以被中断 因此计算总距离然后在它开始
  • NetBeans 的启动屏幕功能如何工作?

    NetBeans 新手 刚刚注意到文件 gt gt 项目属性 gt gt 应用程序对话框有一个标记为的文本字段启动画面它允许您指定程序启动时要显示的图像的路径 我想自定义启动屏幕的工作方式 添加进度条等 并且想从头开始编写代码 但不知道从哪
  • 如何更改闪亮的应用程序数据表输出字体颜色和辅助表元素颜色?

    我正在使用深色主题 闪亮主题中的石板 创建一个闪亮的应用程序 但是当我应用该主题时 我的 renderDataTable 输出存在两个问题 应用程序背景太暗 看不到表格外的元素 显示 XX 条目 底部页码等 表中的文字太浅 难以阅读 对于问
  • Django 使用 AJAX 在模板中渲染模板

    我的网站目前在自己的页面上呈现表单 我正在尝试让它们在我的主页上的侧边栏 div 标签内呈现 但是 我不知道如何塑造 JavaScript 和 或视图 因此我取回表单模板的 HTML 并将其插入到 div 标记中 UPDATE 我在控制台中
  • 如何使用 HSSF (Apache POI) 在现有 Excel 中的两行之间插入一行

    不知何故 我设法在现有 Excel 文件中的两行之间创建新行 问题是 一些格式没有包含在行的移动中 其中之一是隐藏的行在轮班期间没有相对地进行 我的意思是 例如 第 20 到 30 行被隐藏 但是当创建新行时 格式仍然存在 在插入 创建新行