用java poi包读取Excel单元格

用java poi包读取Excel单元格,第1张

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等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9517588.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存