许多系统都有数据导出的功能,大多数是导出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对象中获取行对象,由行对象获取列对象,在指定的列对象中写入、读取数据。