POI 复制不同Sheet合成Excel文件,完美解决单元格样式和角标问题
项目背景:
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文件,完美解决单元格样式和角标问题相关推荐
- ExcelJs导出Excel文件并设置单元格样式
下载exceljs并引入 数据源格式:二维数组,null值是后面要合并单元格的,占个位置. //创建对象 var wb = new ExcelJS.Workbook(); //创建一个名称为Sheet ...
- java使用poi生成Excel文件并合并单元格
java使用poi生成Excel文件并合并单元格 业务需要根据 分管部门 字段进行合并,现在提供一种思路. controller层 @Inject(target = "/inf ...
- 批量提取多个Excel文件内指定单元格的数据(文件名和数据)
批量提取多个Excel文件内指定单元格的数据(文件名和数据) 例如收集了excel表格统一格式的个人简历,从中抽取个人基本信息,生成数据表. 将源数据excel文件放在同一个文件夹下. 新建一个sho ...
- POI导出Excel文件时,单元格内文字竖排、横排默认不展示,必须点击一下问题解决
//创建单元格样式设置CellStyle cs_vertical = wb.createCellStyle();//设置字体Font textFont = wb.createFont();textFo ...
- Java Excel导出动态自定义单元格样式
根据表格内容定义单元格样式 效果图: 文章描述两种,一种创建生成时定义样式,另一种在excel在写入文件前修改样式 关键代码一 /*** 数据动态设置样式** @param cell 单元格* @pa ...
- easyexcel导出excel文件合并相同单元格数据
1.引入easyexcel依赖 !-- 阿里开源easyexcel--><dependency><groupId>com.alibaba</groupId>& ...
- java读写Excel文件、合并单元格
[转载]http://blog.sina.com.cn/s/blog_694448320100lxbe.html 利用java操作Excel,有个开源的东东-jxl.jar,可以到http://sou ...
- java 读取excel 合并单元格_利用java读写Excel文件、合并单元格
一般的页眉页脚都分为三个部分,左,中,右三部分,利用如下代码可实现插入页眉页脚 java 代码publicstaticvoidsetHeader(WritableSheet dataSheet,Str ...
- js解析excel文件,读取单元格中的值
首先需要引入js包,https://github.com/SheetJS/sheetjs这个是地址 我这里就具体说一下读取单元格值的方法. 方法参考js读取本地Excel内容 这个博主的,但是想要获取 ...
最新文章
- android某个活动全屏,android – 重新组合活动布局,以便在旋转屏幕时全屏播放视频...
- linux启动自动挂载共享文件,linux中自动挂载windows 共享目录
- com.alibaba.fastjson.JSONObject循环给同一对象赋值会出现$ref:$[0]现象问题
- ROC曲线 vs Precision-Recall曲线
- cad转shp 奥维_CAD转换工具程序包(附下载)
- 阿里笔试-二叉树由前序遍历和中序遍历推导后序遍历
- 实践练习四:迁移 MySQL 数据到 OceanBase 集群
- 完全自定义TabBar(八)
- 【预训练模型】预训练语言模型的前世今生之风起云涌
- 惠普i5000微型计算机,求HP 5000面板的中文解释。
- leaflet 常用方法总结
- 每天一个命令:ps命令
- win10如何使用WinSAT测试体验指数
- kodi mysql_Kodi
- 部分适配尼康Z卡口 三阳推出五款大光圈镜头
- 兼莱宝分享:表情包项目的玩法思路,轻松在家制作表情包赚钱
- linux 汇编 读取软盘,学习x86汇编语言7 使用INT13读取软盘数据
- P7826 「RdOI R3」RBT
- 青岛科技大学计算机田玉平,控制理论与控制工程;就业怎么样/?博士.
- 游戏感:虚拟感觉的游戏设计师指南——第十五章 超级马里奥64