`

POI写文件测试

    博客分类:
  • Java
 
阅读更多

我想测试一下POI怎么写文件,并封装成一个类,用来方便从数据库数据转成excel文件;

这个类中方法是:在构造方法中要输入xls文件的名字;

调用nextSheet()方法,就会在开始在下一个sheet中写数据;

调用writeline()方法就换行;

调用write(Ojbect)方法,就根据数据类型来写入数据;

 

第一次写的代码如下:

 

package com.optionracing.utils;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Calendar;
import java.util.Date;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.RichTextString;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class ExcelWriter {

	static Logger logger = LoggerFactory.getLogger(ExcelWriter.class);
	private String filename;
	HSSFWorkbook wb;
	private int sheetNum = 0;
	private int rowNum = 0;
	private int cellNum = 0;
	private HSSFSheet sheet;
	private String dateFormat = "yyyy-MM-dd HH:mm:ss"; 
	
	public ExcelWriter(String filename) {
		this.filename = filename;
		wb = new HSSFWorkbook();
		nextSheet();
	}
	
	public void setDateFormat(String dateformat) {
		this.dateFormat = dateformat;
	}

	public void close() {
		FileOutputStream fileOut;
		try {
			fileOut = new FileOutputStream(filename);
			wb.write(fileOut);
			fileOut.close();
		} catch (IOException e) {
			logger.error(e.getMessage(), e);
			throw new RuntimeException(e);
		}

	}

	

	public void nextSheet() {
		sheetNum ++;
		sheet = wb.createSheet("sheet" + sheetNum );
		rowNum = 0;
		cellNum = 0;
	}

	public void writeline() {
		rowNum ++;
		cellNum = 0;
	}

	public void write(Object obj) {
		HSSFRow row = sheet.createRow(rowNum);
		HSSFCell cell = row.createCell(cellNum);
		if(obj == null) {
			
		} else if(obj instanceof Date) {
			writeDate((Date)obj, cell);
		} else if(obj instanceof Calendar) {
			writeDate(((Calendar)obj).getTime(), cell);
		} else if(obj instanceof Number) {
			writeNumber((Number)obj, cell);
		} else if(obj instanceof String) {
			writeString((String)obj, cell);
		} else {
			writeString(obj.toString(), cell);
		}
		cellNum ++;
	}
	

	private void writeString(String obj, HSSFCell cell) {
		sheet.getRow(rowNum).getCell(cellNum).setCellValue(obj);
	}

	private void writeNumber(Number obj, HSSFCell cell) {
		if((obj.doubleValue() - obj.longValue()) == 0 ) {
			cell.setCellValue(obj.intValue());
		} else {
			cell.setCellValue(obj.doubleValue());
		}
		
	}

	private void writeDate(Date obj, HSSFCell cell) {
		HSSFCellStyle style = wb.createCellStyle();
		short dateFormat = wb.createDataFormat().getFormat(this.dateFormat);
		style.setDataFormat(dateFormat);
		cell.setCellStyle(style);
		cell.setCellValue(obj);
	}

}

测试代码:

写道
ExcelWriter writer = new ExcelWriter(new Date().getTime() + ".xls");
writer.write("Hello");
writer.write("world");
writer.write("lhc");
writer.writeline();
writer.write("Hello\nWorld");
writer.write("1234");
writer.write(12.34);
writer.nextSheet();
writer.write("1234");
writer.write("1234");
writer.close();
 

测试结果发现:

只有在最后一列的数据才能写入,本人没有查找到是什么原因

 

 

于是转换方法,修改write(Object)方法,不再是:当每一次调用创建一个HSSFCell,

而是在close()方法中统一创建输出

 

代码如下:

写道
package com.optionracing.utils;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.Workbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 我选用读写xls文件的HSSF,是因为excel 2007兼容97,而反之不行
*
*
* @author Administrator
*
*/

public class ExcelWriter {

static Logger logger = LoggerFactory.getLogger(ExcelWriter.class);
private String filename;
HSSFWorkbook wb;
private int sheetNum = 0;
private String dateFormat = "yyyy-MM-dd HH:mm:ss";
List<List<List<?>>> sheetdata = new ArrayList<List<List<?>>>();
List<List<?>> rowCellData;
List<Object> cellData;

public ExcelWriter(String filename) {
this.filename = filename;
wb = new HSSFWorkbook();
nextSheet();
}

public void setDateFormat(String dateformat) {
this.dateFormat = dateformat;
}

public void close() {
FileOutputStream fileOut;
try {
HSSFSheet sheet;
HSSFRow row;
HSSFCell cell;
for (int sheetNum = 0; sheetNum < sheetdata.size(); sheetNum++) {
sheet = wb.createSheet("sheet" + (sheetNum + 1));
List<List<?>> tmpData = sheetdata.get(sheetNum);
for (int rowNum = 0; rowNum < tmpData.size(); rowNum++) {
row = sheet.createRow(rowNum);
List<?> line = tmpData.get(rowNum);
for (int cellNum = 0; cellNum < line.size(); cellNum++) {
cell = row.createCell(cellNum);
Object obj = line.get(cellNum);
writeObj(obj, cell);
}
}
}


fileOut = new FileOutputStream(filename);
wb.write(fileOut);
fileOut.close();
} catch (IOException e) {
logger.error(e.getMessage(), e);
throw new RuntimeException(e);
}

}

public void nextSheet() {
rowCellData = new ArrayList<List<?>>();
sheetdata.add(rowCellData);
cellData = new ArrayList<Object>();
rowCellData.add(cellData);
sheetNum++;
}

public void writeline() {
cellData = null;
}

public void write(Object obj) {
if(cellData == null) {
cellData = new ArrayList<Object>();
rowCellData.add(cellData);
}
cellData.add(obj);
}


public void writeObj(Object obj, HSSFCell cell) {
if (obj == null) {

} else if (obj instanceof Date) {
writeDate((Date) obj, cell);
} else if (obj instanceof Calendar) {
writeDate(((Calendar) obj).getTime(), cell);
} else if (obj instanceof Number) {
writeNumber((Number) obj, cell);
} else if (obj instanceof String) {
writeString((String) obj, cell);
} else {
writeString(obj.toString(), cell);
}
}

private void writeString(String obj, HSSFCell cell) {
cell.setCellValue(obj);
}

private void writeNumber(Number obj, HSSFCell cell) {
if ((obj.doubleValue() - obj.longValue()) == 0) {
cell.setCellValue(obj.intValue());
} else {
cell.setCellValue(obj.doubleValue());
}

}

private void writeDate(Date obj, HSSFCell cell) {
HSSFCellStyle style = wb.createCellStyle();
short dateFormat = wb.createDataFormat().getFormat(this.dateFormat);
style.setDataFormat(dateFormat);
cell.setCellStyle(style);
cell.setCellValue(obj);
}


}

 红色部份是主要的修正部份,但是这种方法会浪费内存,用来存放数据的List

分享到:
评论

相关推荐

    POI导出Excel文件

    Apache POI是一个流行的Java库,用于读取和写入Microsoft Office格式的文件,尤其是Excel(.xlsx和.xls)文件。这个实例提供了两种方法来导出Excel文件:通过Servlet和通过main方法。这两种方法都是在Java环境中操作...

    poi3.1读写excel,wps et

    Apache POI是一个流行的开源库,专门用于处理Microsoft Office格式的文件,包括Excel(.xls和.xlsx)和Word(.doc和.docx)。在本场景中,我们关注的是使用POI 3.1版本来读取和写入Excel以及WPS的ET文件。POI 3.1是...

    poi3.9及测试程序

    在你提到的"poi3.9及测试程序"中,POI 3.9 版本是一个较旧但仍然广泛使用的版本,它提供了Java API来读取、写入和修改这些Office文件。 POI 3.9 版本主要包含以下组件和功能: 1. **HSSF (Horrible Spreadsheet ...

    导入poi jar包实现使用Beanshell读写Excel文件

    总之,通过集成Apache POI和BeanShell,JMeter可以轻松地处理Excel文件,实现数据读取和写入,这对于构建复杂和灵活的测试计划是非常有用的。不过,使用时要考虑性能和资源消耗,选择最适合的解决方案。

    Java实现Excel读写的poi 5.2.1版本jar

    HSSF用于读写旧版的BIFF格式(XLS),而SXSSF则为大型Excel文件提供了内存效率高的处理方式,因为它可以将部分数据写到磁盘上。 `commons-math3-3.6.1.jar`:Apache Commons Math库是POI的一个依赖,提供了数学和...

    POI开发测试数据

    XML、Excel和shp等多种格式满足了不同应用场景的需求,而开发测试数据集如“百度POI-北京市区-全部分类”和“腾讯POI-广州市区-全部分类”,则为开发者提供了丰富的素材,以便进行功能验证和性能优化。理解和有效...

    java用poi读写excel表

    Java中的Apache POI库是一个强大的工具,用于读取、创建和修改Microsoft Office格式的文件,尤其是Excel工作簿。...在Eclipse这样的开发环境中,结合POI的实例代码,可以快速地进行Excel操作的开发与测试。

    poi测试程序源码

    【标题】"poi测试程序源码"涉及到的知识点主要集中在Java编程语言中使用Apache POI库来处理Excel文件。Apache POI是Java平台上的一个开源项目,它允许开发者读写Microsoft Office格式的文件,包括Excel(XLS和XLSX...

    poiDemo测试

    标题中的"poiDemo测试"指的是使用Apache POI库进行的一个示例项目,主要涉及的是Java编程语言中处理Microsoft Office文档,特别是Excel文件的功能。Apache POI是一个开源的Java API,它允许开发者在Java应用程序中...

    Java Poi 写Excel文件 (Excel 2007 xlsx)

    本工具可以将Oracle数据库中的指定表导出为Excel 2007 xlsx 格式文件,经过测试最大上限为120000条数据,实际情况据JVM内存而定。压缩包含包含源代码与编译后的文件。 详情请查看:...

    应用POI组件读写Excel文档

    - 自动化测试:测试框架可能利用POI来验证应用程序的Excel输出是否符合预期。 6. **性能优化** 大型Excel文件处理时,内存使用是一个主要问题。POI提供了一些优化策略,如使用SXSSF(Streaming Usermodel API)来...

    poi jar包 测试使用无bug

    Apache POI是一个开源项目,主要用于处理Microsoft Office格式的文件,如Excel、Word和PowerPoint。在Java环境中,POI提供了一套API,使得开发者能够创建、读取和修改这些文件。"poi jar包 测试使用无bug"的标题和...

    poi批量上传EXCEL文件

    Apache POI 是一个流行的Java库,专门用于处理Microsoft Office格式的文件,包括Excel的.xls和.xlsx格式。本篇将深入探讨如何利用Apache POI库在Java环境中实现EXCEL文件的读取和批量新增操作。 首先,理解Apache ...

    poi读写excel

    这样,你就可以直接运行和测试POI的Excel读写功能了。 POI的强大之处还在于它支持复杂的Excel功能,如公式计算、样式设置、图表创建等。例如,你可以设置单元格的字体、颜色、对齐方式,甚至创建自定义的样式。对于...

    poi3.9读写excel兼容03和07版本

    Apache POI 是一个开源项目,专门用于处理Microsoft Office格式的文件,包括Excel。在Java开发中,POI库被广泛用于读取和写入Excel文件。"poi3.9读写excel兼容03和07版本"这个标题指的是使用Apache POI 3.9版本的API...

    读写Excel2007 POI3.8

    标题“读写Excel2007 POI3.8”涉及的是使用Apache POI库的3.8版本处理Microsoft Excel 2007文件的方法。Apache POI是Java的一个开源项目,专门用于读取、创建和修改Microsoft Office格式的文件,特别是Excel文件。在...

    POI导入测试用数据users.xls

    Apache POI项目的任务是创建和维护Java API,以便根据Office Open XML标准(OOXML)和Microsoft的OLE 2复合文档格式(OLE2)操作各种文件格式。简而言之,您可以使用Java读写MS Excel文件。此外,您还可以使用Java...

    poi读取大文件Excel,使用xml格式解析,速度实测50mb文件13s,可指定sheet页内容,带工具类和测试类

    Apache POI 是一个广泛使用的Java库,用于处理Microsoft Office格式的文件,如Excel、Word和PowerPoint。在处理大型Excel文件时,传统的HSSF和XSSF模型可能会遇到性能瓶颈,因为它们将整个工作簿加载到内存中。为了...

    POI官方文件

    Apache POI是一个强大的Java库,专门用于处理Microsoft Office格式的文件,如Excel、Word和PowerPoint。在"POI官方文件"中,我们主要关注的是它在Excel读写方面的功能,因为标签提到了"excel的jar"。poi-3.17是该库...

    poi3.17全套jar文件

    在实际应用中,Apache POI可以用于数据导入导出、自动化测试、报表生成、数据分析等多种场景。结合其他Java库,如Spring、MyBatis等,可以构建出强大的企业级应用。总的来说,"poi3.17全套jar文件"是一个强大的工具...

Global site tag (gtag.js) - Google Analytics