Java POI读取excel 支持xls、xlsx
报表存在读取数据源来自excel,系统常常出现读取excel需求,Java POI不仅可以输出excel,也可以读取excel中单元格数据、图片数据,poi也支持excel2007(xlsx)读取,使用poi-3.8-20120326.jar,poi-ooxml-3.8-20120326.jar,poi-scratchpad-3.8-20120326.jar,这些Jar包可以从apache poi获取
单元格读取
下面是读取excel第一个sheet,多个可以循环读取,然后遍历excel 行Row,再遍历Row的单元格Cell
File excelFile = new File("/Users/mike/table5.xls");
HSSFWorkbook wb = new HSSFWorkbook(new FileInputStream(excelFile));
HSSFSheet sheet = wb.getSheetAt(0);
for (Row row : sheet) {
for (Cell cell : row) {
switch (cell.getCellType()) {
case Cell.CELL_TYPE_STRING://字符串
System.out.print(cell.getRichStringCellValue().getString());
System.out.print("|");
break;
case Cell.CELL_TYPE_NUMERIC://数值与日期
if (DateUtil.isCellDateFormatted(cell)) {
System.out.print(String.valueOf(cell.getDateCellValue()));
} else {
System.out.print(cell.getNumericCellValue());
}
System.out.print("|");
break;
case Cell.CELL_TYPE_BOOLEAN://boolean类型
System.out.print(cell.getBooleanCellValue());
System.out.print("|");
break;
default:
}
}
System.out.println();
}
图片读取
先获取excel所有的图片,再查询pictureIndex 根据pictureIndex获取对应的图片
//读取图片
List<HSSFPictureData> pictures = wb.getAllPictures();
for (HSSFShape shape : sheet.getDrawingPatriarch().getChildren()) {
if (shape instanceof HSSFPicture) {
HSSFPicture pic = (HSSFPicture) shape;
int pictureIndex = pic.getPictureIndex()-1;
HSSFPictureData picData = pictures.get(pictureIndex);
System.out.println("image-size:" + picData.getData().length);
}
}
整个示例
import java.io.File;
import java.io.FileInputStream;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFPicture;
import org.apache.poi.hssf.usermodel.HSSFPictureData;
import org.apache.poi.hssf.usermodel.HSSFShape;
import org.apache.poi.hssf.usermodel.HSSFSheet;
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;
public final class TestImportExcel {
public static void main(String[] args) throws Exception {
File excelFile = new File("/Users/mike/table5.xls");
HSSFWorkbook wb = new HSSFWorkbook(new FileInputStream(excelFile));
HSSFSheet sheet = wb.getSheetAt(0);
for (Row row : sheet) {
for (Cell cell : row) {
switch (cell.getCellType()) {
case Cell.CELL_TYPE_STRING:
System.out.print(cell.getRichStringCellValue().getString());
System.out.print("|");
break;
case Cell.CELL_TYPE_NUMERIC:
if (DateUtil.isCellDateFormatted(cell)) {
System.out.print(String.valueOf(cell.getDateCellValue()));
} else {
System.out.print(cell.getNumericCellValue());
}
System.out.print("|");
break;
case Cell.CELL_TYPE_BOOLEAN:
System.out.print(cell.getBooleanCellValue());
System.out.print("|");
break;
default:
}
}
System.out.println();
}
//读取图片
List<HSSFPictureData> pictures = wb.getAllPictures();
for (HSSFShape shape : sheet.getDrawingPatriarch().getChildren()) {
if (shape instanceof HSSFPicture) {
HSSFPicture pic = (HSSFPicture) shape;
int pictureIndex = pic.getPictureIndex()-1;
HSSFPictureData picData = pictures.get(pictureIndex);
System.out.println("image-size:" + picData.getData().length);
}
}
System.out.println(wb.getSheetName(0));
}
}
xlsx读取单元格
xlsx读取大概与xls读取相类似,xlsx采用是X开头的类,采用的是XSSFWorkbook
File excelFile = new File("/Users/mike/table.xlsx");
XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream(excelFile));
XSSFSheet sheet = wb.getSheetAt(0);
for (Row row : sheet) {
for (Cell cell : row) {
switch (cell.getCellType()) {
case Cell.CELL_TYPE_STRING:
System.out.print(cell.getRichStringCellValue().getString());
System.out.print("|");
break;
case Cell.CELL_TYPE_NUMERIC:
if (DateUtil.isCellDateFormatted(cell)) {
System.out.print(String.valueOf(cell.getDateCellValue()));
} else {
System.out.print(cell.getNumericCellValue());
}
System.out.print("|");
break;
case Cell.CELL_TYPE_BOOLEAN:
System.out.print(cell.getBooleanCellValue());
System.out.print("|");
break;
default:
}
}
System.out.println();
}
xlsx读取图片
xlsx读取图片直接获取所有的图片,然后遍历图片获取图片数据
//读取图片
List<XSSFPictureData> pictures = wb.getAllPictures();
for (int i = 0; i < pictures.size(); i++) {
XSSFPictureData pictureData = pictures.get(i);
byte[] picData = pictureData.getData();
System.out.println("image-size:" + picData.length);
}
xlsx示例
import java.io.File;
import java.io.FileInputStream;
import java.util.List;
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.xssf.usermodel.XSSFPictureData;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public final class TestImportXlsx {
public static void main(String[] args) throws Exception {
File excelFile = new File("/Users/mike/table.xlsx");
XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream(excelFile));
XSSFSheet sheet = wb.getSheetAt(0);
for (Row row : sheet) {
for (Cell cell : row) {
switch (cell.getCellType()) {
case Cell.CELL_TYPE_STRING:
System.out.print(cell.getRichStringCellValue().getString());
System.out.print("|");
break;
case Cell.CELL_TYPE_NUMERIC:
if (DateUtil.isCellDateFormatted(cell)) {
System.out.print(String.valueOf(cell.getDateCellValue()));
} else {
System.out.print(cell.getNumericCellValue());
}
System.out.print("|");
break;
case Cell.CELL_TYPE_BOOLEAN:
System.out.print(cell.getBooleanCellValue());
System.out.print("|");
break;
default:
}
}
System.out.println();
}
//读取图片
List<XSSFPictureData> pictures = wb.getAllPictures();
for (int i = 0; i < pictures.size(); i++) {
XSSFPictureData pictureData = pictures.get(i);
byte[] picData = pictureData.getData();
System.out.println("image-size:" + picData.length);
}
System.out.println(wb.getSheetName(0));
}
}