项目背景:

1、需要从不同的Excel模板中读取Sheet,生成到汇总的Excel文件中

2、Excel格式是 Office2007版本,xlsx格式

3、需要将模板文件的内容和格式,拷贝到新的文件

4、解决POI 复制格式异常问题

工具代码:

package com.swing.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;public class PoiUtil2 {public class XSSFDateUtil extends DateUtil {  }  public static void copyCellStyle(XSSFCellStyle fromStyle, XSSFCellStyle toStyle) {toStyle.cloneStyleFrom(fromStyle);//此一行代码搞定}  public static void mergeSheetAllRegion(XSSFSheet fromSheet, XSSFSheet toSheet) {//合并单元格int num = fromSheet.getNumMergedRegions();CellRangeAddress cellR = null;for (int i = 0; i < num; i++) {cellR = fromSheet.getMergedRegion(i);toSheet.addMergedRegion(cellR);}} public static void copyCell(XSSFWorkbook wb,XSSFCell fromCell, XSSFCell toCell) {  XSSFCellStyle newstyle=wb.createCellStyle();  copyCellStyle(fromCell.getCellStyle(), newstyle);  //toCell.setEncoding(fromCell.getEncoding());  //样式  toCell.setCellStyle(newstyle);   if (fromCell.getCellComment() != null) {  toCell.setCellComment(fromCell.getCellComment());  }  // 不同数据类型处理  int fromCellType = fromCell.getCellType();  toCell.setCellType(fromCellType);  if (fromCellType == XSSFCell.CELL_TYPE_NUMERIC) {  if (XSSFDateUtil.isCellDateFormatted(fromCell)) {  toCell.setCellValue(fromCell.getDateCellValue());  } else {  toCell.setCellValue(fromCell.getNumericCellValue());  }  } else if (fromCellType == XSSFCell.CELL_TYPE_STRING) {  toCell.setCellValue(fromCell.getRichStringCellValue());  } else if (fromCellType == XSSFCell.CELL_TYPE_BLANK) {  // nothing21  } else if (fromCellType == XSSFCell.CELL_TYPE_BOOLEAN) {  toCell.setCellValue(fromCell.getBooleanCellValue());  } else if (fromCellType == XSSFCell.CELL_TYPE_ERROR) {  toCell.setCellErrorValue(fromCell.getErrorCellValue());  } else if (fromCellType == XSSFCell.CELL_TYPE_FORMULA) {  toCell.setCellFormula(fromCell.getCellFormula());  } else { // nothing29  }  }  public static void copyRow(XSSFWorkbook wb,XSSFRow oldRow,XSSFRow toRow){toRow.setHeight(oldRow.getHeight());for (Iterator cellIt = oldRow.cellIterator(); cellIt.hasNext();) {  XSSFCell tmpCell = (XSSFCell) cellIt.next();  XSSFCell newCell = toRow.createCell(tmpCell.getColumnIndex());  copyCell(wb,tmpCell, newCell);  }  }  public static void copySheet(XSSFWorkbook wb,XSSFSheet fromSheet, XSSFSheet toSheet) {   mergeSheetAllRegion(fromSheet, toSheet);     //设置列宽for(int i=0;i<=fromSheet.getRow(fromSheet.getFirstRowNum()).getLastCellNum();i++){ toSheet.setColumnWidth(i,fromSheet.getColumnWidth(i)); } for (Iterator rowIt = fromSheet.rowIterator(); rowIt.hasNext();) {  XSSFRow oldRow = (XSSFRow) rowIt.next(); XSSFRow newRow = toSheet.createRow(oldRow.getRowNum()); copyRow(wb,oldRow,newRow);  }  }  public static void main(String[] args) {List<String> pathList = new ArrayList<String>();pathList.add("d:/swingPrint/printTemplate/" + "3容量法100_4" + ".xlsx");
//          pathList.add("d:/swingPrint/printTemplate/" + "48藻类计数检测原始记录_1" + ".xlsx");//将所有类型的尽调excel文件合并成一个excel文件XSSFWorkbook newExcelCreat = new XSSFWorkbook(); try {for(int i = 0;i<pathList.size();i++) {//遍历每个源excel文件,fileNameList为源文件的名称集合InputStream in = new FileInputStream(pathList.get(i));ZipSecureFile.setMinInflateRatio(-1.0d);XSSFWorkbook fromExcel = new XSSFWorkbook(in);XSSFSheet oldSheet = fromExcel.getSheetAt(0);//模板文件Sheet1XSSFSheet newSheet = newExcelCreat.createSheet("Sheet"+(i+1)+""); copySheet(newExcelCreat, oldSheet, newSheet);}} catch (FileNotFoundException e1) {// TODO Auto-generated catch blocke1.printStackTrace();} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}String allFileName="d:/swingPrint/tempFile/fgModelPrint.xlsx";try {FileOutputStream fileOut = new FileOutputStream(allFileName);newExcelCreat.write(fileOut); fileOut.flush(); fileOut.close();System.out.println("复制成功");} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}

效果:

多张Sheet页复制没问题

Sheet 页的上角标,下角标正常

如果文章对你有用,可以请我一罐八宝粥,^_^

POI 复制不同Sheet合成Excel文件,完美解决单元格样式和角标问题相关推荐

  1. ExcelJs导出Excel文件并设置单元格样式

    下载exceljs并引入 数据源格式:二维数组,null值是后面要合并单元格的,占个位置. //创建对象 var wb = new ExcelJS.Workbook(); //创建一个名称为Sheet ...

  2. java使用poi生成Excel文件并合并单元格

    java使用poi生成Excel文件并合并单元格        业务需要根据 分管部门 字段进行合并,现在提供一种思路. controller层 @Inject(target = "/inf ...

  3. 批量提取多个Excel文件内指定单元格的数据(文件名和数据)

    批量提取多个Excel文件内指定单元格的数据(文件名和数据) 例如收集了excel表格统一格式的个人简历,从中抽取个人基本信息,生成数据表. 将源数据excel文件放在同一个文件夹下. 新建一个sho ...

  4. POI导出Excel文件时,单元格内文字竖排、横排默认不展示,必须点击一下问题解决

    //创建单元格样式设置CellStyle cs_vertical = wb.createCellStyle();//设置字体Font textFont = wb.createFont();textFo ...

  5. Java Excel导出动态自定义单元格样式

    根据表格内容定义单元格样式 效果图: 文章描述两种,一种创建生成时定义样式,另一种在excel在写入文件前修改样式 关键代码一 /*** 数据动态设置样式** @param cell 单元格* @pa ...

  6. easyexcel导出excel文件合并相同单元格数据

    1.引入easyexcel依赖 !-- 阿里开源easyexcel--><dependency><groupId>com.alibaba</groupId>& ...

  7. java读写Excel文件、合并单元格

    [转载]http://blog.sina.com.cn/s/blog_694448320100lxbe.html 利用java操作Excel,有个开源的东东-jxl.jar,可以到http://sou ...

  8. java 读取excel 合并单元格_利用java读写Excel文件、合并单元格

    一般的页眉页脚都分为三个部分,左,中,右三部分,利用如下代码可实现插入页眉页脚 java 代码publicstaticvoidsetHeader(WritableSheet dataSheet,Str ...

  9. js解析excel文件,读取单元格中的值

    首先需要引入js包,https://github.com/SheetJS/sheetjs这个是地址 我这里就具体说一下读取单元格值的方法. 方法参考js读取本地Excel内容 这个博主的,但是想要获取 ...

最新文章

  1. android某个活动全屏,android – 重新组合活动布局,以便在旋转屏幕时全屏播放视频...
  2. linux启动自动挂载共享文件,linux中自动挂载windows 共享目录
  3. com.alibaba.fastjson.JSONObject循环给同一对象赋值会出现$ref:$[0]现象问题
  4. ROC曲线 vs Precision-Recall曲线
  5. cad转shp 奥维_CAD转换工具程序包(附下载)
  6. 阿里笔试-二叉树由前序遍历和中序遍历推导后序遍历
  7. 实践练习四:迁移 MySQL 数据到 OceanBase 集群
  8. 完全自定义TabBar(八)
  9. 【预训练模型】预训练语言模型的前世今生之风起云涌
  10. 惠普i5000微型计算机,求HP 5000面板的中文解释。
  11. leaflet 常用方法总结
  12. 每天一个命令:ps命令
  13. win10如何使用WinSAT测试体验指数
  14. kodi mysql_Kodi
  15. 部分适配尼康Z卡口 三阳推出五款大光圈镜头
  16. 兼莱宝分享:表情包项目的玩法思路,轻松在家制作表情包赚钱
  17. linux 汇编 读取软盘,学习x86汇编语言7 使用INT13读取软盘数据
  18. P7826 「RdOI R3」RBT
  19. 青岛科技大学计算机田玉平,控制理论与控制工程;就业怎么样/?博士.
  20. 游戏感:虚拟感觉的游戏设计师指南——第十五章 超级马里奥64

热门文章

  1. 海天讲座(四)最优传输理论
  2. 「你是砍柴的,人家是放羊的,你们聊一天,人家羊吃饱了,你的柴怎么办?」这段话可以解读成哪些含义?
  3. 今明两天微服务 Apache ServiceComb 北京深圳连续”双开”
  4. 元转分金额字符串转换:单位元转成单分
  5. MinIO下载和MinIO中国镜像地址
  6. 圣斗士星矢游戏抽奖计算机怎么计算,圣斗士星矢手游抽奖技巧解析 教你抽橙卡...
  7. 接口自动化测试之框架模型搭建
  8. Webix JavaScript UI 9.1.6
  9. 绿幕抠图SDK技术对比
  10. YOLOv2论文翻译详解