java操纵excel文件常用的有jxl和poi两种方式
jxl:不支持.xlsx
poi:支持.xlsx poi提供了HSSFWorkbook和XSSFWorkbook两个实现类。
HSSFWorkbook针对.xls文件
XSSFWorkbook针对.xslx文件
思路:先创建一个工作簿,一个工作簿可以有多个工作表,一个工作表可以有多个行,一个行可以有多个单元格
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
将数据从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