我想测试一下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
分享到:
相关推荐
Apache POI是一个流行的开源库,专门用于处理Microsoft Office格式的文件,包括Excel(.xls和.xlsx)和Word(.doc和.docx)。在本场景中,我们关注的是使用POI 3.1版本来读取和写入Excel以及WPS的ET文件。POI 3.1是...
Apache POI是一个流行的Java库,用于读取和写入Microsoft Office格式的文件,尤其是Excel(.xlsx和.xls)文件。这个实例提供了两种方法来导出Excel文件:通过Servlet和通过main方法。这两种方法都是在Java环境中操作...
在你提到的"poi3.9及测试程序"中,POI 3.9 版本是一个较旧但仍然广泛使用的版本,它提供了Java API来读取、写入和修改这些Office文件。 POI 3.9 版本主要包含以下组件和功能: 1. **HSSF (Horrible Spreadsheet ...
HSSF用于读写旧版的BIFF格式(XLS),而SXSSF则为大型Excel文件提供了内存效率高的处理方式,因为它可以将部分数据写到磁盘上。 `commons-math3-3.6.1.jar`:Apache Commons Math库是POI的一个依赖,提供了数学和...
总之,通过集成Apache POI和BeanShell,JMeter可以轻松地处理Excel文件,实现数据读取和写入,这对于构建复杂和灵活的测试计划是非常有用的。不过,使用时要考虑性能和资源消耗,选择最适合的解决方案。
XML、Excel和shp等多种格式满足了不同应用场景的需求,而开发测试数据集如“百度POI-北京市区-全部分类”和“腾讯POI-广州市区-全部分类”,则为开发者提供了丰富的素材,以便进行功能验证和性能优化。理解和有效...
Apache POI 是一个广泛使用的Java库,用于处理Microsoft Office格式的文件,如Excel、Word和PowerPoint。在处理大型Excel文件时,传统的HSSF和XSSF模型可能会遇到性能瓶颈,因为它们将整个工作簿加载到内存中。为了...
Java中的Apache POI库是一个强大的工具,用于读取、创建和修改Microsoft Office格式的文件,尤其是Excel工作簿。...在Eclipse这样的开发环境中,结合POI的实例代码,可以快速地进行Excel操作的开发与测试。
Apache POI是一个强大的Java库,专门用于处理Microsoft Office格式的文件,如Excel、Word和PowerPoint。在"POI官方文件"中,我们主要关注的是它在Excel读写方面的功能,因为标签提到了"excel的jar"。poi-3.17是该库...
【标题】"poi测试程序源码"涉及到的知识点主要集中在Java编程语言中使用Apache POI库来处理Excel文件。Apache POI是Java平台上的一个开源项目,它允许开发者读写Microsoft Office格式的文件,包括Excel(XLS和XLSX...
标题中的"poiDemo测试"指的是使用Apache POI库进行的一个示例项目,主要涉及的是Java编程语言中处理Microsoft Office文档,特别是Excel文件的功能。Apache POI是一个开源的Java API,它允许开发者在Java应用程序中...
本工具可以将Oracle数据库中的指定表导出为Excel 2007 xlsx 格式文件,经过测试最大上限为120000条数据,实际情况据JVM内存而定。压缩包含包含源代码与编译后的文件。 详情请查看:...
- 自动化测试:测试框架可能利用POI来验证应用程序的Excel输出是否符合预期。 6. **性能优化** 大型Excel文件处理时,内存使用是一个主要问题。POI提供了一些优化策略,如使用SXSSF(Streaming Usermodel API)来...
Apache POI是一个开源项目,主要用于处理Microsoft Office格式的文件,如Excel、Word和PowerPoint。在Java环境中,POI提供了一套API,使得开发者能够创建、读取和修改这些文件。"poi jar包 测试使用无bug"的标题和...
Apache POI 是一个流行的Java库,专门用于处理Microsoft Office格式的文件,包括Excel的.xls和.xlsx格式。本篇将深入探讨如何利用Apache POI库在Java环境中实现EXCEL文件的读取和批量新增操作。 首先,理解Apache ...
这样,你就可以直接运行和测试POI的Excel读写功能了。 POI的强大之处还在于它支持复杂的Excel功能,如公式计算、样式设置、图表创建等。例如,你可以设置单元格的字体、颜色、对齐方式,甚至创建自定义的样式。对于...
标题“读写Excel2007 POI3.8”涉及的是使用Apache POI库的3.8版本处理Microsoft Excel 2007文件的方法。Apache POI是Java的一个开源项目,专门用于读取、创建和修改Microsoft Office格式的文件,特别是Excel文件。在...
Apache POI 是一个开源项目,专门用于处理Microsoft Office格式的文件,包括Excel。在Java开发中,POI库被广泛用于读取和写入Excel文件。"poi3.9读写excel兼容03和07版本"这个标题指的是使用Apache POI 3.9版本的API...
Apache POI项目的任务是创建和维护Java API,以便根据Office Open XML标准(OOXML)和Microsoft的OLE 2复合文档格式(OLE2)操作各种文件格式。简而言之,您可以使用Java读写MS Excel文件。此外,您还可以使用Java...