`

操作Excel工具类(基于Apache的POI类库)

阅读更多

上一篇介绍的是基于jxl.jar的操作Excel工具类,但是jxl.jar的licence限制了它不能用于商业项目,所以本篇介绍Apache的POI类库。

 

上篇文章在这里

操作Excel工具类(基于jxl.jar)

 

功能简介:

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();
		}
	}

}
  

 

 

 
16
2
分享到:
评论
19 楼 yunzhu 2017-09-06  
手机用户2240640595 写道
如果楼主没有测试通过就不要分享出来害人,如果真心分享,请把整个项目的源码都发出来。

这代码项目里面一直在用,只不过这一套API只支持excel2007的xls格式,不支持xlsx格式,不知道你是不是这个原因报错。

你的什么“害人”论和“真心分享就把整个项目源码分享”的两个理论,甚是奇葩啊!!!
18 楼 yunzhu 2017-09-06  
zhrb 写道
这个工具类是不是只支持excel2007的文件格式
我这边提示
Your InputStream was neither an OLE2 stream, nor an OOXML stream

是的,使用的这一套API只支持excel2007格式
17 楼 手机用户2240640595 2017-06-30  
如果楼主没有测试通过就不要分享出来害人,如果真心分享,请把整个项目的源码都发出来。
16 楼 手机用户2240640595 2017-06-30  
浪费了几个小时,程序老是报空指针异常,不知道楼主是不是运行通过了才共享的?
15 楼 手机用户2240640595 2017-06-30  
亲测,程序报空指针异常,代码没法用。
14 楼 贝塔ZQ 2016-09-02  
用插件会更简单的,PageOffice插件就是专门控制office文件的,可以试试
13 楼 marlboro027 2013-07-06  
mark一下  留着以后用
12 楼 zhrb 2013-06-27  
zhrb 写道
这个工具类是不是只支持excel2007的文件格式
我这边提示
Your InputStream was neither an OLE2 stream, nor an OOXML stream

发现应该是不支持excel导出的xml表格
11 楼 zhrb 2013-06-27  
这个工具类是不是只支持excel2007的文件格式
我这边提示
Your InputStream was neither an OLE2 stream, nor an OOXML stream
10 楼 gaopengxiang417 2013-03-28  
用POI的最主要的问题就是消耗内存太多,构建单元格的时候创建的对象太多,处理速度不如jxl快速....
9 楼 hellostory 2013-03-28  
yunzhu 写道
在世界的中心呼喚愛 写道
yunzhu 写道
gegewuqin9 写道
readCellValue这个方法,如果excel里的是数值型的,用getStringCellValue()会报错的吧。我是用了下面的方法来获取cellvalue的:
	private static Object getColumnValue(Row row, int i) {
		Cell cell = row.getCell(i);
		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_BLANK:
			return (Object)"";
		case Cell.CELL_TYPE_BOOLEAN:
			return (Object)cell.getBooleanCellValue();
		case Cell.CELL_TYPE_FORMULA:
			return (Object)cell.getArrayFormulaRange().formatAsString();
		default:
			return null;
		}
	}


好的,非常感谢你的建议,回头把我的工具类完善一下 


取值的时候,类型需要判断。不然会出错


好的,感谢建议,因为这个工具类写的时候只要是往Excel中插入大量的数据,读取的地方只有一个而且正好是字符串,所以没有考虑到这个问题。


这个地方才有参考价值!

8 楼 yunzhu 2013-03-28  
在世界的中心呼喚愛 写道
yunzhu 写道
gegewuqin9 写道
readCellValue这个方法,如果excel里的是数值型的,用getStringCellValue()会报错的吧。我是用了下面的方法来获取cellvalue的:
	private static Object getColumnValue(Row row, int i) {
		Cell cell = row.getCell(i);
		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_BLANK:
			return (Object)"";
		case Cell.CELL_TYPE_BOOLEAN:
			return (Object)cell.getBooleanCellValue();
		case Cell.CELL_TYPE_FORMULA:
			return (Object)cell.getArrayFormulaRange().formatAsString();
		default:
			return null;
		}
	}


好的,非常感谢你的建议,回头把我的工具类完善一下 


取值的时候,类型需要判断。不然会出错


好的,感谢建议,因为这个工具类写的时候只要是往Excel中插入大量的数据,读取的地方只有一个而且正好是字符串,所以没有考虑到这个问题。
7 楼 在世界的中心呼喚愛 2013-03-27  
yunzhu 写道
gegewuqin9 写道
readCellValue这个方法,如果excel里的是数值型的,用getStringCellValue()会报错的吧。我是用了下面的方法来获取cellvalue的:
	private static Object getColumnValue(Row row, int i) {
		Cell cell = row.getCell(i);
		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_BLANK:
			return (Object)"";
		case Cell.CELL_TYPE_BOOLEAN:
			return (Object)cell.getBooleanCellValue();
		case Cell.CELL_TYPE_FORMULA:
			return (Object)cell.getArrayFormulaRange().formatAsString();
		default:
			return null;
		}
	}


好的,非常感谢你的建议,回头把我的工具类完善一下 


取值的时候,类型需要判断。不然会出错
6 楼 yunzhu 2013-03-27  
gegewuqin9 写道
readCellValue这个方法,如果excel里的是数值型的,用getStringCellValue()会报错的吧。我是用了下面的方法来获取cellvalue的:
	private static Object getColumnValue(Row row, int i) {
		Cell cell = row.getCell(i);
		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_BLANK:
			return (Object)"";
		case Cell.CELL_TYPE_BOOLEAN:
			return (Object)cell.getBooleanCellValue();
		case Cell.CELL_TYPE_FORMULA:
			return (Object)cell.getArrayFormulaRange().formatAsString();
		default:
			return null;
		}
	}


好的,非常感谢你的建议,回头把我的工具类完善一下 
5 楼 gegewuqin9 2013-03-27  
readCellValue这个方法,如果excel里的是数值型的,用getStringCellValue()会报错的吧。我是用了下面的方法来获取cellvalue的:
	private static Object getColumnValue(Row row, int i) {
		Cell cell = row.getCell(i);
		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_BLANK:
			return (Object)"";
		case Cell.CELL_TYPE_BOOLEAN:
			return (Object)cell.getBooleanCellValue();
		case Cell.CELL_TYPE_FORMULA:
			return (Object)cell.getArrayFormulaRange().formatAsString();
		default:
			return null;
		}
	}
4 楼 yunzhu 2013-03-27  
freezingsky 写道
我个人感觉,我还是比较喜欢JXL。

本来是用的JXL,见这篇:http://yunzhu.iteye.com/blog/1480302
但是后来发现JXL的licence不能用于商业项目,后来连夜改成POI的方式了
3 楼 ie7shop 2013-03-27  
mark一下  留着以后用 
2 楼 freezingsky 2013-03-26  
我个人感觉,我还是比较喜欢JXL。
1 楼 xiaozhi6156 2013-03-26  
以防不便之需

相关推荐

    poi 操作 excel 2007 demo 及poi类库

    下面将详细介绍如何使用Apache POI操作Excel 2007以及相关的类库。 首先,"poi-bin-3.9-20121203.zip"是Apache POI的一个版本包,包含了运行时所需的二进制文件。解压后,你可以将其中的jar文件添加到你的Java项目...

    基于POI的Excel多Sheet页导出导入工具类

    "基于POI的Excel多Sheet页导出导入工具类"是一个实用的Java类库,专为处理Excel文件中的多个工作表(Sheet)而设计,提供了一种高效且灵活的方式来操作Excel数据。 该工具类的核心功能包括: 1. **多Sheet页操作**...

    org.apache.poi.hssf.converter,office转html所需包

    `org.apache.poi.hssf.converter` 是Apache POI的一个子模块,它专注于处理老版本的Excel文件(.xls),也就是基于HSSF(Horizontally Stored Spreadsheet Format)的文件。 在这个标题为“org.apache.poi.hssf....

    条件导出Excel 工具类.zip

    总结,"条件导出Excel 工具类"很可能是一个集成了上述特性的Java类库,它简化了在Java应用中生成和操作Excel文件的过程,尤其是对于有特定条件的数据导出场景。在实际开发中,这样的工具类能够大大提高开发效率,...

    Java中用于操作Excel格式文件的类库

    虽然JExcelApi是一个不错的选择,但随着技术发展,还有一些其他库,如Apache POI,提供了更广泛的Excel文件格式支持,包括.xlsx,同时也具有更活跃的社区和更新。 总的来说,JExcelApi是Java程序员处理Excel文件的...

    poi导出excel通用类

    标题“poi导出excel通用类”指的是使用...压缩包文件“excel-poi”可能包含了相关的示例代码或者已经封装好的POI通用类库,你可以解压并查看这些文件,以学习和理解如何实际操作Apache POI来创建自己的通用导出类。

    poi3.14jar包

    Apache POI 是一个开源项目,专门用于处理微软的Office文档格式,如Excel、Word和PowerPoint。这个"poi3.14jar包"是Apache POI的3.14版本,是一个Java库,允许开发者在Java应用程序中创建、读取和修改Microsoft ...

    excel工具类jar包

    在本例中,“excel工具类jar包”包含了一些预定义的类和方法,专门用于处理Excel文件的读写操作。这类库通常包含了对Apache POI、JExcelApi等开源库的封装,简化了开发人员的工作。 Apache POI是一个流行的Java API...

    应用POI组件操作Excel

    ### 应用POI组件操作Excel #### 一、POI组件简介 POI组件作为Apache项目的开源子项目之一,其主要目标在于提供一套API,使得开发者能够利用Java语言来读取与写入Microsoft Office文件格式的数据。尤其针对Excel...

    NPOI的Excel各种版本导入导出操作类库

    它在.NET平台上提供了与Apache POI类似的API,使得C#开发者能够轻松地读取、写入和操作Excel文件,无论文件的版本是97-2003的.XLS格式还是2007及以后的.XLSX格式。NPOI支持多种.NET框架,包括.NET 2.0、.NET 3.5和...

    excel生成图表工具类.zip

    本项目提供了一个名为"excel生成图表工具类"的Java类库,帮助开发者通过编程方式自动化创建Excel图表,包括柱状图、折线图和饼状图。以下将详细解析这个工具类库的主要知识点: 1. **Java编程基础**:首先,你需要...

    poi包,完整

    在描述中提到了"3.9版本的官方poi资源包,完成",这表示你拥有的是Apache POI 3.9的完整版本,它包含了处理Excel文件所需的全部类库和工具。这个版本支持多种Excel功能,如工作表创建、单元格样式设定、公式计算、...

    poi excel解析

    总的来说,Apache POI是Java开发者处理Excel文件的强大工具,它不仅支持基本的读写操作,还能实现复杂的Excel功能,为各种业务场景提供了灵活的支持。通过深入学习和熟练使用POI,开发者可以在不依赖Microsoft ...

    NPOI 1.2 Apache POI 的.net版本 Execel,doc文件的操作类库

    NPOI是一个强大的开源库,它是Apache POI项目在.NET平台上的实现,专门用于处理Microsoft Office格式的文件,包括Excel(XLS、XLSX)和Word(DOC、DOCX)文档。NPOI 1.2是这个库的一个特定版本,它提供了丰富的API,...

    poi3.7(excel)

    总之,Apache POI 3.7是Java开发者处理Excel文件的强大工具,它提供了丰富的API和功能,使数据操作变得简单高效。虽然随着技术的发展,更现代的版本提供了更多改进,但3.7版本仍然为许多项目提供了可靠的支持。

    操作Excel的工具ExcelUtil源码

    ExcelUtil是一个用于操作Excel的Java工具类库,它基于Apache POI库,为开发者提供了方便、高效的Excel数据读写功能。POI是Apache软件基金会的一个开源项目,专门用于处理Microsoft Office格式的文件,如Excel、Word...

    poi生成ecel表格加上写的一个生成类库

    这个"poi生成excel表格加上写的一个生成类库"可能是某位开发者基于Apache POI创建的自定义工具库,用于简化和优化Excel文件的生成过程。 Apache POI 提供的主要类有 HSSFWorkbook(用于处理老版本的 .xls 文件)和 ...

    poi.zip java读取excel文件

    总结,Apache POI 是一个强大的工具,能够帮助 Java 开发者高效地处理 Excel 文件。通过 poi-bin 和 poi-src 子文件,你可以轻松地在项目中集成 POI 库,同时深入理解其工作原理。无论是简单的数据读取还是复杂的...

    NPOI(开源的.NET读写Excel、WORD等文档的类库)的使用教程

    6. **NPOI.Util**:基础类库,包含了许多有用的工具类和方法,可以用于其他文件格式的开发项目。 #### 四、NPOI 1.2beta的功能介绍 - **读写OLE2文档**:支持基本的OLE2文档的读写操作。 - **读写元数据**:支持...

    EasyPoi Excel和 Word简易工具类

    EasyPoi 是一个Java开发的工具类库,专注于简化Excel和Word的操作,为开发者提供了高效、易用的API,使得在处理数据导入导出时,能够大大减少代码量,提高开发效率。它主要包含了以下几个核心功能: 1. **Excel的...

Global site tag (gtag.js) - Google Analytics