Java用XSSFWorkbook实现excel简单读写
一、概述
二、所需的jar
三、XSSFWorkbook的使用方法
四、源代码
一、概述
Apache POI是 Java 程序员用来处理 MS Office 文件的常用开源库。由 Apache 软件基金会开发,使用 Java 分布式设计或修改 Microsoft Office 文件,包含一系列类和方法对用户输入数据或文件进行编码和解码。其中 POI-HSSF 和 POI-XSSF 是用来处理 excel 文件的组件,前者对应 97~2007版本的文件格式(.xls), 后者对应07以后的格式(.xlsx),更多关于 POI 的介绍请访问官方主页。
个人觉得 POI 对 office 的对象进行了很好的抽象设计,因此学习起来比较平滑。在阅读学习的同时打开excel进行同步操作,你会感觉到使用 POI 和使用 office 一样简单。
二、所需的jar
进行操作之前,先用maven等工具导入依赖包,或者手动下载jar导入classpath
org.apache.poi 3.14
三、XSSFWorkbook的使用方法
// 07之前版本
Workbook wb = new HSSFWorkbook();
FileOutputStream fileOut = new FileOutputStream(“workbook.xls”);
wb.write(fileOut);
fileOut.close();
// 07之后版本 Workbook wb = new XSSFWorkbook();
FileOutputStream fileOut = new FileOutputStream(“workbook.xlsx”);
wb.write(fileOut);
fileOut.close();
**注:我用的是07之后版本 **
// wb 可以是上述创建的两个对象之一
Sheet sheet = wb.createSheet(); Sheet sheet =
wb.createSheet(“库存”);
// 1. 首先创建行,声明行的索引,从0开始。
Row row = sheet.createRow(0);
四、源代码
实体类:
private int index;
private String name;
private String age;
private String brithday;
public ExcelInfo() {
}
public ExcelInfo(int index, String name, String age, String brithday) {
this.index = index;
this.name = name;
this.age = age;
this.brithday = brithday;
}
//省略get/set方法
@Override
public String toString() {
return "第" + index + "行的数据如:姓名:" + name + ",年龄:" + age + ",生日:" + brithday ;
}
导出Excel类:
public static void main(String[] args) {
List<ExcelInfo> list = new ArrayList<ExcelInfo>();
list.add(new ExcelInfo(1, "石头", "24", "6/12"));
list.add(new ExcelInfo(2, "火男", "25", "6/13"));
list.add(new ExcelInfo(3, "火女", "26", "6/14"));
list.add(new ExcelInfo(4, "武器", "27", "6/15"));
list.add(new ExcelInfo(5, "提莫", "28", "6/16"));
excelExp("D:\\eclipse-project\\javaweb\\AccessTest\\excel\\result.xlsx", list);
}
public static void excelExp(String filePath, List<ExcelInfo> list) {
Workbook wb = null;
OutputStream out = null;
try {
wb = new XSSFWorkbook();
Sheet sheet = wb.createSheet("联系表"); //重命名sheet1的工作表名
Row r = sheet.createRow(0); //0 表示 第一行
r.createCell(0).setCellValue("姓名");
r.createCell(1).setCellValue("年龄");
r.createCell(2).setCellValue("生日"); //给表头定义字段名
for (ExcelInfo user : list) {
r = sheet.createRow(user.getIndex()); //按照对象的index对应第几行
r.createCell(0).setCellValue(user.getName());
r.createCell(1).setCellValue(user.getAge());
r.createCell(2).setCellValue(user.getDate());
}
out = new FileOutputStream(filePath); // 字节输出流
wb.write(out); //导出excel
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
准备被读入的excel内容如下:
控制台输出如下图:
注:输出形式是根据toString()形式输出,可以改为自己喜欢的方式,请修改实体类中的toString()。
读入类
public static void main(String[] args) throws IOException {
List list = importExcel(“D:\eclipse-project\javaweb\AccessTest\excel\test.xlsx”);
for (ExcelInfo excelInfo : list) {
System.out.println(excelInfo);
}
}
public static List<ExcelInfo> importExcel(String file) throws IOException {
FileInputStream in = null;
List<ExcelInfo> result = null;
try {
in = new FileInputStream(file);
result = new ArrayList<ExcelInfo>();
Workbook wb = new XSSFWorkbook(in); //基于文件字节输入流 创建工作簿对象
Sheet sheet = wb.getSheetAt(0); // sheetIndex 表示 第一个工作表
for (Row row : sheet) {
if (row.getRowNum() < 1) { //因为第一行是一些字段名,此行不获取字符串
continue;
}
String cellValue = new String(); //用来赋值,取格式化后的日期字符串
ExcelInfo eInfo = new ExcelInfo();
eInfo.setIndex(row.getRowNum());
eInfo.setName(row.getCell(0).getStringCellValue()); //获取第一列单元表格的数据值
row.getCell(1).setCellType(Cell.CELL_TYPE_STRING); //因为年龄的数据值是一个数值,所以需要进行转字符串,否则报异常
eInfo.setAge(row.getCell(1).getStringCellValue());
SimpleDateFormat formatter = new SimpleDateFormat("MM-dd"); //定义时间格式化对象
Date dateCell = row.getCell(2).getDateCellValue(); //
cellValue = formatter.format(dateCell);//进行日期格式化
eInfo.setBrithday(cellValue);
result.add(eInfo);
}
wb.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
in.close();
}
return result;
}
导出的excel内容如下图
补充:
如果你是用request 接收,写法如下:
// 转换request,解析出request中的文件
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
// 获取文件map集合
Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
MultipartFile file = entity.getValue();
// 创建workbook
XSSFWorkbook wb = new XSSFWorkbook(file.getInputStream());
Sheet xssfSheet = wb.get(0);
//循环取每行的数据
for (int rowIndex = 1; rowIndex < xssfSheet.getPhysicalNumberOfRows(); rowIndex++) {
XSSFRow xssfRow = xssfSheet.getRow(rowIndex);
if (xssfRow == null) {
continue;
}
//循环取每个单元格(cell)的数据
for (int cellIndex = 0; cellIndex < xssfRow.getPhysicalNumberOfCells(); cellIndex++) {
}
// 这里说下获取不同类型的值:
① 获取String 类型
cell.setCellType(Cell.CELL_TYPE_STRING);
String a = cell.getStringCellValue();
② 获取 日期类型,实体类为Date类型,要求格式yyyy-MM-dd
double value = cell.getNumericCellValue();
if(0.0!=value){
Date d = org.apache.poi.ss.usermodel.DateUtil.getJavaDate(value);
SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd");
String dateStr = f.format(d);
Date date = sdf.parse(dateStr);
}
③ 获取BigDecimal类型
cell.setCellType(Cell.CELL_TYPE_STRING);
new BigDecimal(cell.getStringCellValue());
}
}
原文链接:https://blog.csdn.net/qq_35525955/article/details/80904844