本文为poi生成Excel的序章。
示例代码如下所示:
/**
*
*/
package com.geloin.poi.main;
import java.io.FileInputStream;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
/**
* @author Geloin
*
*/
public class PoiReadExcel {
/**
* @param args
*/
public static void main(String[] args) throws Exception {
String filePath = "d:/work/proTmp/geloin/poi/export.xls";
POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(filePath));
HSSFWorkbook workBook = new HSSFWorkbook(fs);
HSSFSheet sheet = workBook.getSheetAt(0);
Iterator<Row> it = sheet.rowIterator();
while (it.hasNext()) {
Row row = it.next();
int cellCount = row.getPhysicalNumberOfCells();
for (int i = 0; i < cellCount; i++) {
Cell cell = row.getCell(i);
String cellValue = getCellFormatValue(cell);
System.out.print(cellValue + "\t\t");
}
System.out.println();
}
}
/**
* 根据HSSFCell类型设置数据
*
* @param cell
* @return
*/
private static String getCellFormatValue(Cell cell) {
String cellvalue = "";
if (cell != null) {
// 判断当前Cell的Type
switch (cell.getCellType()) {
// 如果当前Cell的Type为NUMERIC
case HSSFCell.CELL_TYPE_FORMULA: {
// 判断当前的cell是否为Date
if (HSSFDateUtil.isCellDateFormatted(cell)) {
// 如果是Date类型则,转化为Data格式
Date date = cell.getDateCellValue();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
cellvalue = sdf.format(date);
} else {
// 如果是纯数字
// 取得当前Cell的数值
BigDecimal big = new BigDecimal(cell.getNumericCellValue());
cellvalue = String.valueOf(big.longValue());
}
break;
}
case HSSFCell.CELL_TYPE_NUMERIC: {
// 假设为日期型
Date date = cell.getDateCellValue();
Calendar c = Calendar.getInstance();
c.setTime(date);
if (c.get(Calendar.YEAR) > 1900
&& String.valueOf(c.get(Calendar.YEAR)).length() == 4) {
// 如果年大于1900且年的长度等于4,此处是不严格的处理,当年度为1900时,就会出错,目前没有找到更好的解决办法
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
cellvalue = sdf.format(date);
} else {
cellvalue = String.valueOf(cell.getNumericCellValue());
if (!cellvalue.matches("\\d+\\.\\d+")) {
// 如果不是double,则转一下
BigDecimal big = new BigDecimal(
cell.getNumericCellValue());
cellvalue = String.valueOf(big.longValue());
}
// 如果是double,返回结果。
}
break;
}
// 如果当前Cell的Type为STRIN
case HSSFCell.CELL_TYPE_STRING:
// 取得当前的Cell字符串
cellvalue = cell.getRichStringCellValue().getString();
break;
// 默认的Cell值
default:
cellvalue = " ";
}
} else {
cellvalue = "";
}
return cellvalue;
}
}
getCellFormatValue方法应该为一个较为通用的方法,可写在工具类中。
代码比较简单,不再赘述。