`
53873039oycg
  • 浏览: 841317 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

POI简单使用之不同Excel Sheet页复制数据

    博客分类:
  • poi
阅读更多

      原理:复制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;
	}
}

    例子如下:

   

 

     全文完

 

  • 大小: 200.6 KB
  • 大小: 130.1 KB
  • 大小: 197 KB
  • 大小: 89.3 KB
  • 大小: 140.2 KB
1
3
分享到:
评论

相关推荐

    poi实现sheet页复制和根据空行拆分

    以下是一个简化的代码示例,演示了如何使用POI进行Sheet复制和拆分: ```java import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.*; import java.io.FileOutputStream; import java.io...

    Java poi复制execl的sheet页,跨文件操作,数据和样式全部复制,工具类

    本篇将详细讲解如何使用POI库进行Excel的Sheet页复制,包括数据和样式的跨文件操作。 首先,我们需要在项目中引入Apache POI的依赖。对于Maven项目,可以在pom.xml文件中添加以下依赖: ```xml &lt;groupId&gt;org....

    poi实现多sheet合并

    在IT行业中,尤其是在数据分析、报表处理等领域,经常需要对Excel文件进行操作,比如合并多个Excel文件或多个Sheet。Apache POI是一个流行的Java库,它允许开发者读取、创建和修改Microsoft Office格式的文件,包括...

    poi复制指定行数的Excel表格内容

    这指的是使用Apache POI库来复制Excel文件中特定行的数据,并保留原有的格式和样式。在实际应用中,这可能是因为你需要创建报告的副本,或者需要对原始数据进行部分备份。 要实现这个功能,我们需要以下步骤: 1. ...

    poi excel 模板读取 复制表 复制行且区分合并行

    本篇将详细介绍如何使用Apache POI来读取Excel模板,复制工作表(Sheet)以及复制行,并特别关注如何处理合并单元格的情况。 首先,我们需要引入Apache POI的相关依赖库到我们的项目中。在Maven项目中,可以在pom....

    Poi 读写Excel 合并ExcelSheet Struts2实现

    在IT行业中,处理数据时Excel是一种非常常用的工具。在企业级应用中,有时我们需要通过编程方式来读取、写入或合并Excel数据。Apache POI是一个强大的Java库,专门用于处理Microsoft Office格式的文件,包括Excel。...

    POI使用Excel模板文件循环输出行并导出Excel

    在这个特定的例子中,我们将讨论如何使用POI库基于一个Excel模板文件循环输出数据行,并将结果导出为新的Excel文件。 首先,我们需要理解POI库的基本概念。POI提供了HSSF(Horizontally SpreadSheet Format)和XSSF...

    利用POI合并多个Excel表

    本教程将深入探讨如何利用Apache POI库来合并多个Excel工作表,这对于处理大量数据或者整合来自不同来源的数据时非常有用。 首先,我们需要了解Apache POI的基本概念。POI提供了HSSF(Horrible Spreadsheet Format...

    使用poi根据导入模板生成excel

    在本项目中,“使用poi根据导入模板生成excel”是核心任务,这意味着我们需要利用POI库处理已有的Excel模板,生成新的Excel表格,并填充数据。 首先,我们需要了解Apache POI的基本结构和使用方法。POI提供了HSSF...

    利用POI读取excel写入到word

    在IT行业中,Apache POI是一个广泛使用的开源库,专门用于处理Microsoft Office格式的文件,如Excel、Word和PowerPoint。本篇文章将详细讲解如何利用Apache POI库来读取Excel数据并将其写入到Word文档中。 首先,...

    Java根据模板导出Excel报表并复制模板生成多个Sheet页

    本工具类使用的场景为根据提供的模板来导出Excel报表并且可根据提供的模板Sheet页进行复制,从而实现多个Sheet页的需求。 知识点一:POI技术 POI(Poor Obfuscation Implementation)是一款Java API,用于读写...

    POI合并多个相同的Excel或者合并Word文件

    4. 复制数据:将源文件的数据复制到目标文件的工作表中,可以使用`Sheet.createRow()`创建新的行,并通过`Row.createCell()`创建单元格,然后设置单元格的值。 5. 保存结果:最后,使用`Workbook.write()`方法将结果...

    java基于poi通过excel模板导出

    在Java编程领域,Apache POI库是一个非常流行的API,它允许开发者读取、写入以及修改Microsoft Office格式的文件,包括Excel。本篇文章将详细探讨如何利用POI库基于模板来导出Excel文档。 首先,我们需要理解Apache...

    POI3.7Excel解析

    要使用POI读取Excel文件,首先需要创建对应的Workbook对象,然后通过工作表索引获取Sheet对象,再通过行号和列号访问Row和Cell。例如: ```java FileInputStream fis = new FileInputStream("file.xls"); ...

    java 创建EXCEL文件,并向EXCEL中写入数据

    在Java编程环境中,我们经常需要处理数据的导入和导出,其中Excel文件是最常见的格式之一。本示例将介绍如何使用Java创建Excel文件并写入数据,主要涉及的库是`jxl`,这是一个用于读写Excel文件的开源Java库。 首先...

    Java操作Excel之Poi模板导入导出

    在"Java操作Excel之Poi模板导入导出"这个主题中,我们将深入探讨如何使用POI库来处理Excel模板,并进行数据的导入和导出。 首先,了解Excel模板的基本概念。模板通常包含预定义的样式、格式和计算,开发人员可以...

    poi导入导出Excel通用工具类 兼容xls,xlsx

    Apache POI是一个流行的Java...兼容xls,xlsx"这个工具实现了利用Apache POI库处理Excel文件的功能,涵盖了从旧版的.xls到新版的.xlsx格式,提供了方便的导入和导出接口,使得在Java开发中处理Excel数据变得更加简单。

    POI读取Excel带格式数据

    以下是一个简单的示例代码片段,展示了如何使用Apache POI读取Excel文件中的数据并保留格式: ```java import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java....

    Java POI根据模板生成Excel(xlsx)文件

    Java POI库是一个广泛使用的开源项目,专门用于处理Microsoft Office格式的文件,包括Excel的.xls和.xlsx文件。在本示例中,我们关注的是如何利用Java POI来根据模板生成.xlsx格式的Excel文件。这个过程涉及到对...

    JAVA poi 做EXCEL导出(包含图片) 完整版

    本教程将详细介绍如何使用JAVA POI库来创建一个包含图片的完整Excel导出功能。 首先,你需要在项目中引入Apache POI依赖。如果你使用的是Maven,可以在pom.xml文件中添加以下依赖: ```xml &lt;groupId&gt;org.apache....

Global site tag (gtag.js) - Google Analytics