许多系统都有数据导出的功能,大多数是导出excel文件,比如对一些报表、采购单等等。最近也是被师傅要求,对公司产品做excel导出功能,所以学习了一下java如何操作excel。下面是我用javase写的两个简单的demo,分别对应JXL方式和POI方式。
一、准备工作
demo对应jar包:jxl-2.6.jar、poi-4.0.0.jar
二、jxl方式操作excel
package excel.jxl;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;
/**
* jxl方式操作excel
* @author admin
*
*/
public class JxlExcelDemo {
public static void main(String[] args) throws RowsExceededException, WriteException, IOException, BiffException {
JxlExcelDemo demo = new JxlExcelDemo();
// 写入内容
// demo.jxlWriteExcel();
// 读取内容
demo.jxlReadExcel();
}
/**
* jxl方式对excel文件写入
* @throws IOException
* @throws RowsExceededException
* @throws WriteException
*/
public void jxlWriteExcel() throws IOException, RowsExceededException, WriteException {
// 创建文件
File jxlFile = new File("src/excel/jxl/jxl.xls");
// 获得WritableWorkbook对象
WritableWorkbook wb = Workbook.createWorkbook(jxlFile);
// 获得工作簿
WritableSheet sheet = wb.createSheet("sheet", 0);
// 对工作簿单元格赋值
for (int row = 0; row < 10; row++) {
for (int col = 0; col < 10; col++) {
sheet.addCell(new Label(col, row, "test" + row + col));
}
}
// 将WritableWorkbook对象内容写入文件
wb.write();
wb.close();
}
/**
* jxl方式对excel文件读取
* @throws BiffException
* @throws FileNotFoundException
* @throws IOException
*/
public void jxlReadExcel() throws BiffException, FileNotFoundException, IOException {
// 获得Workbook对象
Workbook wb = Workbook.getWorkbook(new FileInputStream(new File("src/excel/jxl/jxl.xls")));
// 获得所有的工作簿
Sheet[] sheets = wb.getSheets();
if(sheets != null) {
for (Sheet sheet : sheets) {
// 获取工作簿的行数
int rows = sheet.getRows();
// 获取工作簿的列数
int cols = sheet.getColumns();
for(int row = 0; row < rows; row++) {
for (int col = 0; col < cols; col++) {
String contents = sheet.getCell(col, row).getContents();
System.out.printf(contents + " ");
}
System.out.println();
}
}
}
wb.close();
}
}
三、poi方式操作excel
package excel.poi;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
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;
public class PoiExcelDemo {
public static void main(String[] args) throws IOException {
PoiExcelDemo demo = new PoiExcelDemo();
// 写入内容
// demo.poiWriteExcel();
// 读取内容
demo.poiReadExcel();
}
/**
* poi方式对excel文件写入
* @throws IOException
*/
public void poiWriteExcel() throws IOException {
// 创建HSSFWorkbook对象
HSSFWorkbook wb = new HSSFWorkbook();
// 创建工作簿
HSSFSheet sheet = wb.createSheet("sheet");
// 为工作簿创建行
for (int row = 0; row < 10; row++) {
HSSFRow r = sheet.createRow(row);
// 在工作簿的行中创建列
for (int col = 0; col < 10; col++) {
r.createCell(col).setCellValue("test" + row + col);
}
}
// 获取文件输出流
FileOutputStream fos = new FileOutputStream(new File("src/excel/poi/poi.xls")) ;
// 将wb对象中的内容写入文件
wb.write(fos);
fos.close();
wb.close();
}
/**
* poi方式对excel文件读取
* @throws IOException
*/
public void poiReadExcel() throws IOException {
// 获取文件
POIFSFileSystem pfs = new POIFSFileSystem(new File("src/excel/poi/poi.xls"));
// 获取wb对象
HSSFWorkbook wb = new HSSFWorkbook(pfs);
// 获取excel所有工作簿
int sheets = wb.getNumberOfSheets();
for (int index = 0; index < sheets; index++) {
// 获取指定工作簿
HSSFSheet sheet = wb.getSheetAt(index);
// 获取指定工作簿所有行
int rows = sheet.getPhysicalNumberOfRows();
// 获取指定工作簿首行列数
HSSFRow firstRow = sheet.getRow(0);
if(firstRow == null) {
continue;
}
int cols = firstRow.getPhysicalNumberOfCells();
for (int row = 0; row < rows; row++) {
// 获取工作簿指定行信息
HSSFRow r = sheet.getRow(row);
for (int col = 0; col < cols; col++) {
// 获取工作簿指定行指定列数据
String value = r.getCell(col).getStringCellValue();
System.out.print(value + " ");
}
System.out.println();
}
}
pfs.close();
wb.close();
}
}
四、总结
通过这两个demo做下简单的总结:
jxl方式是对excel的整个sheet做操作,在sheet对象中在对应行、列的单元格中写入、读取数据;
poi方式是对excel的行、列做操作,在sheet对象中获取行对象,由行对象获取列对象,在指定的列对象中写入、读取数据。