好久没有写文章了,应该多动手写写才对,今天帮一同学处理excel数据,需求是将一种格式的数据转换成另外一种格式。所以涉及到对excel数据的读写,然后对excel读写,一般使用Apache POI - the Java API for Microsoft Documents http://poi.apache.org/ ,POI还是挺强大的,不仅仅可以读写数据,还可以设置格式。本文主要讲读写,格式就没多写了,样式主要使用 HSSFCellStyle、HSSFFont等类。POI的主要类有:HSSFWorkbook 工作本, HSSFSheet工作表, HSSFRow行, HSSFCell列。然后文件流类主要有:FileInputStream,FileOutputStream类。
POI结构:
HSSF - 提供读写Microsoft Excel XLS格式档案的功能。
XSSF - 提供读写Microsoft Excel OOXML XLSX格式档案的功能。
HWPF - 提供读写Microsoft Word DOC格式档案的功能。
HSLF - 提供读写Microsoft PowerPoint格式档案的功能。
HDGF - 提供读Microsoft Visio格式档案的功能。
HPBF - 提供读Microsoft Publisher格式档案的功能。
HSMF - 提供读Microsoft Outlook格式档案的功能。
好,给出我们的demo。
第一步:添加POI项目Maven依赖
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>3.9</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.9</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
第二步:编程实现
package com.figo.web.test;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.math.BigDecimal;
import org.apache.poi.hssf.usermodel.HSSFCell;
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.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
/**
* 功能:从test.xls读取数据写入到testNew.xls
* @author figo.zhu
* @version $Id: Exceltest.java, v 0.1 2013-6-27 下午2:21:55 figo.zhu Exp $
*/
public class Exceltest {
/**
*
* @param
*/
public static void main(String[] args) {
HSSFWorkbook wwb = new HSSFWorkbook();
//创建Excel工作表 指定名称
HSSFSheet currSheet = wwb.createSheet("testNew");
//创建第一行
HSSFRow row0 = currSheet.createRow(0);
HSSFCell cell1 = row0.createCell(0);
cell1.setCellValue("客戶");
HSSFCell cell2 = row0.createCell(1);
cell2.setCellValue("款号");
HSSFCell cell3 = row0.createCell(2);
cell3.setCellValue("数量");
HSSFWorkbook workbook = null;
try {
//需要输出的excel
FileOutputStream fos = new FileOutputStream("d:/testNew.xls");
POIFSFileSystem ins = null;
//这是需要读取的excel
ins = new POIFSFileSystem(new FileInputStream("d:\\test.xls"));
// 创建对Excel工作簿文件的引用
workbook = new HSSFWorkbook(ins);
Sheet childSheet = null;
// try {
// workbook = new XSSFWorkbook(is);//excel2003
//
//
// } catch (Exception ex) {
// workbook = new HSSFWorkbook(is);//excel2007
//
// }
//获取第二张表上的数据
childSheet = workbook.getSheetAt(1);
int rowCount = childSheet.getLastRowNum() + 1;
System.out.println("有行数" + rowCount);
Row row1 = childSheet.getRow(0);
int columnCount = row1.getLastCellNum() + 1;
for (int k = 2; k < columnCount; k++) {
Cell cell = row1.getCell(k);
String cellValue = getCellValue(cell);// 属性值
if ("".equals(cellValue)) {
break;
}
for (int rowNum = 1; rowNum < rowCount; rowNum++) {
HSSFRow row = null;
if (k == 2) {
row = currSheet.createRow(rowNum);//创建新行 第一行是标题
} else {
row = currSheet.createRow((rowCount-1) * (k - 2) + rowNum);//创建新行
}
Row rowData = childSheet.getRow(rowNum);
HSSFCell cellNew1 = row.createCell(0);
if (rowNum == 1) {
cellNew1.setCellValue(cellValue);
} else {
cellNew1.setCellValue("");
}
HSSFCell cellNew2 = row.createCell(1);
String cellValue2 = getCellValue(rowData.getCell(0));// 属性值
cellNew2.setCellValue(cellValue2);
HSSFCell cellNew3 = row.createCell(2);
String cellValue3 = getCellValue(rowData.getCell(k));// 属性值
cellNew3.setCellValue(cellValue3);
}
}
//写入工作表
wwb.write(fos);
if (fos != null) {//关闭输出流POI不负责关闭
fos.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取列的值
*
* @param cell
* @return
*/
private static String getCellValue(Cell cell) {
String cellValue = "";
if (null != cell) {
switch (cell.getCellType()) {
case HSSFCell.CELL_TYPE_NUMERIC: // 数字
cellValue = new BigDecimal(cell.getNumericCellValue()).toPlainString();
break;
case HSSFCell.CELL_TYPE_STRING: // 字符串
cellValue = String.valueOf(cell.getStringCellValue());
break;
case HSSFCell.CELL_TYPE_BOOLEAN: // Boolean
cellValue = String.valueOf(cell.getBooleanCellValue());
break;
case HSSFCell.CELL_TYPE_FORMULA: // 公式
cellValue = String.valueOf(cell.getCellFormula());
break;
case HSSFCell.CELL_TYPE_BLANK: // 空值
System.out.println(" ");
break;
case HSSFCell.CELL_TYPE_ERROR: // 故障
System.out.println(" ");
break;
default:
System.out.print("未知类型 ");
break;
}
} else {
System.out.print("空格 ");
}
return cellValue;
}
}