上一篇介绍的是基于jxl.jar的操作Excel工具类,但是jxl.jar的licence限制了它不能用于商业项目,所以本篇介绍Apache的POI类库。
上篇文章在这里
功能简介:
1、向Excel文档插入数据,可以是多行可以是多列,保留原单元格格式不变
2、向Excel文档插入一个新行,并且使用与上一行完全相同的格式
3、等等
需要的第三方JAR包:
poi-3.8-20120326.jar
poi-examples-3.8-20120326.jar
poi-excelant-3.8-20120326.jar
poi-ooxml-3.8-20120326.jar
poi-ooxml-schemas-3.8-20120326.jar
poi-scratchpad-3.8-20120326.jar
stax-api-1.0.1.jar
完整的工具类的代码如下:
感谢gegewuqin9和在世界的中心呼喚愛在回复中建议,对读取单元格值的地方做了修改。
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.WorkbookFactory; /** * Excel工具类 * * <pre> * 基于Apache的POI类库 * </pre> * * @author 陈峰 */ public class POIExcelMakerUtil { private File excelFile; private InputStream fileInStream; private Workbook workBook; public POIExcelMakerUtil(File file) throws Exception { this.excelFile = file; this.fileInStream = new FileInputStream(this.excelFile); this.workBook = WorkbookFactory.create(this.fileInStream); } /** * 写入一组值 * * @param sheetNum * 写入的sheet的编号 * @param fillRow * 是写入行还是写入列 * @param startRowNum * 开始行号 * @param startColumnNum * 开始列号 * @param contents * 写入的内容数组 * @throws Exception */ public void writeArrayToExcel(int sheetNum, boolean fillRow, int startRowNum, int startColumnNum, Object[] contents) throws Exception { Sheet sheet = this.workBook.getSheetAt(sheetNum); writeArrayToExcel(sheet, fillRow, startRowNum, startColumnNum, contents); } /** * 写入一组值 * * @param sheetNum * 写入的sheet的名称 * @param fillRow * 是写入行还是写入列 * @param startRowNum * 开始行号 * @param startColumnNum * 开始列号 * @param contents * 写入的内容数组 * @throws Exception */ public void writeArrayToExcel(String sheetName, boolean fillRow, int startRowNum, int startColumnNum, Object[] contents) throws Exception { Sheet sheet = this.workBook.getSheet(sheetName); writeArrayToExcel(sheet, fillRow, startRowNum, startColumnNum, contents); } private void writeArrayToExcel(Sheet sheet, boolean fillRow, int startRowNum, int startColumnNum, Object[] contents) throws Exception { for (int i = 0, length = contents.length; i < length; i++) { int rowNum; int columnNum; // 以行为单位写入 if (fillRow) { rowNum = startRowNum; columnNum = startColumnNum + i; } // 以列为单位写入 else { rowNum = startRowNum + i; columnNum = startColumnNum; } this.writeToCell(sheet, rowNum, columnNum, convertString(contents[i])); } } /** * 向一个单元格写入值 * * @param sheetNum * sheet的编号 * @param rowNum * 行号 * @param columnNum * 列号 * @param value * 写入的值 * @throws Exception */ public void writeToExcel(int sheetNum, int rowNum, int columnNum, Object value) throws Exception { Sheet sheet = this.workBook.getSheetAt(sheetNum); this.writeToCell(sheet, rowNum, columnNum, value); } /** * 向一个单元格写入值 * * @param sheetName * sheet的名称 * @param columnRowNum * 单元格的位置 * @param value * 写入的值 * @throws Exception */ public void writeToExcel(String sheetName, int rowNum, int columnNum, Object value) throws Exception { Sheet sheet = this.workBook.getSheet(sheetName); this.writeToCell(sheet, rowNum, columnNum, value); } /** * 向一个单元格写入值 * * @param sheetNum * sheet的编号 * @param columnRowNum * 单元格的位置 * @param value * 写入的值 * @throws Exception */ public void writeToExcel(int sheetNum, String columnRowNum, Object value) throws Exception { Sheet sheet = this.workBook.getSheetAt(sheetNum); this.writeToCell(sheet, columnRowNum, value); } /** * 向一个单元格写入值 * * @param sheetNum * sheet的名称 * @param columnRowNum * 单元格的位置 * @param value * 写入的值 * @throws Exception */ public void writeToExcel(String sheetName, String columnRowNum, Object value) throws Exception { Sheet sheet = this.workBook.getSheet(sheetName); this.writeToCell(sheet, columnRowNum, value); } private void writeToCell(Sheet sheet, String columnRowNum, Object value) throws Exception { int[] rowNumColumnNum = convertToRowNumColumnNum(columnRowNum); int rowNum = rowNumColumnNum[0]; int columnNum = rowNumColumnNum[1]; this.writeToCell(sheet, rowNum, columnNum, value); } /** * 将单元格的行列位置转换为行号和列号 * * @param columnRowNum * 行列位置 * @return 长度为2的数组,第1位为行号,第2位为列号 */ private static int[] convertToRowNumColumnNum(String columnRowNum) { columnRowNum = columnRowNum.toUpperCase(); char[] chars = columnRowNum.toCharArray(); int rowNum = 0; int columnNum = 0; for (char c : chars) { if ((c >= 'A' && c <= 'Z')) { columnNum = columnNum * 26 + ((int) c - 64); } else { rowNum = rowNum * 10 + new Integer(c + ""); } } return new int[] { rowNum - 1, columnNum - 1 }; } private void writeToCell(Sheet sheet, int rowNum, int columnNum, Object value) throws Exception { Row row = sheet.getRow(rowNum); Cell cell = row.getCell(columnNum); if (cell == null) { cell = row.createCell(columnNum); } cell.setCellValue(convertString(value)); } /** * 读取一个单元格的值 * * @param sheetName * sheet的名称 * @param columnRowNum * 单元格的位置 * @return * @throws Exception */ public Object readCellValue(String sheetName, String columnRowNum) throws Exception { Sheet sheet = this.workBook.getSheet(sheetName); int[] rowNumColumnNum = convertToRowNumColumnNum(columnRowNum); int rowNum = rowNumColumnNum[0]; int columnNum = rowNumColumnNum[1]; Row row = sheet.getRow(rowNum); if (row != null) { Cell cell = row.getCell(columnNum); if (cell != null) { return getCellValue(cell); } } return null; } /** * 获取单元格中的值 * * @param cell 单元格 * @return */ private static Object getCellValue(Cell cell) { int type = cell.getCellType(); switch (type) { case Cell.CELL_TYPE_STRING: return (Object) cell.getStringCellValue(); case Cell.CELL_TYPE_NUMERIC: Double value = cell.getNumericCellValue(); return (Object) (value.intValue()); case Cell.CELL_TYPE_BOOLEAN: return (Object) cell.getBooleanCellValue(); case Cell.CELL_TYPE_FORMULA: return (Object) cell.getArrayFormulaRange().formatAsString(); case Cell.CELL_TYPE_BLANK: return (Object) ""; default: return null; } } /** * 插入一行并参照与上一行相同的格式 * * @param sheetNum * sheet的编号 * @param rowNum * 插入行的位置 * @throws Exception */ public void insertRowWithFormat(int sheetNum, int rowNum) throws Exception { Sheet sheet = this.workBook.getSheetAt(sheetNum); insertRowWithFormat(sheet, rowNum); } /** * 插入一行并参照与上一行相同的格式 * * @param sheetName * sheet的名称 * @param rowNum * 插入行的位置 * @throws Exception */ public void insertRowWithFormat(String sheetName, int rowNum) throws Exception { Sheet sheet = this.workBook.getSheet(sheetName); insertRowWithFormat(sheet, rowNum); } private void insertRowWithFormat(Sheet sheet, int rowNum) throws Exception { sheet.shiftRows(rowNum, rowNum + 1, 1); Row newRow = sheet.createRow(rowNum); Row oldRow = sheet.getRow(rowNum - 1); for (int i = oldRow.getFirstCellNum(); i < oldRow.getLastCellNum(); i++) { Cell oldCell = oldRow.getCell(i); if (oldCell != null) { CellStyle cellStyle = oldCell.getCellStyle(); newRow.createCell(i).setCellStyle(cellStyle); } } } /** * 重命名一个sheet * * @param sheetNum * sheet的编号 * @param newName * 新的名称 */ public void renameSheet(int sheetNum, String newName) { this.workBook.setSheetName(sheetNum, newName); } /** * 重命名一个sheet * * @param oldName * 旧的名称 * @param newName * 新的名称 */ public void renameSheet(String oldName, String newName) { int sheetNum = this.workBook.getSheetIndex(oldName); this.renameSheet(sheetNum, newName); } /** * 删除一个sheet * * @param sheetName * sheet的名称 */ public void removeSheet(String sheetName) { this.workBook.removeSheetAt(this.workBook.getSheetIndex(sheetName)); } /** * 写入Excel文件并关闭 */ public void writeAndClose() { if (this.workBook != null) { try { FileOutputStream fileOutStream = new FileOutputStream( this.excelFile); this.workBook.write(fileOutStream); if (fileOutStream != null) { fileOutStream.close(); } } catch (Exception e) { e.printStackTrace(); } } if (this.fileInStream != null) { try { this.fileInStream.close(); } catch (Exception e) { } } } private static String convertString(Object value) { if (value == null) { return ""; } else { return value.toString(); } } }
相关推荐
下面将详细介绍如何使用Apache POI操作Excel 2007以及相关的类库。 首先,"poi-bin-3.9-20121203.zip"是Apache POI的一个版本包,包含了运行时所需的二进制文件。解压后,你可以将其中的jar文件添加到你的Java项目...
"基于POI的Excel多Sheet页导出导入工具类"是一个实用的Java类库,专为处理Excel文件中的多个工作表(Sheet)而设计,提供了一种高效且灵活的方式来操作Excel数据。 该工具类的核心功能包括: 1. **多Sheet页操作**...
`org.apache.poi.hssf.converter` 是Apache POI的一个子模块,它专注于处理老版本的Excel文件(.xls),也就是基于HSSF(Horizontally Stored Spreadsheet Format)的文件。 在这个标题为“org.apache.poi.hssf....
总结,"条件导出Excel 工具类"很可能是一个集成了上述特性的Java类库,它简化了在Java应用中生成和操作Excel文件的过程,尤其是对于有特定条件的数据导出场景。在实际开发中,这样的工具类能够大大提高开发效率,...
虽然JExcelApi是一个不错的选择,但随着技术发展,还有一些其他库,如Apache POI,提供了更广泛的Excel文件格式支持,包括.xlsx,同时也具有更活跃的社区和更新。 总的来说,JExcelApi是Java程序员处理Excel文件的...
标题“poi导出excel通用类”指的是使用...压缩包文件“excel-poi”可能包含了相关的示例代码或者已经封装好的POI通用类库,你可以解压并查看这些文件,以学习和理解如何实际操作Apache POI来创建自己的通用导出类。
Apache POI 是一个开源项目,专门用于处理微软的Office文档格式,如Excel、Word和PowerPoint。这个"poi3.14jar包"是Apache POI的3.14版本,是一个Java库,允许开发者在Java应用程序中创建、读取和修改Microsoft ...
在本例中,“excel工具类jar包”包含了一些预定义的类和方法,专门用于处理Excel文件的读写操作。这类库通常包含了对Apache POI、JExcelApi等开源库的封装,简化了开发人员的工作。 Apache POI是一个流行的Java API...
### 应用POI组件操作Excel #### 一、POI组件简介 POI组件作为Apache项目的开源子项目之一,其主要目标在于提供一套API,使得开发者能够利用Java语言来读取与写入Microsoft Office文件格式的数据。尤其针对Excel...
它在.NET平台上提供了与Apache POI类似的API,使得C#开发者能够轻松地读取、写入和操作Excel文件,无论文件的版本是97-2003的.XLS格式还是2007及以后的.XLSX格式。NPOI支持多种.NET框架,包括.NET 2.0、.NET 3.5和...
本项目提供了一个名为"excel生成图表工具类"的Java类库,帮助开发者通过编程方式自动化创建Excel图表,包括柱状图、折线图和饼状图。以下将详细解析这个工具类库的主要知识点: 1. **Java编程基础**:首先,你需要...
在描述中提到了"3.9版本的官方poi资源包,完成",这表示你拥有的是Apache POI 3.9的完整版本,它包含了处理Excel文件所需的全部类库和工具。这个版本支持多种Excel功能,如工作表创建、单元格样式设定、公式计算、...
总的来说,Apache POI是Java开发者处理Excel文件的强大工具,它不仅支持基本的读写操作,还能实现复杂的Excel功能,为各种业务场景提供了灵活的支持。通过深入学习和熟练使用POI,开发者可以在不依赖Microsoft ...
NPOI是一个强大的开源库,它是Apache POI项目在.NET平台上的实现,专门用于处理Microsoft Office格式的文件,包括Excel(XLS、XLSX)和Word(DOC、DOCX)文档。NPOI 1.2是这个库的一个特定版本,它提供了丰富的API,...
总之,Apache POI 3.7是Java开发者处理Excel文件的强大工具,它提供了丰富的API和功能,使数据操作变得简单高效。虽然随着技术的发展,更现代的版本提供了更多改进,但3.7版本仍然为许多项目提供了可靠的支持。
ExcelUtil是一个用于操作Excel的Java工具类库,它基于Apache POI库,为开发者提供了方便、高效的Excel数据读写功能。POI是Apache软件基金会的一个开源项目,专门用于处理Microsoft Office格式的文件,如Excel、Word...
这个"poi生成excel表格加上写的一个生成类库"可能是某位开发者基于Apache POI创建的自定义工具库,用于简化和优化Excel文件的生成过程。 Apache POI 提供的主要类有 HSSFWorkbook(用于处理老版本的 .xls 文件)和 ...
总结,Apache POI 是一个强大的工具,能够帮助 Java 开发者高效地处理 Excel 文件。通过 poi-bin 和 poi-src 子文件,你可以轻松地在项目中集成 POI 库,同时深入理解其工作原理。无论是简单的数据读取还是复杂的...
6. **NPOI.Util**:基础类库,包含了许多有用的工具类和方法,可以用于其他文件格式的开发项目。 #### 四、NPOI 1.2beta的功能介绍 - **读写OLE2文档**:支持基本的OLE2文档的读写操作。 - **读写元数据**:支持...
EasyPoi 是一个Java开发的工具类库,专注于简化Excel和Word的操作,为开发者提供了高效、易用的API,使得在处理数据导入导出时,能够大大减少代码量,提高开发效率。它主要包含了以下几个核心功能: 1. **Excel的...