JXL复制单元格

     最近做个项目,需要将数据保存到EXCEL文件中,EXCEL模板只有一条记录存放的表格,因此需要根据记录条数,复制出对应数量的表格来。且表格中包含合并单元格以及样式。

     JXL自带的复制只能复制整个SHEET,不方便,我自己写了一个复制任意范围单元格的方法。欢迎大家批评!

 

 

/**
  *
  * @param sheet
  *        操作对象
  * @param mergedCell
  *        所有合并单元格范围

  *        考虑到该方法可能被循环调用多次,而且是复制同一个表格到不同地方,因此本参数记录的原始

  * 被拷贝表格中的单元格,避免在多次循环后,本参数数据量不断增加,导致遍历时间太长。即本参数值需在调用

  * 本方法的循环外就已经获得。

  *
  * @param from1Cols
  *        被复制表格开始列
  * @param from1Row
  *        被复制表格开始行
  * @param to1Col
  *        被复制表格结束列
  * @param to1Row
  *        被复制表格结束行
  * @param from2Col
  *        复制到表格开始列
  * @param from2Row
  *        复制到表格开始行
  * @return boolean
  *        是否完整
  * @throws IOException
  */
 public static boolean copyCells(WritableSheet sheet, Range[] mergedCell,
   int from1Col, int from1Row, int to1Col, int to1Row, int from2Col,
   int from2Row) throws IOException {

  // 复制表格的高和长
  int tabHigh = to1Row - from1Row + 1;

  try {
   // 制作表格,先合并单元格
   for (int i = 0; i < (to1Row - from1Row + 1); i++) {

    // 选中区域下一行
    sheet.insertRow(from2Row + i);
    sheet
      .setRowView(from2Row + i, sheet.getRowHeight(from1Row
        + i));
    // 对插入行的列进行处理,即单元格
    for (int j = 0; j < (to1Col - from1Col); j++) {

     CellFormat cf = sheet.getWritableCell(from1Col + j,
       from1Row + i).getCellFormat();

     String content = sheet.getCell(from1Col + j, from1Row + i)
       .getContents();

     if (cf == null) {
      sheet.addCell(new Label(from1Col + j, from2Row + i,
        content));
     } else {
      sheet.addCell(new Label(from1Col + j, from2Row + i,
        content, cf));
     }
    }
   }

   // 合并单元格

   for (int i = 0; i < mergedCell.length; i++) {
    int fromRow = mergedCell[i].getTopLeft().getRow();
    int fromCol = mergedCell[i].getTopLeft().getColumn();

    int toRow = mergedCell[i].getBottomRight().getRow();
    int toCol = mergedCell[i].getBottomRight().getColumn();

    // 如果检测到的合并单元格,在复制表格内,则将对应粘贴表的单元格合并。列数=原列数+表高,列数=原列数
    if (fromRow >= from1Row && fromCol >= from1Col
      && toRow <= to1Row && toCol <= to1Col) {
     sheet.mergeCells(fromCol, fromRow + from2Row, toCol, toRow
       + from2Row);
    }
   }

  } catch (RowsExceededException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
   return false;
  } catch (WriteException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
   return false;
  }
  return true;
 }

 

      我用起来没什么问题,如果大家有什么好的建议可以说。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值