之前使用JXL导出Excel文件(仅支持2003版本之前的Excel),但随着现在业务数据量的增多,并为了适应新版本Excel文件的导出和读取,以及提高内存的使用效率和导出时间,使用POI导出Excel文件。
JXL和POI的比较:
JXL:
支持比较低版本的excel,比如Excel 95 ,97 ,2000,2003
由于Excel版本比较低,导致最大行有限制,无法导出65535以上量级的数据
对于内存,和时间的花费也比POI基于内存+磁盘的方式高。
1 读取Excel公式(可以读取Excel 97以后的公式)
2 生成Excel数据表(格式为Excel 97)
3 支持字体、数字、日期的格式化
4 支持单元格的阴影操作,以及颜色操作
5 修改已经存在的数据表
6 是最基础的excel api
7 小文件读取效率比较高
8 跨平台
POI:
1 能保持Excel里原有的宏(但不能用它写新的宏)。
2 不支持跨平台(主要就是Java语言)
3 在一些业务场景中代码相对复杂,但是API丰富,支持多种模式的读写。
4 支持比较新版本的excel.
5 读写的时候比较占内存。
6 读写的时候比较占内存。
7 支持大数量大文件的读写操作。但是需要熟悉API。
总体来说,对于简单的单表excel导入导出的需求,建议使用JXL。数据量稍微小点,占用内存少,速度快。
对于报表类的,涉及月份数据量,多表数据聚合在一起建议使用POI。
自己写了个测试类,支持导出Excel,自定义设置单元格格式。
示例代码如下:
package poi;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
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.util.CellRangeAddress;
public class TestPoi
{
public static void main(String[] args)
{
try
{
// reportXls(getListmap());
reportMergeXls(getListmap(), "test2", "sunck");
System.out.println("导出完成");
}
catch (Exception e)
{
e.printStackTrace();
}
}
/**
* 模拟数据库数据集合
* @return
*/
@SuppressWarnings({ "unchecked", "rawtypes"
}) public static List
package poi;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 导入返回类
*/
public class ExcelImportResult
{
/**
* 标题行
*/
private XRow headRow;
/**
* 错误结果集
*/
private List errorList = new ArrayList();
/**
* 成功的行数
*/
private Integer successTotal = 0;
/**
* 错误行的错误信息
*/
private Map> errorInfoMap = new HashMap>();
public List getErrorList()
{
return errorList;
}
public void addErrorRow(XRow row)
{
this.errorList.add(row);
}
public void addErrorRow(XRow row, String errorInfo)
{
this.errorList.add(row);
List errList = errorInfoMap.get(row.getRowIndex());
if (errList == null)
{
errList = new ArrayList();
}
errList.add(errorInfo);
errorInfoMap.put(row.getRowIndex(), errList);
}
public Integer getSuccessTotal()
{
return successTotal;
}
public void addSuccessTotal(Integer successCount)
{
this.successTotal += successCount;
}
public Integer getFailedTotal()
{
return errorList.size();
}
public Map> getErrorInfoMap()
{
return errorInfoMap;
}
public void addErrorInfo(int rowIndex, String errorInfo)
{
List errList = errorInfoMap.get(rowIndex);
if (errList == null)
{
errList = new ArrayList();
}
errList.add(errorInfo);
errorInfoMap.put(rowIndex, errList);
}
public XRow getHeadRow()
{
return headRow;
}
public void setHeadRow(XRow headRow)
{
this.headRow = headRow;
}
}
package poi;
/**
* Excel单元格对象封装
*/
public class XCell
{
private int rowIndex;
private int columnIndex;
private String value;
public int getRowIndex()
{
return rowIndex;
}
public void setRowIndex(int rowIndex)
{
this.rowIndex = rowIndex;
}
public int getColumnIndex()
{
return columnIndex;
}
public void setColumnIndex(int columnIndex)
{
this.columnIndex = columnIndex;
}
public String getValue()
{
return value;
}
public void setValue(String value)
{
this.value = value;
}
}
package poi;
import java.util.ArrayList;
import java.util.List;
/**
* Excel行对象封装
*/
public class XRow
{
private int rowIndex;
private List cells = new ArrayList();
public int getRowIndex()
{
return rowIndex;
}
public void setRowIndex(int rowIndex)
{
this.rowIndex = rowIndex;
}
public int getCellsSize()
{
return cells.size();
}
public XRow addCell(XCell cell)
{
this.cells.add(cell);
return this;
}
public XCell getCell(int cellIndex)
{
return cells.get(cellIndex);
}
}