找回密码
 立即注册

QQ登录

只需一步,快速开始

bds_Paul

注册会员

19

主题

60

帖子

191

积分

注册会员

积分
191
bds_Paul
注册会员   /  发表于:2022-2-15 14:58  /   查看:1909  /  回复:7
1金币
本帖最后由 bds_Paul 于 2022-2-21 16:43 编辑

问题1:
我复制了附件文件的第一行到一个空工作表中,为什么调用 getUsedRange().getLastRow() 方法拿到的最后一行下标是5呢(预期应该是1)?
image.png16858214.png
代码如下:
IWorkbook sourceWorkbook = new Workbook();
sourceWorkbook.open("/Users/eleme/Downloads/215empty_1.xlsx");
IWorksheet sourceSheet = sourceWorkbook.getWorksheets().get(0);

IWorkbook targetWorkbook = new Workbook();
IWorksheet targetSheet = targetWorkbook.getWorksheets().get(0);

IRange headerRow = sourceSheet.getRows().get(0);
IRange targetHeaderRow = targetSheet.getRows().get(0);
headerRow.copy(targetHeaderRow, EnumSet.of(PasteType.Values, PasteType.Formats));
//只复制了一行 预期是1 结果是5
System.out.println(targetSheet.getUsedRange().getLastRow());
问题2:
合并单元格的复制问题,例如:工作表A的a4 a5单元格合并了,我逐行复制到一个新工作表B,在工作表B里合并单元格是空白的。我应该怎么复制一个合并单元格?或者我能够判断这个单元格是合并单元格吗?

image.png938880309.png

215empty_1.xlsx

11.42 KB, 下载次数: 44

221empty_1.xlsx

10.86 KB, 下载次数: 42

7 个回复

倒序浏览
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-2-15 17:41:42
沙发
您好,
问题1
描述问题已复现,待进一步调研,有进展会在贴中更新。

问题2
对含有合并单元格区域“逐行复制" ,最后会显示为”空白“,
这个行为是与Excel保持一致的,您可以在Excel中实际测试下。
不过为什么要逐行复制呢?您可以直接复制一个区域(比如多行)

回复 使用道具 举报
bds_Paul
注册会员   /  发表于:2022-2-15 17:49:49
板凳
Lynn.Dou 发表于 2022-2-15 17:41
您好,
问题1
描述问题已复现,待进一步调研,有进展会在贴中更新。

好的,问题1麻烦尽快看下,比较急
回复 使用道具 举报
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-2-15 17:54:14
地板
好的,有进展会第一时间在本贴更新。
本贴先做保留处理
回复 使用道具 举报
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-2-21 10:17:48
5#
本帖最后由 Lynn.Dou 于 2022-2-21 11:12 编辑

经调研,原因是单元格“T1”或“U1”包含注释,
注释自身有一定高度,所以会占据一定的单元格行数来保证足够空间进行展示,
因此getLastRow())获取的行数为5。
image.png831233520.png
注:
getLastRow 返回的结果为 行索引值 ,所以根据您的需求,期待的输出结果应该为 0 而不是 1。

解决方案:
1、如果不想保留comment,那么在复制前删除注释
2、如果想保留comment,在复制前调整注释的top值 和 高度 ,使占据一行单元格空间(如下图)
  1. // 获取第一行行高
  2.         Double rowHeight = sourceSheet.getRange("U1").getRowHeight();
  3.         //System.out.println(rowHeight);
  4.         // 修改comment top(原comment不是从top 0 位置开始的)
  5.         sourceSheet.getRange("U1").getComment().getShape().setTop(0);
  6.         sourceSheet.getRange("T1").getComment().getShape().setTop(0);
  7.         // 修改comment高度
  8.         sourceSheet.getRange("U1").getComment().getShape().setHeight(rowHeight);
  9.         sourceSheet.getRange("T1").getComment().getShape().setHeight(rowHeight);
复制代码


image.png625396422.png








回复 使用道具 举报
bds_Paul
注册会员   /  发表于:2022-2-21 16:48:11
6#
本帖最后由 bds_Paul 于 2022-2-21 16:56 编辑
Lynn.Dou 发表于 2022-2-21 10:17
经调研,原因是单元格“T1”或“U1”包含注释,
注释自身有一定高度,所以会占据一定的单元格行数来保证足 ...

是的,我的预期结果应该是0。我修改了一下文件内容,保留了一个单元格和注释(文件上传了,见221empty_1.xlsx),但是按照方案二获取的结果是1而不是0,这又是什么原因呢?
  1.     public void copyCommentTest() {
  2.         IWorkbook sourceWorkbook = new Workbook();
  3.         sourceWorkbook.open("/Users/eleme/Downloads/221empty_1.xlsx");
  4.         IWorksheet sourceSheet = sourceWorkbook.getWorksheets().get(0);

  5.         IWorkbook targetWorkbook = new Workbook();
  6.         IWorksheet targetSheet = targetWorkbook.getWorksheets().get(0);

  7.         IRange headerRow = sourceSheet.getRows().get(0);
  8.         IRange targetHeaderRow = targetSheet.getRows().get(0);
  9.         headerRow.copy(targetHeaderRow, EnumSet.of(PasteType.Values, PasteType.Formats));
  10.         Double height = targetSheet.getRange("A1").getRowHeight();
  11.         System.out.println("row height:" + height);
  12.         targetSheet.getRange("A1").getComment().getShape().setTop(0);
  13.         targetSheet.getRange("A1").getComment().getShape().setHeight(height);
  14.         //只复制了一行 预期是0 结果是1
  15.         System.out.println(targetSheet.getUsedRange().getLastRow());
  16.         System.out.println(targetSheet.getUsedRange().getCount());
  17.     }
复制代码
image.png887791137.png
回复 使用道具 举报
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-2-21 17:52:43
7#
文件收到,这边先根据您提供的信息测试下,有结果会在贴中更新。
回复 使用道具 举报
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-2-22 16:36:27
8#
经调研,受平台限制,浮点数计算的误差会导致某些位置计算错误,所以建议设置comment高度为行高的一半(或者至少小于行高,不能等于行高)。
前面回复中之所以给了行高(12.4)获取的值为0,是因为在java里面12.4转为float运算的时候变成12.3999999,所以实际上comment高度还是小于行高(12.4)得。
综上,
建议您将代码修改如下:
  1. IWorksheet sourceSheet = workbook.getWorksheets().get(0);

  2.         IWorkbook targetWorkbook = new Workbook();
  3.         IWorksheet targetSheet = targetWorkbook.getWorksheets().get(0);
  4.         // 获取第一行行高
  5.         Double rowHeight = sourceSheet.getRange("A1").getRowHeight();
  6.         // System.out.println(rowHeight);
  7.         sourceSheet.getRange("A1").getComment().getShape().setTop(0);
  8.         sourceSheet.getRange("A1").getComment().getShape().setHeight(rowHeight/2);

  9.         IRange headerRow = sourceSheet.getRows().get(0);
  10.         IRange targetHeaderRow = targetSheet.getRows().get(0);
  11.         headerRow.copy(targetHeaderRow, EnumSet.of(PasteType.Values, PasteType.Formats));
  12.         //只复制了一行 预期是0 结果是1
  13.         System.out.println(targetSheet.getUsedRange().getLastRow());
复制代码
image.png270068358.png

注:
按照您需求逻辑,应先修改sourceSheet中comment的行高和top值,
再进行第一行的复制。
您原先代码逻辑有误,具体请参考上方代码。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部