JAVA读写EXCEL文件

java操纵excel文件常用的有jxlpoi两种方式

jxl:不支持.xlsx

poi:支持.xlsx    poi提供了HSSFWorkbook和XSSFWorkbook两个实现类。

HSSFWorkbook针对.xls文件

XSSFWorkbook针对.xslx文件

将数据写入Excel文件

思路:先创建一个工作簿,一个工作簿可以有多个工作表,一个工作表可以有多个行,一个行可以有多个单元格

 

public class Student 
{
	private int Id;
	private String name;
	private boolean sex;
	private int age;

    getter,setter.....
}
package com.utils;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import com.model.Student;

/**
 * 插入 Excel 工具类 
 */
public class POItoExccel 
{
	public static void toExcel(ArrayList list) throws IOException
	{
		//XSSFWorkbook 对应.xlsx文件
		//新建文档   
        XSSFWorkbook workBook=new XSSFWorkbook();
        
        //创建表
        XSSFSheet sheet=workBook.createSheet();
        
        //合并标的标题
		//四个参数分别为:起始行号,终止行号,起始列,终止列 (从零开始)
  		CellRangeAddress cra=new CellRangeAddress(0,1, 0, 3);
  		sheet.addMergedRegion(cra);
  		
  		//显示的文本为左上角的内容
  		Row row2=sheet.createRow(0);
  		Cell cell=row2.createCell(0);
  		cell.setCellValue("学生信息表");
  		
  		//设置单元格的格式
  		CellStyle cs=workBook.createCellStyle();
  		cs.setAlignment(HorizontalAlignment.CENTER);
  		cs.setVerticalAlignment(VerticalAlignment.CENTER);
  		cs.setFillBackgroundColor((short) 59);
  	    cell.setCellStyle(cs);
  		
  	    //表头
  		Row row=sheet.createRow(2);
  		
  		Cell cell11=row.createCell(0);
  		cell11.setCellValue("学号");
  		Cell cell33=row.createCell(1);
  		cell33.setCellValue("姓名");
  		Cell cell44=row.createCell(2);
  		cell44.setCellValue("性别");
  		Cell cell55=row.createCell(3);
  		cell55.setCellValue("年龄");
           
  	    //表中的数据
  		for(int i=0;i
package com.test;

import java.io.IOException;
import java.util.ArrayList;


import com.model.Student;
import com.utils.POItoExccel;

public class test {

	public static void main(String[] args) throws IOException 
	{
		//准备数据
		Student stu1 = new Student(20171001,"李白",false,20);
		Student stu2 = new Student(20171002,"杜甫",false,21);
		Student stu3 = new Student(20171003,"岑参",false,22);
		Student stu4 = new Student(20171004,"陶渊明",false,23);
		Student stu5 = new Student(20171005,"李商隐",false,24);
		
		//将数据存入一个list
		ArrayList list = new ArrayList<>();
		list.add(stu1);
		list.add(stu2);
		list.add(stu3);
		list.add(stu4);
		list.add(stu5);
		
		//遍历
		for(Student s : list)
		{
			System.out.println(s);
		}
		
		//存入excel
		POItoExccel.toExcel(list);
	}


}

输出结果

Student [Id=20171001, name=李白, sex=false, age=20]
Student [Id=20171002, name=杜甫, sex=false, age=21]
Student [Id=20171003, name=岑参, sex=false, age=22]
Student [Id=20171004, name=陶渊明, sex=false, age=23]
Student [Id=20171005, name=李商隐, sex=false, age=24]
存入Excel成功  , 文件位置是  D:\stu.xlsx

JAVA读写EXCEL文件_第1张图片

 

将数据从excel里面读取出来

package com.utils;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.text.DecimalFormat;

import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFDataFormat;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;


public class POIFromExcel 
{
	public static void fromExcel(String path) throws IOException
	{
		File file = new File(path);
		InputStream inputStream = new FileInputStream(file);
		XSSFWorkbook workBook = new XSSFWorkbook(inputStream);
		
		//读取第一个工作表
		XSSFSheet sheet = workBook.getSheetAt(0);
        
		//获取最后一行的num,即总行数。此处从0开始计数
		int maxRow = sheet.getLastRowNum();
		System.out.println("总行数为:" + maxRow);
		
		
		for (int row = 2; row <= maxRow; row++) 
		{
			//获取最后单元格num,即总单元格数  注意:此处从1开始计数
			int maxRol = sheet.getRow(row).getLastCellNum();
//			System.out.println("总列数为: "+maxRol);

//			System.out.println("第" + row + "行的数据如下");
		    for (int rol = 0; rol < maxRol; rol++)
		    {
		    	System.out.print(sheet.getRow(row).getCell(rol) + " ");
		    }
		    System.out.println();
		}
	}
}

输出结果

总行数为:7
学号 姓名 性别 年龄 
2.0171001E7 李白 FALSE 20.0 
2.0171002E7 杜甫 FALSE 21.0 
2.0171003E7 岑参 FALSE 22.0 
2.0171004E7 陶渊明 FALSE 23.0 
2.0171005E7 李商隐 FALSE 24.0 

我们看输出结果会发现是一科学计算的结果显示

这是因为使用POI处理excel的时候,遇到了比较长的数字,虽然excel里面设置该单元格是文本类型的,但是POI的cell的类型就会变成数字类型。 而且无论数字是否小数,使用cell.getNumbericCellValue() 去获取值的时候,会得到一个double,而且当长度大一点的时候会变成科学计数法形式。 

我的解决办法是

		for(int i=3;i<=maxRow;i++)
		{
			//解决读出来的数据是科学计数法
			DecimalFormat df = new DecimalFormat("0");
			XSSFCell cell = sheet.getRow(i).getCell(0);
			String stuId = df.format(cell.getNumericCellValue());  
			
			System.out.println(stuId);
		}

选取的学号进行测试 

输出结果

20171001
20171002
20171003
20171004
20171005

 

 

读取文件参考的这篇文章:

https://www.jb51.net/article/168925.htm 

 


 

 

 

 

 

 

你可能感兴趣的:(java基础)