原理:复制Sheet页的数据,其实是读取Excel,写入Excel,写入时候复制下样式,设置下行高和列宽,然后合并单元格就可以了。
下面的代码也是这样写的,下面的代码是用来复制不同Excel 2007的sheet页数据的,没有判断2个Excel是否相同。
注意,(1)判断行的最大数量建议使用srcSheet.getLastRowNum();判断每行最大列数建议使用srcRow.getLastCellNum();
在使用中发现 在Excel中手动添加行和列之后,使用srcSheet.getPhysicalNumberOfRows()和srcRow.getPhysicalNumberOfCells()得到的数量不准确。
(2)注意单元格如果是数字格式的可能是日期,优先判断是否是日期
(3)Cell具体有那些类型可以看代码,如下所示
代码缺点在文章最后。
代码如下,我就不解释了。
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; 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 复制Sheet { public static void main(String[] args) throws Exception { 复制Sheet t = new 复制Sheet(); t.copyWbSheet("f:/saveFile/temp/copysheet_123.xlsx", "f:/saveFile/temp/result_" + System.currentTimeMillis() + ".xlsx", "1. 测试概况", null); } // destSheetName为null时候使用sheetName的值为destFileName的sheet名 public void copyWbSheet(String srcfileName, String destFileName, String sheetName, String destSheetName) throws Exception { File srcFile = new File(srcfileName); if (!srcFile.exists()) { return; } XSSFWorkbook srcwb = new XSSFWorkbook(new FileInputStream(srcfileName)); XSSFSheet srcSheet = null; if (sheetName == null) { srcSheet = srcwb.getSheetAt(0); sheetName = srcwb.getSheetName(0); } else { srcSheet = srcwb.getSheet(sheetName); } if (srcSheet == null) { return; } if (destSheetName == null) { destSheetName = sheetName; } XSSFWorkbook destwb = new XSSFWorkbook(); XSSFSheet destSheet = null; File destFile = new File(destFileName); // 不存在则新建 if (!destFile.exists()) { destFile.createNewFile(); } else { destwb = new XSSFWorkbook(new FileInputStream(destFile)); } destSheet = destwb.getSheet(destSheetName); if (destSheet == null) { destSheet = destwb.createSheet(destSheetName); } // 最大列数 int maxCellNum = copySheet(srcSheet, destSheet, srcwb, destwb); // 设置列宽 setSheetWidth(srcSheet, destSheet, maxCellNum); // 合并单元格 mergeSheetAllRegion(srcSheet, destSheet); // 保存 saveFile(destwb, destFileName); } public void saveFile(XSSFWorkbook destwb, String destFileName) { try { FileOutputStream fileOutStream = new FileOutputStream(destFileName); destwb.write(fileOutStream); if (fileOutStream != null) { fileOutStream.close(); } } catch (Exception e) { e.printStackTrace(); } } public int copySheet(XSSFSheet srcSheet, XSSFSheet destSheet, XSSFWorkbook srcwb, XSSFWorkbook destwb) throws Exception { int rowCount = srcSheet.getLastRowNum();// 总行数 int maxCellNum = 0; // System.out.println("------total row=------" + rowCount + "---="+ // srcSheet.getPhysicalNumberOfRows()); XSSFRow srcRow = null, destRow = null; //注意这里 for (int i = 0; i <=rowCount; i++) { srcRow = srcSheet.getRow(i); destRow = destSheet.getRow(i); if (srcRow == null) { continue; } // 最大列数 maxCellNum = maxCellNum < srcRow.getLastCellNum() ? srcRow .getLastCellNum() : maxCellNum; if (destRow == null) { destRow = destSheet.createRow(i); } // 设置行高 destRow.setHeight(srcRow.getHeight()); // System.out.println("---------row=" + i + "---="+ // srcRow.getPhysicalNumberOfCells() + // "----="+srcRow.getLastCellNum()); copySheetRow(srcRow, destRow, srcwb, destwb); srcRow = null; destRow = null; } srcRow = null; destRow = null; return maxCellNum; } private void copySheetRow(XSSFRow srcRow, XSSFRow destRow, XSSFWorkbook srcwb, XSSFWorkbook destwb) { int cellCount = srcRow.getLastCellNum();// 每行的总列数 XSSFCell srcCell = null, destCell = null; XSSFCellStyle srcCellStyle = null, destCellStyle = null; for (int j = 0; j < cellCount; j++) {// 遍历行单元格 srcCell = srcRow.getCell(j); destCell = destRow.getCell(j); if (destCell == null) { destCell = destRow.createCell(j); } if (srcCell != null) { srcCellStyle = srcCell.getCellStyle();// 原sheet页样式 destCellStyle = null; destCellStyle = destCell.getCellStyle(); // 复制样式 destCellStyle.cloneStyleFrom(srcCellStyle); // 处理单元格内容 switch (srcCell.getCellType()) { case XSSFCell.CELL_TYPE_STRING: destCell.setCellValue(srcCell.getRichStringCellValue()); break; // 这里判断是否是日期 case XSSFCell.CELL_TYPE_NUMERIC: // 判断是否是日期格式 // 测试发现如果这里不新建样式,日期显示的是数字 if (DateUtil.isCellDateFormatted(srcCell)) { // 新建样式 destCellStyle = destwb.createCellStyle(); // 复制样式 destCellStyle.cloneStyleFrom(srcCellStyle); destCell.setCellStyle(destCellStyle); destCell.setCellValue(srcCell.getDateCellValue()); } else { destCell.setCellValue(srcCell.getNumericCellValue()); } break; case XSSFCell.CELL_TYPE_FORMULA: destCell.setCellFormula(srcCell.getCellFormula()); break; case XSSFCell.CELL_TYPE_BOOLEAN: destCell.setCellValue(srcCell.getBooleanCellValue()); break; case XSSFCell.CELL_TYPE_BLANK: destCell.setCellType(XSSFCell.CELL_TYPE_BLANK); break; case XSSFCell.CELL_TYPE_ERROR: break; default: break; } } } srcCellStyle = null; destCellStyle = null; srcCell = null; destCell = null; } public void mergeSheetAllRegion(XSSFSheet srcSheet, XSSFSheet destSheet) { int num = srcSheet.getNumMergedRegions(); CellRangeAddress cellR = null; for (int i = 0; i < num; i++) { cellR = srcSheet.getMergedRegion(i); destSheet.addMergedRegion(cellR); } } public void setSheetWidth(XSSFSheet srcSheet, XSSFSheet destSheet, int maxCellNum) { for (int i = 0; i <= maxCellNum; i++) { destSheet.setColumnWidth(i, srcSheet.getColumnWidth(i)); } } }
结果为:
复制后:
代码缺点:
1)只复制了数据,对于什么标签,批注之类的没有复制过去,
2)单元格颜色,边框样式全部丢失。
3)原sheet页的超链接复制后丢失。
4)虽然判断了数字是否是日期,不新建样式日期还是显示为数字。代码140行左右。
5)很容易OOM,测试发现,写10行1437列数据很快,复制sheet数据时候马上OOM。
public class Excel实际列数 { public static void main(String[] args) { Excel实际列数 t = new Excel实际列数(); System.out.println(t.getTrueColumnNum("bcg")); } public int getTrueColumnNum(String address) { address = address.replaceAll("[^a-zA-Z]", "").toLowerCase(); char[] adds = address.toCharArray(); int base = 1; int total = 0; for (int i = adds.length - 1; i >= 0; i--) { total += (adds[i] - 'a' + 1) * base; base = 26 * base; } return total; } }
例子如下:
全文完。
相关推荐
以下是一个简化的代码示例,演示了如何使用POI进行Sheet复制和拆分: ```java import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.*; import java.io.FileOutputStream; import java.io...
本篇将详细讲解如何使用POI库进行Excel的Sheet页复制,包括数据和样式的跨文件操作。 首先,我们需要在项目中引入Apache POI的依赖。对于Maven项目,可以在pom.xml文件中添加以下依赖: ```xml <groupId>org....
在IT行业中,尤其是在数据分析、报表处理等领域,经常需要对Excel文件进行操作,比如合并多个Excel文件或多个Sheet。Apache POI是一个流行的Java库,它允许开发者读取、创建和修改Microsoft Office格式的文件,包括...
这指的是使用Apache POI库来复制Excel文件中特定行的数据,并保留原有的格式和样式。在实际应用中,这可能是因为你需要创建报告的副本,或者需要对原始数据进行部分备份。 要实现这个功能,我们需要以下步骤: 1. ...
本篇将详细介绍如何使用Apache POI来读取Excel模板,复制工作表(Sheet)以及复制行,并特别关注如何处理合并单元格的情况。 首先,我们需要引入Apache POI的相关依赖库到我们的项目中。在Maven项目中,可以在pom....
在IT行业中,处理数据时Excel是一种非常常用的工具。在企业级应用中,有时我们需要通过编程方式来读取、写入或合并Excel数据。Apache POI是一个强大的Java库,专门用于处理Microsoft Office格式的文件,包括Excel。...
在这个特定的例子中,我们将讨论如何使用POI库基于一个Excel模板文件循环输出数据行,并将结果导出为新的Excel文件。 首先,我们需要理解POI库的基本概念。POI提供了HSSF(Horizontally SpreadSheet Format)和XSSF...
本教程将深入探讨如何利用Apache POI库来合并多个Excel工作表,这对于处理大量数据或者整合来自不同来源的数据时非常有用。 首先,我们需要了解Apache POI的基本概念。POI提供了HSSF(Horrible Spreadsheet Format...
在本项目中,“使用poi根据导入模板生成excel”是核心任务,这意味着我们需要利用POI库处理已有的Excel模板,生成新的Excel表格,并填充数据。 首先,我们需要了解Apache POI的基本结构和使用方法。POI提供了HSSF...
在IT行业中,Apache POI是一个广泛使用的开源库,专门用于处理Microsoft Office格式的文件,如Excel、Word和PowerPoint。本篇文章将详细讲解如何利用Apache POI库来读取Excel数据并将其写入到Word文档中。 首先,...
本工具类使用的场景为根据提供的模板来导出Excel报表并且可根据提供的模板Sheet页进行复制,从而实现多个Sheet页的需求。 知识点一:POI技术 POI(Poor Obfuscation Implementation)是一款Java API,用于读写...
4. 复制数据:将源文件的数据复制到目标文件的工作表中,可以使用`Sheet.createRow()`创建新的行,并通过`Row.createCell()`创建单元格,然后设置单元格的值。 5. 保存结果:最后,使用`Workbook.write()`方法将结果...
在Java编程领域,Apache POI库是一个非常流行的API,它允许开发者读取、写入以及修改Microsoft Office格式的文件,包括Excel。本篇文章将详细探讨如何利用POI库基于模板来导出Excel文档。 首先,我们需要理解Apache...
要使用POI读取Excel文件,首先需要创建对应的Workbook对象,然后通过工作表索引获取Sheet对象,再通过行号和列号访问Row和Cell。例如: ```java FileInputStream fis = new FileInputStream("file.xls"); ...
在Java编程环境中,我们经常需要处理数据的导入和导出,其中Excel文件是最常见的格式之一。本示例将介绍如何使用Java创建Excel文件并写入数据,主要涉及的库是`jxl`,这是一个用于读写Excel文件的开源Java库。 首先...
在"Java操作Excel之Poi模板导入导出"这个主题中,我们将深入探讨如何使用POI库来处理Excel模板,并进行数据的导入和导出。 首先,了解Excel模板的基本概念。模板通常包含预定义的样式、格式和计算,开发人员可以...
Apache POI是一个流行的Java...兼容xls,xlsx"这个工具实现了利用Apache POI库处理Excel文件的功能,涵盖了从旧版的.xls到新版的.xlsx格式,提供了方便的导入和导出接口,使得在Java开发中处理Excel数据变得更加简单。
以下是一个简单的示例代码片段,展示了如何使用Apache POI读取Excel文件中的数据并保留格式: ```java import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java....
Java POI库是一个广泛使用的开源项目,专门用于处理Microsoft Office格式的文件,包括Excel的.xls和.xlsx文件。在本示例中,我们关注的是如何利用Java POI来根据模板生成.xlsx格式的Excel文件。这个过程涉及到对...
本教程将详细介绍如何使用JAVA POI库来创建一个包含图片的完整Excel导出功能。 首先,你需要在项目中引入Apache POI依赖。如果你使用的是Maven,可以在pom.xml文件中添加以下依赖: ```xml <groupId>org.apache....