2019独角兽企业重金招聘Python工程师标准>>>

来点干货直接上代码,就不细说了

package com.qs.web.tools.core.excel;

import java.util.HashMap;

import java.util.Map;

import java.util.Set;

import java.util.TreeSet;

import org.apache.poi.hssf.usermodel.HSSFCell;

import org.apache.poi.hssf.usermodel.HSSFCellStyle;

import org.apache.poi.hssf.usermodel.HSSFRow;

import org.apache.poi.hssf.usermodel.HSSFSheet;

import org.apache.poi.ss.util.CellRangeAddress;

public   class ExcelCopySheetUtil {

public ExcelCopySheetUtil() {

}

public static void copySheets(HSSFSheet newSheet, HSSFSheet sheet) {

copySheets(newSheet, sheet, true);

}

public static void copySheets(HSSFSheet newSheet, HSSFSheet sheet,

boolean copyStyle) {

int maxColumnNum = 0;

Map<Integer, HSSFCellStyle> styleMap = (copyStyle) ? new HashMap<Integer, HSSFCellStyle>()

: null;

for (int i = sheet.getFirstRowNum(); i <= sheet.getLastRowNum(); i++) {

HSSFRow srcRow = sheet.getRow(i);

HSSFRow destRow = newSheet.createRow(i);

if (srcRow != null) {

ExcelCopySheetUtil.copyRow(sheet, newSheet, srcRow, destRow,

styleMap);

if (srcRow.getLastCellNum() > maxColumnNum) {

maxColumnNum = srcRow.getLastCellNum();

}

}

}

for (int i = 0; i <= maxColumnNum; i++) {    //设置列宽

newSheet.setColumnWidth(i, sheet.getColumnWidth(i));

}

}

/**

* 复制并合并单元格

* @param  newSheet

* @param  sheet

* @param  copyStyle

*/

public static void copyRow(HSSFSheet srcSheet, HSSFSheet destSheet,

HSSFRow srcRow, HSSFRow destRow,

Map<Integer, HSSFCellStyle> styleMap) {

Set<CellRangeAddressWrapper> mergedRegions = new TreeSet<CellRangeAddressWrapper>();

destRow.setHeight(srcRow.getHeight());

int deltaRows = destRow.getRowNum() - srcRow.getRowNum(); //如果copy到另一个sheet的起始行数不同

for (int j = srcRow.getFirstCellNum(); j <= srcRow.getLastCellNum(); j++) {

HSSFCell oldCell = srcRow.getCell(j); // old cell

HSSFCell newCell = destRow.getCell(j); // new cell

if (oldCell != null) {

if (newCell == null) {

newCell = destRow.createCell(j);

}

copyCell(oldCell, newCell, styleMap);

CellRangeAddress mergedRegion = getMergedRegion(srcSheet,

srcRow.getRowNum(), (short) oldCell.getColumnIndex());

if (mergedRegion != null) {

CellRangeAddress newMergedRegion = new CellRangeAddress(

mergedRegion.getFirstRow() + deltaRows,

mergedRegion.getLastRow() + deltaRows, mergedRegion

.getFirstColumn(), mergedRegion

.getLastColumn());

CellRangeAddressWrapper wrapper = new CellRangeAddressWrapper(

newMergedRegion);

if (isNewMergedRegion(wrapper, mergedRegions)) {

mergedRegions.add(wrapper);

destSheet.addMergedRegion(wrapper.range);

}

}

}

}

}

/**

* 把原来的Sheet中cell(列)的样式和数据类型复制到新的sheet的cell(列)中      *

* @param  oldCell

* @param  newCell

* @param styleMap

*/

public static void copyCell(HSSFCell oldCell, HSSFCell newCell,

Map<Integer, HSSFCellStyle> styleMap) {

if (styleMap != null) {

if (oldCell.getSheet().getWorkbook() == newCell.getSheet()

.getWorkbook()) {

newCell.setCellStyle(oldCell.getCellStyle());

} else {

int stHashCode = oldCell.getCellStyle().hashCode();

HSSFCellStyle newCellStyle = styleMap.get(stHashCode);

if (newCellStyle == null) {

newCellStyle = newCell.getSheet().getWorkbook()

.createCellStyle();

newCellStyle.cloneStyleFrom(oldCell.getCellStyle());

styleMap.put(stHashCode, newCellStyle);

}

newCellStyle.setLocked(false);

newCell.setCellStyle(newCellStyle);

}

}

switch (oldCell.getCellType()) {

case HSSFCell.CELL_TYPE_STRING:

newCell.setCellValue(oldCell.getStringCellValue());

break;

case HSSFCell.CELL_TYPE_NUMERIC:

newCell.setCellValue(oldCell.getNumericCellValue());

break;

case HSSFCell.CELL_TYPE_BLANK:

newCell.setCellType(HSSFCell.CELL_TYPE_BLANK);

break;

case HSSFCell.CELL_TYPE_BOOLEAN:

newCell.setCellValue(oldCell.getBooleanCellValue());

break;

case HSSFCell.CELL_TYPE_ERROR:

newCell.setCellErrorValue(oldCell.getErrorCellValue());

break;

case HSSFCell.CELL_TYPE_FORMULA:

newCell.setCellFormula(oldCell.getCellFormula());

break;

default:

break;

}

}

// 获取merge对象

public static CellRangeAddress getMergedRegion(HSSFSheet sheet, int rowNum,

short cellNum) {

for (int i = 0; i < sheet.getNumMergedRegions(); i++) {

CellRangeAddress merged = sheet.getMergedRegion(i);

if (merged.isInRange(rowNum, cellNum)) {

return merged;

}

}

return null;

}

private static boolean isNewMergedRegion(

CellRangeAddressWrapper newMergedRegion,

Set<CellRangeAddressWrapper> mergedRegions) {

boolean bool = mergedRegions.contains(newMergedRegion);

return !bool;

}

}

转载于:https://my.oschina.net/zhangdayue/blog/419354

Java 操作POI 之复制sheet页相关推荐

  1. Java Excel 复制单元格 poi Excel 复制单元格 Java Excel 复制行 Java Excel 复制 sheet 页 poi excel copy

    Java Excel 复制单元格 poi Excel 复制单元格 Java Excel 复制行 Java Excel 复制 sheet 页 一.前言 1.本文记录 poi excel 实现 单元格ce ...

  2. Java操作poi导出Excel自定义字体颜色

    Java操作poi导出Excel自定义字体颜色 功能介绍 POI操作Excel 第一步创建一个导出的工具类 整体定义表格字体样式 自定义表格字体样式 总结 功能介绍 Apache POI 是用Java ...

  3. java excel 晒新年操作_java操作Excel的poi 创建一个sheet页

    package com.java.poi; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.us ...

  4. poi操作excel,复制sheet,复制行,复制单元格 .

    http://blog.csdn.net/wutbiao/article/details/8696446 项目中,我们经常使用Poi来操作excel,但是经常碰到一个不方便的地方,不如最简单常用的,在 ...

  5. poi操作excel,复制sheet,复制行,复制单元格

    项目中,我们经常使用Poi来操作excel,但是经常碰到一个不方便的地方,不如最简单常用的,在两个excel之间复制sheet,复制行,复制单元格等. 我这里是最近刚做的一个简单封装.不是很好,必须始 ...

  6. 使用poi复制sheet页,拷贝sheet,sheet插入行,复制行

    复制sheet //读取excel模板XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream(filePath + "赎回明 ...

  7. POI删除所有sheet页

      使用POI删除Sheet页时,不能使用下面的代码循环删除.因为执行一遍后第二个sheet页的下标变成了0,但是i变成了1,所以循环里面应该放workbook.removeSheetAt(0); f ...

  8. Java 使用 POI 为 word 添加页眉 获取页眉

    在百度上和goole都没找到我想要的东西,看了他的接口注释他的官方文档之后才得到了这个解决方案 // POI方案为word添加页眉public static void main(String[] ar ...

  9. Java操作poi添加页眉页脚:字体_颜色_大小

    Excel中的页眉或页脚仅在页面布局模式和打印预览模式才可见.我们可以在页眉页脚位置添加页码.工作表名.日期.文字.图片等信息.本文将通过Java代码示例来介绍页眉页脚的添加方法. 使用工具: Fre ...

最新文章

  1. mysql dump 查看器_mysql备份之mysqldump工具
  2. 树莓派4视频输出接口_树莓派第四代来啦!4G内存、支持双屏4K输出和H265硬解
  3. 01. elasticsearch certification 练习题
  4. 哈弗f5i潮配置参数_10万元起售的潮人新玩法,哈弗F5国潮版购车手册
  5. java 迷你桌面地图_求教贴,Java桌面小游戏的地图怎么做
  6. git使用过程及常用命令
  7. GCC编译的几个步骤
  8. mybatis进阶(动态sql、关系映射、延迟加载、缓存)
  9. 高等数学 - 两平面的夹角
  10. web端前端自定义提示语信息
  11. 这篇文章能让你吃透SVG
  12. IDEA的Translation翻译插件失效
  13. 蚂蚁算法python_Python编程实现蚁群算法详解
  14. CSS段落间距调整 P标签段落上下距离如何设置
  15. 聚焦手机操作系统 运营商的“门户”之战
  16. 黑客又没有工资,那他们靠什么来维持生活?答案说出让人意外!
  17. 傻白探索Chiplet,国内外研究现状(六)
  18. PostgreSQL学习篇9.5 货币类型
  19. PX4固定翼调试校准流程及实验相关问题记录分析
  20. 网络协议与服务的区别/关系

热门文章

  1. 科技前沿智能创新 2019北京智能家居 全屋智能博览会
  2. ubuntu7.10安装到3D开启
  3. bupt summer training for 16 #8 ——字符串处理
  4. PHP:6种GET和POST请求发送方法
  5. 《NoSQL权威指南》导读
  6. Elasticsearch学习笔记-04.3批处理
  7. Java 之 JavaScript (一)
  8. Android在第三方应用程序系统应用尽早开始,杀死自己主动的第三方应用程序,以重新启动...
  9. python中loop函数_python + Django 的forloop功能试验讲解
  10. zabbix4.2 系列(二):agent配置