对于一个程序员来说,文件操作是经常遇到的,尤其是对Excel文件的操作。
目前处理Excel的开源javaAPI主要有两种,一是Jxl(Java Excel API),Jxl只支持Excel2003以下的版本。另外一种是Apache的Jakarta POI,相比于Jxl,POI对微软办公文档的支持更加强大,但是它使用复杂,上手慢。POI可支持更高的Excel版本2007。对Excel的读取,POI有两种模式,一是用户模式,这种方式同Jxl的使用很类似,使用简单,都是将文件一次性读到内存,文件小的时候,没有什么问题,当文件大的时候,就会出现OutOfMemory的内存溢出问题。第二种是事件驱动模式,拿Excel2007来说,其内容采用XML的格式来存储,所以处理excel就是解析XML,而目前使用事件驱动模式解析XML的API是SAX(Simple API for XML),这种模型在读取XML文档时,并没有将整个文档读入内存,而是按顺序将整个文档解析完,在解析过程中,会主动产生事件交给程序中相应的处理函数来处理当前内容。因此这种方式对系统资源要求不高,可以处理海量数据。笔者曾经做过测试,这种方法处理一千万条,每条五列的数据花费大约11分钟。可见处理海量数据的文件事件驱动是一个很好的方式。而本文中用到的AbstractExcel2003Reader、AbstractExcel2007Reader对Excel的读取都是采用这种POI的事件驱动模式。至于Excel的写操作,对较高版本的Excel2007,POI提供了很好的支持,主要流程是第一步构建工作薄和电子表格对象,第二步在一个流中构建文本文件,第三步使用流中产生的数据替换模板中的电子表格。这种方式也可以处理海量数据文件。AbstractExcel2007Writer就是使用这种方式进行写操作。对于写入较低版本的Excel2003,POI使用了用户模式来处理,就是将整个文档加载进内存,如果数据量大的话就会出现内存溢出的问题,Excel2003Writer就是使用这种方式。据笔者的测试,如果数据量大于3万条,每条8列的话,就会报OutOfMemory的错误。Excel2003中每个电子表格的记录数必须在65536以下,否则就会发生异常。目前还没有好的解决方案,建议对于海量数据写入操作,尽量使用Excel2007。
在这里介绍一下我在项目中用到的一个操作Excel的工具——POI。关于POI的一些概念,网络上很多,详细信息大家可以自行百度,我在这里只做简单介绍。POI是apache的类库,主要是为java开发人员提供对Office文件(word、ppt、Excel)处理的支持。我这里主要给出几个例子来说明演示一下。
准备工作
我用的版本是poi-3.13,需要的jar有:
poi-3.13-20150929.jar (2003最常用的)
poi-ooxml-3.13-20150929.jar (excel2007)
poi-ooxml-schemas-3.13-20150929.jar
poi-excelant-3.13-20150929.jar
poi-scratchpad-3.13-20150929.jar
xmlbeans-2.6.0.jar
POI中各个jar的作用:参考: http://blog.csdn.net/szwangdf/article/details/39053859
Maven artifactId |
Prerequisites |
JAR |
poi |
commons-logging, commons-codec, log4j |
poi-version-yyyymmdd.jar |
poi-scratchpad |
poi |
poi-scratchpad-version-yyyymmdd.jar |
poi-ooxml |
poi, poi-ooxml-schemas |
poi-ooxml-version-yyyymmdd.jar |
poi-ooxml-schemas |
xmlbeans |
poi-ooxml-schemas-version-yyyymmdd.jar |
poi-examples |
poi, poi-scratchpad, poi-ooxml |
poi-examples-version-yyyymmdd.jar |
ooxml-schemas |
xmlbeans |
ooxml-schemas-1.1.jar |
很多人都困惑POI那么多Jar到底应该导入哪一个。
实际上很多时候我们只利用POI来操作Excel。甚至只用xls这一种格式。
那么就没必要全部都导入了。具体应该使用哪个JAR包请参考以下内容:
Component Map
The Apache POI distribution consists of support for many document file formats. This support is provided in several Jar files. Not all of the Jars are needed for every format. The following tables show the relationships between POI components, Maven repository tags, and the project's Jar files.
Component |
Application type |
Maven artifactId |
Notes |
POIFS |
OLE2 Filesystem |
poi |
Required to work with OLE2 / POIFS based files |
HPSF |
OLE2 Property Sets |
poi |
|
HSSF |
Excel XLS |
poi |
For HSSF only, if common SS is needed see below |
HSLF |
PowerPoint PPT |
poi-scratchpad |
|
HWPF |
Word DOC |
poi-scratchpad |
|
HDGF |
Visio VSD |
poi-scratchpad |
|
HPBF |
Publisher PUB |
poi-scratchpad |
|
HSMF |
Outlook MSG |
poi-scratchpad |
|
OpenXML4J |
OOXML |
poi-ooxml plus one of poi-ooxml-schemas, ooxml-schemas |
Only one schemas jar is needed, see below for differences |
XSSF |
Excel XLSX |
poi-ooxml |
|
XSLF |
PowerPoint PPTX |
poi-ooxml |
|
XWPF |
Word DOCX |
poi-ooxml |
|
Common SS |
Excel XLS and XLSX |
poi-ooxml |
WorkbookFactory and friends all require poi-ooxml, not just core poi |
当我们只要使用xls格式时、只要导入poi-version-yyyymmdd.jar就可以了。
当我们还要使用xlsx格式、还要导入poi-ooxml-version-yyyymmdd.jar。
至于poi-ooxml-schemas-version-yyyymmdd.jar这个jar基本不太会用到的。
当我们需要操作word、ppt、viso、outlook等时需要用到poi-scratchpad-version-yyyymmdd.jar。
下面给个超级简单的小demo:write excel
import java.io.FileOutputStream;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Cell;
public class ExcelUtil {
public void testWriteExcel() {
String excelPath = "d:/test.xls";
Workbook workbook = null;
try {
// XSSFWorkbook used for .xslx (>= 2007), HSSWorkbook for 03 .xsl
workbook = new HSSFWorkbook();
} catch (Exception e) {
System.out.println("创建Excel失败: ");
e.printStackTrace();
}
if (workbook != null) {
Sheet sheet = workbook.createSheet("测试数据");
Row row0 = sheet.createRow(0);
for (int i = 0; i < 6; i++) {
Cell cell = row0.createCell(i, Cell.CELL_TYPE_STRING);
cell.setCellValue("列标题" + i );
//sheet.autoSizeColumn(i);//自动调整宽度
}
for (int rowNum = 1; rowNum < 10; rowNum++) {
Row row = sheet.createRow(rowNum);
for (int i = 0; i < 6; i++) {
Cell cell = row.createCell(i, Cell.CELL_TYPE_STRING);
cell.setCellValue("单元格" + String.valueOf(rowNum + 1)
+ String.valueOf(i + 1));
}
}
try {
FileOutputStream outputStream = new FileOutputStream(excelPath);
workbook.write(outputStream);
outputStream.flush();
outputStream.close();
} catch (Exception e) {
System.out .println("写入Excel失败: ");
e.printStackTrace();
}
}
}
public static void main(String[] args)
{
ExcelUtil eu = new ExcelUtil();
eu.testWriteExcel();
}
}
怎么样,很简单吧。只要你使用了poi,不管你有没有安装Office,都可以完美的操作Office文件,小伙伴们,都快来试试看吧。
参考:http://blog.csdn.net/xiaoxian8023/article/details/40562993