Java POI 操作Excel

apache.org提供了一个项目(poi)专门用于对办公软件的操作。这样大大方便了我们操作和读取其中的内容,用于统计分析。版本为poi-bin-3.7-20101029.zip
Component APIs
Excel (SS=HSSF+XSSF)
Word (HWPF+XWPF)
PowerPoint (HSLF+XSLF)
OpenXML4J (OOXML)
OLE2 Filesystem (POIFS)
OLE2 Document Props (HPSF)
Outlook (HSMF)
Visio (HDGF)
Publisher (HPBF)



在文档中提供了2种不同的写入方法,一个是老代码,一个是新代码。如果你希望能够兼容xls文件和xslx文件,那么建议用新代码。且老代码对office2007的操作不是很好。

代码如下:

public static void main(String[] args)throws Exception {
HSSFWorkbook wb = new HSSFWorkbook();
// create a new sheet 创建一个新表
HSSFSheet s = wb.createSheet();
// declare a row object reference 声明一个新行
HSSFRow r = null;
// declare a cell object reference 声明一个单元格
HSSFCell c = null;
// create 2 cell styles 创建2个单元格样式
HSSFCellStyle cs = wb.createCellStyle();
HSSFCellStyle cs2 = wb.createCellStyle();
HSSFDataFormat df = wb.createDataFormat();

// create 2 fonts objects 创建2个单元格字体
HSSFFont f = wb.createFont();
HSSFFont f2 = wb.createFont();

// Set font 1 to 12 point type, blue and bold 设置字体类型1到12号,蓝色和粗体
f.setFontHeightInPoints((short) 12);
f.setColor( HSSFColor.RED.index );
f.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);

// Set font 2 to 10 point type, red and bold 设置字体类型2到10号,红色和粗体
f2.setFontHeightInPoints((short) 10);
f2.setColor( HSSFColor.RED.index);
f2.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);

// Set cell style and formatting 设置单元格样式和格式
cs.setFont(f);
cs.setDataFormat(df.getFormat("#,##0.0"));

// Set the other cell style and formatting 设置其他单元格样式和格式
cs2.setBorderBottom(cs2.BORDER_THIN);
cs2.setDataFormat(HSSFDataFormat.getBuiltinFormat("text"));
cs2.setFont(f2);


// Define a few rows 定义一个新行
for(short rownum = (short)0; rownum < 30; rownum++) {
r = s.createRow(rownum);
for(short cellnum = (short)0; cellnum < 10; cellnum += 2) {
c = r.createCell(cellnum);
HSSFCell c2 = r.createCell(cellnum+1);

c.setCellValue((double)rownum + (cellnum/10));
c2.setCellValue(new HSSFRichTextString("Hello! " + cellnum));
}
}

// Save保存
FileOutputStream out = new FileOutputStream("d://workbook.xls");
wb.write(out);
out.close();

}

---------------------------------------------------------------------------------------------------------

public static void main(String[] args) throws Exception {
Workbook[] wbs = new Workbook[] { new HSSFWorkbook(),
new XSSFWorkbook() };
for (int i = 0; i < wbs.length; i++) {
Workbook wb = wbs[i];
CreationHelper createHelper = wb.getCreationHelper();

// create a new sheet 创建一个新表
Sheet s = wb.createSheet();
// declare a row object reference 声明一个对象的引用行
Row r = null;
// declare a cell object reference 声明对象的引用单元格
Cell c = null;
// create 2 cell styles 创建2单元格样式
CellStyle cs = wb.createCellStyle();
CellStyle cs2 = wb.createCellStyle();
DataFormat df = wb.createDataFormat();

// create 2 fonts objects 创建2字体对象
Font f = wb.createFont();
Font f2 = wb.createFont();

// Set font 1 to 12 point type, blue and bold 设置字体1至12点类型,蓝色和粗体
f.setFontHeightInPoints((short) 12);
f.setColor(IndexedColors.RED.getIndex());
f.setBoldweight(Font.BOLDWEIGHT_BOLD);

// Set font 2 to 10 point type, red and bold 设置字体2至10点类型,红色和粗体
f2.setFontHeightInPoints((short) 10);
f2.setColor(IndexedColors.RED.getIndex());
f2.setBoldweight(Font.BOLDWEIGHT_BOLD);

// Set cell style and formatting 设置单元格样式和格式
cs.setFont(f);
cs.setDataFormat(df.getFormat("#,##0.0"));

// Set the other cell style and formatting 设置其他单元格样式和格式
cs2.setBorderBottom(cs2.BORDER_THIN);
cs2.setDataFormat(df.getFormat("text"));
cs2.setFont(f2);

// Define a few rows 定义几行
for (int rownum = 0; rownum < 30; rownum++) {
r = s.createRow(rownum);
for (int cellnum = 0; cellnum < 10; cellnum += 2) {
c = r.createCell(cellnum);
Cell c2 = r.createCell(cellnum + 1);

c.setCellValue((double) rownum + (cellnum / 10));
c2.setCellValue(createHelper.createRichTextString("Hello! "
+ cellnum));
}
}

// Save 保存
String filename = "d://workbook.xls";
if (wb instanceof XSSFWorkbook) {
filename = filename + "x";
}

FileOutputStream out = new FileOutputStream(filename);
wb.write(out);
out.close();
}

}
---------------------------------------------------------------------------------------------------------

java读取Excel,同时兼容2003及以前版本和2007版本:

public class PoiReadExcel {

public void readExcel(String filePath) {

try {

Workbook workBook = null;
try {
workBook = new XSSFWorkbook(filePath); //支持2007
} catch (Exception ex) {
workBook = new HSSFWorkbook(new FileInputStream(filePath)); //支持2003及以前
}

// 获得Excel中工作表个数
System.out.println("工作表个数 :" + workBook.getNumberOfSheets());

//循环每个工作表
for (int i = 0; i < workBook.getNumberOfSheets(); i++) {
// 创建工作表
Sheet sheet = workBook.getSheetAt(i);

int rows = sheet.getPhysicalNumberOfRows(); // 获得行数
if (rows > 0) {
sheet.getMargin(Sheet.TopMargin);
for (int r = 0; r < rows; r++) { // 行循环
Row row = sheet.getRow(r);
if (row != null) {

int cells = row.getLastCellNum();// 获得列数
for (short c = 0; c < cells; c++) { // 列循环
Cell cell = row.getCell(c);

if (cell != null) {
String value = getValue(cell);
System.out.println("第" + r + "行 " + "第" + c
+ "列:" + value);
}
}
}
}
}

// 查询合并的单元格
for (i = 0; i < sheet.getNumMergedRegions(); i++) {
System.out.println("第" + i + "个合并单元格");
CellRangeAddress region = sheet.getMergedRegion(i);
int row = region.getLastRow() - region.getFirstRow() + 1;
int col = region.getLastColumn() - region.getFirstColumn() + 1;
System.out.println("起始行:" + region.getFirstRow());
System.out.println("起始列:" + region.getFirstColumn());
System.out.println("所占行:" + row);
System.out.println("所占列:" + col);
}
}

} catch (Exception ex) {
ex.printStackTrace();
}
}

public String getValue(Cell cell) {

String value = "";
switch (cell.getCellType()) {

case Cell.CELL_TYPE_NUMERIC: // 数值型
if (DateUtil.isCellDateFormatted(cell)) {
// 如果是date类型则 ,获取该cell的date值
value = DateUtil.getJavaDate(cell.getNumericCellValue()).toString();
} else {// 纯数字
value = String.valueOf(cell.getNumericCellValue());
}
break;
/* 此行表示单元格的内容为string类型 */
case Cell.CELL_TYPE_STRING: // 字符串型
value = cell.getRichStringCellValue().toString();
break;
case Cell.CELL_TYPE_FORMULA:// 公式型
// 读公式计算值
value = String.valueOf(cell.getNumericCellValue());
if (value.equals("NaN")) {// 如果获取的数据值为非法值,则转换为获取字符串
value = cell.getRichStringCellValue().toString();
}
// cell.getCellFormula();读公式
break;
case Cell.CELL_TYPE_BOOLEAN:// 布尔
value = " "+ cell.getBooleanCellValue();
break;
/* 此行表示该单元格值为空 */
case Cell.CELL_TYPE_BLANK: // 空值
value = "";
break;
case Cell.CELL_TYPE_ERROR: // 故障
value = "";
break;
default:
value = cell.getRichStringCellValue().toString();
}

return value;
}

public static void main(String args[]) {

PoiReadExcel im = new PoiReadExcel();

im.readExcel("F:/2003.xls");
//im.readExcel("F:/2007.xlsx");
//im.readExcel("F:/2007.xls"); //2007下保存为2003

}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值