String excelDir ="c:/tepxls"; //excel路径
FileInputStream finput = new FileInputStream("excelDir" );
POIFSFileSystem fs = new POIFSFileSystem( finput );
HSSFWorkbook wb = new HSSFWorkbook(fs);
HSSFSheet sheet = wbgetSheetAt(0); //参数 0 代表第一个sheet
HSSFRow row = sheetgetRow((short)0); //得到第一行
HSSFCell cell = row getCell( (short) 0); //得到第一列
Systemoutprintln(cellgetNumericCellValue()); //得到第一行第一列的单元格内容 分数是数字型,注意内容的类型
获取颜色好像没办法
首先POI是开源组织Apache出品的一个开源jar包,提供了方便解析Excel的API,我们可以非常方便的使用它来读取Excel。这里介绍35Final版本。
所需用到的jar包如下:
说到Excel,有2003和2007,格式是不一样的,用POI解析的方法也就不一样,Excel2003主要是使用orgapachepoihssfusermodel包中的类来解析,而Excel2007就是使用orgapachepoixssfusermodel来解析。
解析Excel2003源码
说到Excel,有2003和2007,格式是不一样的,用POI解析的方法也就不一样,Excel2003主要是使用orgapachepoihssfusermodel包中的类来解析,而Excel2007就是使用orgapachepoixssfusermodel来解析。
解析Excel2003源码
StringBuffer content = new StringBuffer();
HSSFWorkbook workbook = new HSSFWorkbook(is); // 创建对Excel工作簿文件的引用
for (int numSheets = 0; numSheets < workbookgetNumberOfSheets(); numSheets++) {
if (null != workbookgetSheetAt(numSheets)) {
HSSFSheet aSheet = workbookgetSheetAt(numSheets); // 获得一个sheet
for (int rowNumOfSheet = 0; rowNumOfSheet <= aSheetgetLastRowNum(); rowNumOfSheet++) {
if (null != aSheetgetRow(rowNumOfSheet)) {
HSSFRow aRow = aSheetgetRow(rowNumOfSheet); // 获得一行
for (int cellNumOfRow = 0; cellNumOfRow <= aRowgetLastCellNum(); cellNumOfRow++) {
if (null != aRowgetCell(cellNumOfRow)) {
HSSFCell aCell = aRowgetCell(cellNumOfRow); // 获得列值
if (aCellgetCellType() == HSSFCellCELL_TYPE_NUMERIC) {
contentappend(aCellgetNumericCellValue() + "\t");
} else if (aCellgetCellType() == HSSFCellCELL_TYPE_BOOLEAN) {
contentappend(aCellgetBooleanCellValue() + "\t");
} else if (aCellgetCellType() == HSSFCellCELL_TYPE_STRING) {
contentappend(aCellgetStringCellValue() + "\t");
} else if (aCellgetCellType() == HSSFCellCELL_TYPE_FORMULA){
contentappend(aCellgetCellFormula() + "\t");
} else {
continue;
}
}
if(cellNumOfRow == aRowgetLastCellNum()) {
contentappend("\n");
}
}
}
}
}
}
return contenttoString()trim();
解析Excel2007和2003基本一样,只是将HSSFSheet,HSSFCell等都改成XSSFSheet,XSSFCell即可。
另外要提醒大家的是Excel的样式都是基于一个单元格的,所以用HSSFRowgetRowStyle()拿样式会出问题的,不一定会拿到你想要的样式。处理合并单元格是POI的一个难点,只能通过判断当前单元格是否在合并单元格之中,如果是,那此单元格的值便是这个合并单元格的首位置单元格的值,只有通过这样才能来处理合并单元格。
处理合并单元格的代码:
public static boolean isMergedRegion(HSSFSheet sheet, HSSFCell cell) {
//得到一个sheet中有多少个合并单元格
int sheetmergerCount = sheetgetNumMergedRegions();
for(int i = 0; i < sheetmergerCount; i++) {
//得出具体的合并单元格
CellRangeAddress ca = sheetgetMergedRegion(i);
//得到合并单元格的起始行, 结束行, 起始列, 结束列
int firstC = cagetFirstColumn();
int lastC = cagetLastColumn();
int firstR = cagetFirstRow();
int lastR = cagetLastRow();
//判断该单元格是否在合并单元格范围之内, 如果是, 则返回 true
if(cellgetColumnIndex() <= lastC && cellgetColumnIndex() >= firstC) {
if(cellgetRowIndex() <= lastR && cellgetRowIndex() >= firstR) {
return true;
}
}
}
return false;
}
public static String getMergedRegionValue(HSSFSheet sheet, HSSFCell cell) {
//获得一个 sheet 中合并单元格的数量
int sheetmergerCount = sheetgetNumMergedRegions();
//便利合并单元格
for(int i = 0; i < sheetmergerCount; i++) {
//获得合并单元格
CellRangeAddress ca = sheetgetMergedRegion(i);
//获得合并单元格的起始行, 结束行, 起始列, 结束列
int firstC = cagetFirstColumn();
int lastC = cagetLastColumn();
int firstR = cagetFirstRow();
int lastR = cagetLastRow();
//判断该单元格是否是在合并单元格中, 如果是, 则返回所在合并单元格的首单元格的值
if(cellgetColumnIndex() <= lastC && cellgetColumnIndex() >= firstC) {
if(cellgetRowIndex() <= lastR && cellgetRowIndex() >= firstR) {
HSSFRow fRow = sheetgetRow(firstR);
HSSFCell fCell = fRowgetCell(firstC);
//除了合并单元格首单元格的值, 其余的用()来区分
if (fCellgetCellType() == HSSFCellCELL_TYPE_NUMERIC && hasBorder(cell)) {
return StringvalueOf(fCellgetNumericCellValue());
} else if (fCellgetCellType() == HSSFCellCELL_TYPE_BOOLEAN && hasBorder(cell)) {
return StringvalueOf(fCellgetBooleanCellValue());
} else if (fCellgetCellType() == HSSFCellCELL_TYPE_STRING && hasBorder(cell)) {
return fCellgetStringCellValue();
} else if (fCellgetCellType() == HSSFCellCELL_TYPE_FORMULA && hasBorder(cell)){
return StringvalueOf(fCellgetCellFormula());
}
}
}
}
return "";
}
首先了解以下excel文件怎么和poi中的组件对应起来的。
基于以上几条,如果想对excel文件进行读写的话就要
基于以上原理就可以轻松对Excel文件进行读写,这里以XSSFWorkbook(对应xlsx文件即office2007以上版本,如果是xls文件即office2003以下版本需要使用HSSFWorkbook)为例进行Excel的简单读写。
maven依赖
写 *** 作
读 *** 作和写 *** 作类似,把create的地方换成get即可
当然也可以根据文件扩展名自动选择使用哪个子类生成Workbook对象,这里直接封一个util工具类,方便以后直接使用
//参数分别是开始行,结束行,行对应的开始列和结束列
public void getExcelElement(int startRow,int endRow,int startCell,int endCell){
XSSFWorkbook wb=new XSSFWorkbook();
XSSFSheet sheet=wbgetSheet("sheetName");
for(int i=startRow;i<=endRow;i++){
XSSFRow row=sheetgetRow(i);
for(int a=startCell;a<=endCell;a++){
XSSFCell cell=rowgetCell(a);
Systemoutprintln(cell);
}
}
}
我没跑过 你先试试 有问题再说
说到Excel,有2003和2007,格式是不一样的,用POI解析的方法也就不一样,Excel2003主要是使用orgapachepoihssfusermodel包中的类来解析,而Excel2007就是使用orgapachepoixssfusermodel来解析。
解析Excel2003源码
说到Excel,有2003和2007,格式是不一样的,用POI解析的方法也就不一样,Excel2003主要是使用orgapachepoihssfusermodel包中的类来解析,而Excel2007就是使用orgapachepoixssfusermodel来解析。
解析Excel2003源码
StringBuffer content = new StringBuffer(); HSSFWorkbook workbook = new HSSFWorkbook(is); // 创建对Excel工作簿文件的引用
for (int numSheets = 0; numSheets < workbookgetNumberOfSheets(); numSheets++) { if (null != workbookgetSheetAt(numSheets)) { HSSFSheet aSheet = workbookgetSheetAt(numSheets); // 获得一个sheet
for (int rowNumOfSheet = 0; rowNumOfSheet <= aSheetgetLastRowNum(); rowNumOfSheet++) { if (null != aSheetgetRow(rowNumOfSheet)) { HSSFRow aRow = aSheetgetRow(rowNumOfSheet); // 获得一行
for (int cellNumOfRow = 0; cellNumOfRow <= aRowgetLastCellNum(); cellNumOfRow++) { if (null != aRowgetCell(cellNumOfRow)) { HSSFCell aCell = aRowgetCell(cellNumOfRow); // 获得列值 if (aCellgetCellType() == HSSFCellCELL_TYPE_NUMERIC) { contentappend(aCellgetNumericCellValue() + "\t"); } else if (aCellgetCellType() == HSSFCellCELL_TYPE_BOOLEAN) { contentappend(aCellgetBooleanCellValue() + "\t"); } else if (aCellgetCellType() == HSSFCellCELL_TYPE_STRING) { contentappend(aCellgetStringCellValue() + "\t"); } else if (aCellgetCellType() == HSSFCellCELL_TYPE_FORMULA){ contentappend(aCellgetCellFormula() + "\t"); } else { continue; } } if(cellNumOfRow == aRowgetLastCellNum()) { contentappend("\n"); } } } } } }
return contenttoString()trim();
POI是Apache下的一个项目,是用Java编写的开源框架,提供API供开发者直接 *** 作Microsoft Office(Excel,Word,PowerPoint)
POI为我们带来了什么
在很多的企业当中,储蓄数据是使用Excel文档的,因为Excel文档的格式方便,也能套用公式,而企业程序是存储在数据库当中,这样就需要一种两者之间互相转换的方法,当企业刚开始使用信息化的管理系统时,也需要将Excel的数据录入到程序当中,这种需求是非常普遍的
POI使用:
首先增加Maven的依赖
<!-- POI核心依赖 -->
<dependency>
<groupId>orgapachepoi</groupId>
<artifactId>poi</artifactId>
<version>38</version>
</dependency>
<!-- 为POI支持Office Open XML -->
<dependency>
<groupId>orgapachepoi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>38</version>
</dependency>
<dependency>
<groupId>orgapachepoi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>38</version>
</dependency>
<!-- 支持Word文档的 *** 作 -->
<dependency>
<groupId>orgapachepoi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>38</version>
</dependency>
以下为 *** 作Excel的测试类
package comaccentrixray;
import javaioFile;
import javaioFileOutputStream;
import javaioIOException;
import orgapachepoiopenxml4jexceptionsInvalidFormatException;
import orgapachepoissusermodelCell;
import orgapachepoissusermodelCellStyle;
import orgapachepoissusermodelRow;
import orgapachepoissusermodelSheet;
import orgapachepoissusermodelWorkbook;
import orgapachepoissusermodelWorkbookFactory;
import orgapachepoixssfusermodelXSSFWorkbook;
import orgjunitBefore;
import orgjunitTest;
public class TestExcel {
private Workbook workbook;
/
由于Excel当中的单元格Cell存在类型,若获取类型错误 就会产生错误,
所以通过此方法将Cell内容全部转换为String类型
/
private String getCellValue(Cell cell) {
String str = null;
switch (cellgetCellType()) {
case CellCELL_TYPE_BLANK:
str = "";
break;
case CellCELL_TYPE_BOOLEAN:
str = StringvalueOf(cellgetBooleanCellValue());
break;
case CellCELL_TYPE_FORMULA:
str = StringvalueOf(cellgetCellFormula());
break;
case CellCELL_TYPE_NUMERIC:
str = StringvalueOf(cellgetNumericCellValue());
break;
case CellCELL_TYPE_STRING:
str = StringvalueOf(cellgetStringCellValue());
break;
default:
str = null;
break;
}
return str;
}
@Before
public void setUp() throws InvalidFormatException, IOException {
// 加载excel文件,自动判断是HSSF还是XSSF
workbook = WorkbookFactorycreate(new File("E:/aaaxls"));
}
/
读取一个已存在的Excel
/
@Test
public void testReadExcel() throws InvalidFormatException, IOException {
// 获取第一个工作目录,下标从0开始
Sheet sheet = workbookgetSheetAt(0);
// 获取该工作目录最后一行的行数
int lastRowNum = sheetgetLastRowNum();
for (int i = 0; i < lastRowNum; i++) {
// 获取下标为i的行
Row row = sheetgetRow(i);
// 获取该行单元格个数
int lastCellNum = rowgetLastCellNum();
for (int j = 0; j < lastCellNum; j++) {
// 获取下标为j的单元格
Cell cell = rowgetCell(j);
// 调用获取方法
String cellValue = thisgetCellValue(cell);
}
}
}
/
使用Foreach方式读取Excel
/
@Test
public void testForeachReadExcel() {
// 根据sheet的名字获取
Sheet sheet = workbookgetSheet("test");
// 处了上面testReadExcel的方式读取以外,还支持foreach的方式读取
for (Row row : sheet) {
for (Cell cell : row) {
String cellValue = thisgetCellValue(cell);
Systemoutprintln(cellValue);
}
}
}
/
创建简单的Excel
/
@Test
public void testWriteExcel() throws IOException {
// 创建一个XSSF的Excel文件
workbook = new XSSFWorkbook();
FileOutputStream fos = new FileOutputStream("E:/testxlsx");
// 创建名称为test的工作目录
Sheet sheet = workbookcreateSheet("test");
/
创建1个10行x10列的工作目录
/
for (int i = 0; i < 10; i++) {
// 创建一行
Row row = sheetcreateRow(i);
for (int j = 0; j < 10; j++) {
// 创建一个单元格
Cell cell = rowcreateCell(j);
// 设置单元格value
cellsetCellValue("test");
// 此处为设置Excel的样式,设置单元格内容居中,
// 但这样设置方式并不常用,请留意下面的方法
CellStyle cs = workbookcreateCellStyle();
cssetAlignment(CellStyleALIGN_CENTER);
cellsetCellStyle(cs);
}
}
// 将Excel写出到文件流
workbookwrite(fos);
}
<pre t="code" l="java">// 以下为我在项目中运用的jxl的核心代码
try {
Workbook book = null;
book = WorkbookgetWorkbook(file);
// 获得第一个工作表对象
Sheet sheet = bookgetSheet(0);
int rows = sheetgetRows();
if(rows>1){
Map idnomap = thisgetStudentByIdnos(sheet);
for (int j = 1; j < sheetgetRows(); j++) {// 得到的是行的单元格
TStudentinfo stu = thisgetStudent(sheet,sheetgetRow(j),rows,j,appmap,classmap,idnomap,state);
if(stu==null){
continue;
}
stulistadd(stu);
}
}
bookclose();
// DEMO: db *** 作在下方
xxxServiceadd(stulist);
}
catch (Exception e) {
Systemoutprintln(e);
}
以上就是关于用java poi包读取Excel单元格全部的内容,包括:用java poi包读取Excel单元格、怎么用Apache POI *** 作Excel文件、使用poi读写excel等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)