JAVA开发常用类库--Excel读写库

Excel是我们平时工作中比较常用的用于存储二维表数据的,JAVA也可以直接对Excel进行操作,在这篇博客中将为大家介绍两种操作Excel的方式,分别为:jxl和poi。

对于两者的区别网上有测试如下:

logo

在小数据量时jxl快于poi,在大数据量时poi要快于jxl。但差距都不明显。

jxl

jxl.jar是通过java操作excel表格的工具类库;

在开始进行Java读写Excel前,我们需要先下一个jxl的jar包,这个jar包中提供了相关读写Excel的方法,在百度里所搜一下jxl.jar下载就会出现很多下载地址了,这里不再累述。随后我们将jxl.jar放到classpath下或者在工程的buildpath中添加jxl.jar后,便可以开始Java读写Excel的神秘之旅了。

通过模拟实现创建一个表格,然后模拟添加到表格中数据,实际开发过程中都是通过从数据库导入到表格中的数据:

写xls/xlsx

package com.bie;

import java.io.File;
import java.io.IOException;

import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;

/** 
 * @author BieHongLi 
 * @version 创建时间:2017年3月3日 下午4:03:18 
 * 创建excel表格
 */
public class CreateExcel {

    public static void main(String[] args) 
            throws IOException, RowsExceededException, WriteException {
        //1:创建excel文件
        File file=new File("test.xls");
        file.createNewFile();

        //2:创建工作簿
        WritableWorkbook workbook=Workbook.createWorkbook(file);
        //3:创建sheet,设置第二三四..个sheet,依次类推即可
        WritableSheet sheet=workbook.createSheet("用户管理", 0);
        //4:设置titles
        String[] titles={"编号","账号","密码"};
        //5:单元格
        Label label=null;
        //6:给第一行设置列名
        for(int i=0;i<titles.length;i++){
            //x,y,第一行的列名
            label=new Label(i,0,titles[i]);
            //7:添加单元格
            sheet.addCell(label);
        }
        //8:模拟数据库导入数据
        for(int i=1;i<10;i++){
            //添加编号,第二行第一列
            label=new Label(0,i,i+"");
            sheet.addCell(label);

            //添加账号
            label=new Label(1,i,"10010"+i);
            sheet.addCell(label);

            //添加密码
            label=new Label(2,i,"123456");
            sheet.addCell(label);
        }

        //写入数据,一定记得写入数据,不然你都开始怀疑世界了,excel里面啥都没有
        workbook.write();
        //最后一步,关闭工作簿
        workbook.close();
    }
}

读取excel表格里面的数据,案例如下所示:

读xls/xlsx

package com.bie;

import java.io.File;

import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;

/** 
 * @author BieHongLi 
 * @version 创建时间:2017年3月3日 下午5:28:53 
 * 读取excel的表格的数据
 */
public class ReadExcel {

    public static void main(String[] args) throws Exception{
        //1:创建workbook
        Workbook workbook=Workbook.getWorkbook(new File("test.xls")); 
        //2:获取第一个工作表sheet
        Sheet sheet=workbook.getSheet(0);
        //3:获取数据
        System.out.println("行:"+sheet.getRows());
        System.out.println("列:"+sheet.getColumns());
        for(int i=0;i<sheet.getRows();i++){
            for(int j=0;j<sheet.getColumns();j++){
                Cell cell=sheet.getCell(j,i);
                System.out.print(cell.getContents()+" ");
            }
            System.out.println();
        }

        //最后一步:关闭资源
        workbook.close();
    }


}

poi

工作中经常需要对Excel进行读写操作,java操作excel文件比较流行的是apache poi包,excel分为xls(2003)和xlsx(2007)两种格式,操作这两种格式的excel需要不同的poi包。

注意别弄混

xls格式

<dependency>
     <groupId>org.apache.poi</groupId>
     <artifactId>poi</artifactId>
     <version>3.11-beta1</version>
</dependency>

xlsx格式

<dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi-ooxml</artifactId>
      <version>3.11-beta1</version>
</dependency>

读xls

File file = new File("src/test/resources/test.xls");
POIFSFileSystem poifsFileSystem = new POIFSFileSystem(new FileInputStream(file));
HSSFWorkbook hssfWorkbook =  new HSSFWorkbook(poifsFileSystem);
HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(0);

int rowstart = hssfSheet.getFirstRowNum();
int rowEnd = hssfSheet.getLastRowNum();
for(int i=rowstart;i<=rowEnd;i++)
{
    HSSFRow row = hssfSheet.getRow(i);
    if(null == row) continue;
    int cellStart = row.getFirstCellNum();
    int cellEnd = row.getLastCellNum();

    for(int k=cellStart;k<=cellEnd;k++)
    {
        HSSFCell cell = row.getCell(k);
        if(null==cell) continue;
        System.out.print("" + k + "  ");
        //System.out.print("type:"+cell.getCellType());

        switch (cell.getCellType())
        {
            case HSSFCell.CELL_TYPE_NUMERIC: // 数字
                            System.out.print(cell.getNumericCellValue()
                        + "   ");
                break;
            case HSSFCell.CELL_TYPE_STRING: // 字符串
                System.out.print(cell.getStringCellValue()
                        + "   ");
                break;
            case HSSFCell.CELL_TYPE_BOOLEAN: // Boolean
                System.out.println(cell.getBooleanCellValue()
                        + "   ");
                break;
            case HSSFCell.CELL_TYPE_FORMULA: // 公式
                System.out.print(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;
        }

    }
    System.out.print("\n");
}

读xlsx

File file = new File("src/test/resources/test.xlsx");

XSSFWorkbook xssfWorkbook = new XSSFWorkbook(file);
XSSFSheet xssfSheet = xssfWorkbook.getSheetAt(0);

int rowstart = xssfSheet.getFirstRowNum();
int rowEnd = xssfSheet.getLastRowNum();
for(int i=rowstart;i<=rowEnd;i++)
{
    XSSFRow row = xssfSheet.getRow(i);
    if(null == row) continue;
    int cellStart = row.getFirstCellNum();
    int cellEnd = row.getLastCellNum();

    for(int k=cellStart;k<=cellEnd;k++)
    {
        XSSFCell cell = row.getCell(k);
        if(null==cell) continue;

        switch (cell.getCellType())
        {
            case HSSFCell.CELL_TYPE_NUMERIC: // 数字
                System.out.print(cell.getNumericCellValue()
                        + "   ");
                break;
            case HSSFCell.CELL_TYPE_STRING: // 字符串
                System.out.print(cell.getStringCellValue()
                        + "   ");
                break;
            case HSSFCell.CELL_TYPE_BOOLEAN: // Boolean
                System.out.println(cell.getBooleanCellValue()
                        + "   ");
                break;
            case HSSFCell.CELL_TYPE_FORMULA: // 公式
                System.out.print(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;
        }

    }
    System.out.print("\n");
}

写xls

HSSFWorkbook workbook = null;
workbook = new HSSFWorkbook();
//获取参数个数作为excel列数
int columeCount = 6;
//获取List size作为excel行数
int rowCount = 20;
HSSFSheet sheet = workbook.createSheet("sheet name");
//创建第一栏
HSSFRow headRow = sheet.createRow(0);
String[] titleArray = {"id", "name", "age", "email", "address", "phone"};
for(int m=0;m<=columeCount-1;m++)
{
    HSSFCell cell = headRow.createCell(m);
    cell.setCellType(HSSFCell.CELL_TYPE_STRING);
    sheet.setColumnWidth(m, 6000);
    HSSFCellStyle style = workbook.createCellStyle();
    HSSFFont font = workbook.createFont();
    font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
    short color = HSSFColor.RED.index;
    font.setColor(color);
    style.setFont(font);
    //填写数据
    cell.setCellStyle(style);
    cell.setCellValue(titleArray[m]);

}
int index = 0;
//写入数据
for(RowEntity entity : pRowEntityList)
{
    //logger.info("写入一行");
    HSSFRow row = sheet.createRow(index+1);
    for(int n=0;n<=columeCount-1;n++)
        row.createCell(n);
    row.getCell(0).setCellValue(entity.getId());
    row.getCell(1).setCellValue(entity.getName());
    row.getCell(2).setCellValue(entity.getAge());
    row.getCell(3).setCellValue(entity.getEmail());
    row.getCell(4).setCellValue(entity.getAddress());
    row.getCell(5).setCellValue(entity.getPhone());
    index++;
}

//写到磁盘上
try {
    FileOutputStream fileOutputStream = new FileOutputStream(new File(path));
    workbook.write(fileOutputStream);
    fileOutputStream.close();
} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

写xlsx

和写xls类似,使用2007对应的对象即可。

参考代码:

http://blog.csdn.net/Augus6/article/details/51463478
https://www.cnblogs.com/wangyang108/p/6030420.html
http://blog.csdn.net/a214919447/article/details/54601237

坚持原创技术分享,您的支持将鼓励我继续创作!
+