POI excel 多个excel的多个sheet合并
POI excel 多个excel的多个sheet合并
public class MergeExcelUtils {
static Logger logger = LoggerFactory.getLogger(MergeExcelUtils.class);
public static final String IDCARD_REGEX="/(^\\d{15}$)|(^\\d{17}[\\d|x|X]$)/";
public static Workbook mergerExcels(List<InputStream> inputStreamList) throws IOException {
//新建一个sheet的集合
List<Sheet> sheets = new ArrayList<>();
// 读取所有需要合并的Excel文件中的所有Sheet,放到一个列表中
for (InputStream input : inputStreamList) {
// FileInputStream input = new FileInputStream(file);
Workbook workbook = WorkbookFactory.create(input);
for (int i = 0; i < workbook.getNumberOfSheets(); i++) {
sheets.add(workbook.getSheetAt(i));
}
if(input != null){
input.close();
}
}
//默认使用第一个的excel的格式
// // 新建一个目标工作簿和工作表
// Workbook mergedWorkbook = null;
// //版本控制流
// InputStream versionJudgmentInputStream = null ;
// //确定excel的版本
// if(!CollectionUtils.isEmpty(files)){
// File file = files.get(NumberUtils.INTEGER_ZERO);
// versionJudgmentInputStream = new FileInputStream(file);
// mergedWorkbook = WorkbookFactory.create(versionJudgmentInputStream);
// }else{
// //默认excel的后缀是xlsx 使用xssf
// mergedWorkbook = WorkbookFactory.create(true);
// }
//指定excel的格式
// 新建一个目标工作簿和工作表
Workbook mergedWorkbook = WorkbookFactory.create(true);
// mergedWorkbook.setH
Sheet mergedSheet = mergedWorkbook.createSheet("Merged Sheet");
//2 设置标题样式
// CellStyle titleStyle = mergedWorkbook.createCellStyle();
// titleStyle.setAlignment(HorizontalAlignment.CENTER);//左右居中
// titleStyle.setVerticalAlignment(VerticalAlignment.CENTER);//上下居中
//// titleStyle.setFillForegroundColor(IndexedColors.AQUA.getIndex());//设置背景色
//// titleStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);//必须设置 否则无效
// Font titleFont = mergedWorkbook.createFont();
// titleFont.setFontHeightInPoints((short) 15);//字体大小
// titleFont.setFontName("黑体");//字体样式
// titleStyle.setFont(titleFont);
//
// //设置标题
// Row row0 = mergedSheet.createRow((int) 0);
// row0.setHeightInPoints(40);
// Cell cell0 = row0.createCell(0);
// cell0.setCellValue("各个学校考试学生信息汇总");
// cell0.setCellStyle(titleStyle);
// 3. 设置内容样式
//设置字体
Font font = mergedWorkbook.createFont();
font.setFontHeightInPoints((short)10);
font.setFontName("宋体");
/**
*正确模版
*/
CellStyle successStyle = mergedWorkbook.createCellStyle();
//水平居中
successStyle.setAlignment(HorizontalAlignment.CENTER);
//垂直居中
successStyle.setVerticalAlignment(VerticalAlignment.CENTER);
//设置字体
successStyle.setFont(font);
/**
* 错误的模版
*/
//错误模版
CellStyle errorStyle = mergedWorkbook.createCellStyle();
//水平居中
errorStyle.setAlignment(HorizontalAlignment.CENTER);
//垂直居中
errorStyle.setVerticalAlignment(VerticalAlignment.CENTER);
//设置字体
errorStyle.setFont(font);
//设置前景颜色
errorStyle.setFillForegroundColor(IndexedColors.RED.getIndex()); // 是设置前景色不是背景色
errorStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
//最大的列数
int maxCell = -1;
//目标excel的行起始位置,有标题行
int currentRowNum = 1;
// mergedSheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 5));
//判断标头列
Row headerRow = null;
// 在目标工作表中逐行逐列地复制所有源工作表中的内容
for (Sheet sheet : sheets) {
for (int i = 0; i <= sheet.getLastRowNum(); i++) {
Row row = sheet.getRow(i);
//判断行是否为空
if(row == null){
continue;
}
//判断这一行的第一个列是否为空
if (row.getCell(0).getStringCellValue()==null|| row.getCell(0).getStringCellValue().equals("")) {
logger.info("continue");
continue;
}
if(i == 0){
// 在去判断每一个sheet的第一行row 标题行
if(headerRow == null || Short.compare(headerRow.getLastCellNum(),row.getLastCellNum()) < 0 ){
headerRow = row;
}
continue;
}
System.out.println(currentRowNum);
Row mergedRow = mergedSheet.createRow(currentRowNum++);
for (int j = 0; j < row.getLastCellNum(); j++) {
Cell cell = row.getCell(j);
if (cell == null) {
continue;
}
Cell mergedCell = mergedRow.createCell(j);
boolean styleFlag = true;
// i == 1 的时候去判断身份证 i== 2 的时候去判断手机号
if(currentRowNum > 2){
if(j == 1){
//^[1-9]\d{5}(19|20)\d{2}([1-9]|1[-2])([1-9]|[1-2][-9]|3[-1])\d{3}[-9Xx]$
Matcher matcher = Pattern.compile(RegexUtils.ID_CARD_NUMBER).matcher(cell.getStringCellValue());
boolean b = matcher.find();
if(!b){
styleFlag = false;
}
}
if(j == 2){
Matcher matcher = Pattern.compile(RegexUtils.PHONE_NUMBER).matcher(cell.getStringCellValue());
boolean b = matcher.find();
if(!b){
styleFlag = false;
}
}
}
if(styleFlag){
mergedCell.setCellStyle(successStyle);
}else{
mergedCell.setCellStyle(errorStyle);
}
mergedCell.setCellValue(cell.getStringCellValue());
}
// 调整列宽
for (int colNum = 0; colNum < row.getLastCellNum() ; colNum++) {
mergedSheet.autoSizeColumn(colNum);
int width = mergedSheet.getColumnWidth(colNum) + 2048;
// 设置最小列宽
mergedSheet.setColumnWidth(colNum, Math.max(width, 15 * 256));
}
}
// mergedSheet.addMergedRegion(new CellRangeAddress(0, 0, 0, headerRow.getLastCellNum()));
}
//标题行
Row mergedRow = mergedSheet.createRow(0);
for (int j = 0; j < headerRow.getLastCellNum(); j++) {
Cell cell = headerRow.getCell(j);
if (cell == null) {
continue;
}
Cell mergedCell = mergedRow.createCell(j);
mergedCell.setCellStyle(successStyle);
mergedCell.setCellValue(cell.getStringCellValue());
// 调整列宽
for (int colNum = 0; colNum < headerRow.getLastCellNum() ; colNum++) {
mergedSheet.autoSizeColumn(colNum);
int width = mergedSheet.getColumnWidth(colNum) + 2048;
// 设置最小列宽
mergedSheet.setColumnWidth(colNum, Math.max(width, 15 * 256));
}
}
// 将目标工作簿中的内容输出到一个新的Excel文件中
// ByteArrayOutputStream bos = new ByteArrayOutputStream();
// mergedWorkbook.write(bos);
// byte[] barray = bos.toByteArray();
// InputStream is = new ByteArrayInputStream(barray);
logger.info("合并完成");
return mergedWorkbook;
}
}