概述
在项目中遇到需要读取 Excel 中的数据 并导入 Word 中的需求,研究了一下在这里做个笔记
编写思路:
我这里使用的是 poi,其他读取 Excel 的工具也差不多都是这个思路
- 把表格想象成一个二维数组,然后逐一遍历每一个对象。
- 其实我根据感觉直接看 Excel 的格式更好理解,就是使用 Java 取出 第几行第几列的值而已 。
- 这里容易忽略的问题就是一个 Excel 文件可能会有多个页签,首先要循环页签的数量,然后在循环每一个页签中的行和列。
环境准备:
- 首先肯定是 Jar 包,我用的就是这些
- 然后创建一个 Excel,写点字
开始写代码: (后面有完整代码)
判断文件格式:
读取两种 Excel 需要用的对象是不同的(有点坑)
读取 xls格式的文件需要使用 HSSFWorkbook;
读取 xlsx 格式的文件需要使用 XSSFWorkbook;
所以需要程序员手动判断一下 ========>
//判断文件格式
private static Workbook readExcel(String filePath){
if(filePath==null){
return null;
}
String extString = filePath.substring(filePath.lastIndexOf("."));
try {
InputStream is = new FileInputStream(filePath);
if(".xls".equals(extString)){
return new HSSFWorkbook(is);
}else if(".xlsx".equals(extString)){
return new XSSFWorkbook(is);
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
获得某一个单元格的数据:
- 然后我们就可以调用一下这个方法,得到相应的对象
Workbook wb = readExcel(filePath);
- 拿到对象之后就是我们的读取操作了,首先要知道这个 Excel 到底有多少个页签
就是这个方法:wb.getNumberOfSheets();// 它是从1开始的
- 然后是知道这个页签里面一共有多少行数据
Sheet sheet = wb.getSheetAt(sheetNum);
sheet.getLastRowNum();// 它是从0开始的。
- 下一步要知道当前行有多少列
Row row = sheet.getRow(rowNum);
row.getLastCellNum(); // 它又是从1开始的
- 到这里就可以取出某一格里面的数据了
Cell cell = sheet.getRow(rowNum).getCell(cellNum);
完整代码:
import java.io.FileInputStream;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class ReadExcel {
public static void main(String[] args) {
Workbook wb = null;
Sheet sheet = null;
Row row = null;
String filePath = "F:\1.xlsx";
wb = readExcel(filePath);
if (wb != null) {
try {
List<List<List<Object>>> list = new ArrayList<>();
System.err.println("页签数量:" + wb.getNumberOfSheets());
// 循环页签
for (int sheetNum = 0; sheetNum < wb.getNumberOfSheets(); sheetNum++) {
// 指定页签的值
sheet = wb.getSheetAt(sheetNum);
// 定义存放一个页签中所有数据的List
List<List<Object>> sheetList = new ArrayList<>();
System.err.println("行总数:" + sheet.getLastRowNum());
// 循环行
for (int rowNum = 0; rowNum <= sheet.getLastRowNum(); rowNum++) {
// 指定行的值
row = sheet.getRow(rowNum);
// 定义存放一行数据的List
List<Object> rowList = new ArrayList<>();
// 循环列
System.err.println("列总数:" + row.getLastCellNum());
for (int cellNum = 0; cellNum < row.getLastCellNum(); cellNum++) {
Cell cell = sheet.getRow(rowNum).getCell(cellNum);
rowList.add(getStringCellValue(cell));
}
sheetList.add(rowList);
}
list.add(sheetList);
}
System.err.println(list.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
}
//判断文件格式
private static Workbook readExcel(String filePath){
if(filePath==null){
return null;
}
String extString = filePath.substring(filePath.lastIndexOf("."));
try {
@SuppressWarnings("resource")
InputStream is = new FileInputStream(filePath);
if(".xls".equals(extString)){
return new HSSFWorkbook(is);
}else if(".xlsx".equals(extString)){
return new XSSFWorkbook(is);
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@SuppressWarnings("deprecation")
public static String getStringCellValue(Cell cell) {
String cellvalue = "";
if (cell == null) {
return "";
}
switch (cell.getCellType()) {
case Cell.CELL_TYPE_STRING:
cellvalue = cell.getStringCellValue();
break;
case Cell.CELL_TYPE_NUMERIC:
if (DateUtil.isCellDateFormatted(cell)) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = cell.getDateCellValue();
cellvalue = sdf.format(date);
} else {
cellvalue = String.valueOf(cell.getNumericCellValue());
}
break;
case Cell.CELL_TYPE_BOOLEAN:
cellvalue = String.valueOf(cell.getBooleanCellValue());
break;
case Cell.CELL_TYPE_BLANK:
cellvalue = "";
break;
default:
cellvalue = "";
break;
}
if (cellvalue == "") {
return "";
}
return cellvalue;
}
}
最后
以上就是害羞小虾米为你收集整理的Java 读取Excel ( xls 和 xlsx 格式 )的全部内容,希望文章能够帮你解决Java 读取Excel ( xls 和 xlsx 格式 )所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复