package com.jim.tools;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFCell;
import java.io.*;
import java.util.ArrayList;
/**
* 此类采用 poi包 实现了读 .xls 文件的功能,
* 用 poi 读 excel 相对而言要比 fastExcel 麻烦,而且速度上也没有 fastExcel 快
* @author hellojim
* @company cxtech
*/
public class POIReadFromExcel {
private String URL; //要读取的 .xls 文件的目录
private int index = 0; //要读取的 .xls 文件的那个 Sheet , 默认为第0个(Sheet1)
private int beginRow = 0; //要读取的 Sheet 的开始行, 默认为第0行
private int beginCol = 0; //要读取的 Sheet 的开始列, 默认为第0列
private final static int defaultRow = 0;
/**
* URL 要读取的那个 .xls 文件的地址
*/
public POIReadFromExcel(String URL) {
//这里简单的做了个判断
if(URL == null || URL.trim().equals("")) {
System.out.println("文件不能为空!");
}else if(URL.trim().indexOf(".xls") == -1 && URL.trim().indexOf(".XLS") == -1) {
System.out.println("文件格式不正确!");
}else {
this.URL = URL;
}
}
/**
* URL 要读取的那个 .xls 文件的地址
* index 要读取的那个 Sheet , 默认为第一个(Sheet1)
*/
public POIReadFromExcel(String URL, int index) {
this(URL);
this.index = index;
}
/**
* URL 要读取的那个 .xls 文件的地址
* index 要读取的那个 Sheet , 默认为第一个(Sheet1)
* beginRow 要读取的 Sheet 的开始行
* beginCol 要读取的 Sheet 的开始列
*/
public POIReadFromExcel(String URL,int index,int beginRow,int beginCol) {
this(URL,index);
this.beginRow = beginRow;
this.beginCol = beginCol;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
public String getURL() {
return URL;
}
public void setURL(String URL) {
this.URL = URL;
}
public int getBeginCol() {
return beginCol;
}
public void setBeginCol(int beginCol) {
this.beginCol = beginCol;
}
public int getBeginRow() {
return beginRow;
}
public void setBeginRow(int beginRow) {
this.beginRow = beginRow;
}
public String[][] read() throws Exception {
String[][] strArray = null;
String value = null;
File f = new File(this.URL);
FileInputStream fos = new FileInputStream(f); //把要读取的 .xls 文件 包装起来
HSSFWorkbook workbook = new HSSFWorkbook(fos); //得到 excel 工作簿对应的 HSSFWorkbook 对象
HSSFSheet sheet = null;
try {
sheet = workbook.getSheetAt(this.index); //得到 excel 工作簿中 某个Sheet 对应的 HSSFSheet 对象
}catch(IndexOutOfBoundsException ex) {
return null;
}
HSSFRow row = sheet.getRow(defaultRow); //得到某个 Sheet 中的第 0 行(默认为第 0 行)
int rows = sheet.getLastRowNum() - this.beginRow; //得到共有多少行
int cols = row.getLastCellNum() - this.beginCol; //得到共有多少列
strArray = new String[rows+1][cols];
for (int i = this.beginRow,m=0; i <= rows+this.beginRow; i++,m++) {
row = sheet.getRow(i); //得到此工作区中的某一得数据
for (int j = this.beginCol,n=0; j < row.getLastCellNum(); j++,n++) {
HSSFCell mycell = row.getCell( (short) j); //得到一个具体的单元格
try {
if(mycell != null) {//[注意]: 这里一定要加上这个判断,如果某个单元格为空,这里的 mycell 就为 null,易发生 NullProintException
/* [注意]:这里在得到某个单元格中内容前,一定要先判断这个单元格中内容的数据类型,
然后根据数据类型用对应的getXxxCellValue这样的方法来得到具体内容,如果不做这样的判断可能出现 int 型数据而你用了
getStringCellValue()这样的方法去取数据,就会报错,这也是 POI 取 Excel 中数据的一个缺点。
本个在以上两个"注意"点上栽了不少跟头,相反如果是用 fastExcel 这两个问题根本不存在 */
if(mycell.getCellType() == HSSFCell.CELL_TYPE_STRING) { //如果单元格里的数据类型为 String 型
value = mycell.getStringCellValue().trim();
}else if(mycell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) { //如果单元格里的数据类型为 Number 型
//这里总是返回的是 double 型,如果数据确实为 int 型,象下面这样可以在这里做个强行转换
value = String.valueOf((int)mycell.getNumericCellValue()).trim();
}else if(mycell.getCellType() == HSSFCell.CELL_TYPE_BOOLEAN) { //如果单元格里的数据类型为 Boolean 型
value = String.valueOf(mycell.getBooleanCellValue()).trim();
}
}else {
value = null;
}
if(value == null || value.trim().equals("")) {
strArray[m][n] = "";
}else {
strArray[m][n] = value;
}
}
catch (Exception e) {
e.printStackTrace();
}
}
}
return strArray;
}
/**
* 返回 若干个 sheet, 若干个 sheet 存放于 ArrayList 中
* */
public ArrayList readAll() throws Exception {
ArrayList al = new ArrayList();
String[][] strArr = null;
while(true) {
strArr = read();
if(strArr == null) {
break;
}else {
al.add(strArr);
this.index ++;
}
}
return al;
}
public static void printArr(String[][] strArr) {
for(int i=0; i<strArr.length; i++) {
for(int j=0; j<strArr[i].length; j++) {
System.out.print(strArr[i][j] + " ");
}
System.out.println();
}
System.out.println("______________________________________________________________________");
}
public static void main(String [] args) throws Exception {
POIReadFromExcel readExcel = new POIReadFromExcel("d:\\test.xls");
readExcel.setIndex(1);
readExcel.setBeginRow(1);
readExcel.setBeginCol(1);
//读某一个 Sheet
String[][] strArr2 = readExcel.read();
printArr(strArr2);
//读所有的 Sheet
readExcel.setIndex(0);
ArrayList al = readExcel.readAll();
if(al != null && al.size() > 0) {
for(int i=0; i<al.size(); i++) {
String[][] strArr = (String[][])al.get(i);
printArr(strArr);
}
}
}
}
package com.jim.tools;
import java.io.File;
import java.util.ArrayList;
import edu.npu.fastexcel.FastExcel;
import edu.npu.fastexcel.Sheet;
import edu.npu.fastexcel.Workbook;
/**
* 此类采用 fastExcel包 实现了读 .xls 文件的功能,目前为止,FastExcel 还没有提供向 Excel 中写入的功能
* @author hellojim
* @company cxtech
*/
public class FEReadFromExcel {
private String URL; //要读取的 .xls 文件的目录
private int index = 0; //要读取的 .xls 文件的那个 Sheet , 默认为第0个(Sheet1)
private int beginRow = 0; //要读取的 Sheet 的开始行, 默认为第0行
private int beginCol = 0; //要读取的 Sheet 的开始列, 默认为第0列
/**
* URL 要读取的那个 .xls 文件的地址
*/
public FEReadFromExcel(String URL) {
//这里简单的做了个判断
if(URL == null || URL.trim().equals("")) {
System.out.println("文件不能为空!");
}else if(URL.trim().indexOf(".xls") == -1 && URL.trim().indexOf(".XLS") == -1) {
System.out.println("文件格式不正确!");
}else {
this.URL = URL;
}
}
/**
* URL 要读取的那个 .xls 文件的地址
* index 要读取的那个 Sheet , 默认为第一个(Sheet1)
*/
public FEReadFromExcel(String URL, int index) {
this(URL);
this.index = index;
}
/**
* URL 要读取的那个 .xls 文件的地址
* index 要读取的那个 Sheet , 默认为第一个(Sheet1)
* beginRow 要读取的 Sheet 的开始行
* beginCol 要读取的 Sheet 的开始列
*/
public FEReadFromExcel(String URL,int index,int beginRow,int beginCol) {
this(URL,index);
this.beginRow = beginRow;
this.beginCol = beginCol;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
public String getURL() {
return URL;
}
public void setURL(String URL) {
this.URL = URL;
}
public int getBeginCol() {
return beginCol;
}
public void setBeginCol(int beginCol) {
this.beginCol = beginCol;
}
public int getBeginRow() {
return beginRow;
}
public void setBeginRow(int beginRow) {
this.beginRow = beginRow;
}
/**
* 返回 某一个 sheet
*/
public String[][] read() throws Exception {
Workbook workBook = FastExcel.createReadableWorkbook(new File(this.URL));
workBook.open();
Sheet s = workBook.getSheet(this.index);
String cell = null;
String[][] cellArr = new String[s.getLastRow()-this.beginRow][s.getLastColumn()-this.beginCol];
for(int i=s.getFirstRow()+this.beginRow,row=0; i<s.getLastRow(); i++,row++) {
for(int j=s.getFirstColumn()+this.beginCol,col = 0; j<s.getLastColumn() ; j++,col++) {
cell = s.getCell(i,j);
if(cell == null || cell.trim().equals("")) {
cell = "";
}else {
cell = cell.trim();
}
cellArr[row][col] = cell;
}
}
workBook.close();
return cellArr;
}
/**
* 返回 若干个 sheet, 若干个 sheet 存放于 ArrayList 中
* */
public ArrayList readAll() throws Exception {
Workbook workBook = FastExcel.createReadableWorkbook(new File(this.URL));
workBook.open();
Sheet s = null;
String cell;
int index = this.index; //读出所有的 Sheet,默认从第0个Sheet 开始读
int sumRow = 0; //所有的 Sheet 共有记录多少行
int sumCol = 0; //所有的 Sheet 共有记录多少列
String[][] cellArr = null;
ArrayList al = new ArrayList();
while(true) {
s = workBook.getSheet(index++);
if(s == null) {
break;
}else {
sumRow += s.getLastRow()-this.beginRow;
if(s.getLastColumn() > sumCol) {
sumCol = s.getLastColumn();
}
cellArr = new String[s.getLastRow() - this.beginRow][s.getLastColumn() - this.beginCol];
}
for (int i = s.getFirstRow()+this.beginRow,row=0; i < s.getLastRow(); i++,row++) {
for (int j = s.getFirstColumn() + this.beginCol,col=0; j < s.getLastColumn(); j++,col++) {
cell = s.getCell(i, j);
if(cell == null || cell.trim().equals("")) {
cell = "";
}else {
cell = cell.trim();
}
cellArr[row][col] = cell;
}
}
al.add(cellArr);
}
workBook.close();
return al;
}
public static void printArr(String[][] strArr) {
for(int i=0; i<strArr.length; i++) {
for(int j=0; j<strArr[i].length; j++) {
System.out.print(strArr[i][j] + " ");
}
System.out.println();
}
System.out.println("______________________________________________________________________");
}
public static void main(String[] args) throws Exception {
FEReadFromExcel readExcel = new FEReadFromExcel("d:\\test.xls");
readExcel.setIndex(0);
readExcel.setBeginRow(0);
readExcel.setBeginCol(0);
ArrayList al = readExcel.readAll(); //这里表示所有的sheet
if(al != null && al.size() > 0) {
for(int i=0; i<al.size(); i++) {
String[][] strArr = (String[][])al.get(i);
printArr(strArr);
}
}
readExcel.setIndex(1);
readExcel.setBeginRow(1);
readExcel.setBeginCol(1);
String[][] strArr = readExcel.read(); //这里表示读 sheet1
printArr(strArr);
}
}
分享到:
相关推荐
### POI Excel知识点详解 #### 一、Jakarta POI简介与Apache POI的作用 Jakarta POI 是 Apache POI 的早期项目名称,它提供了一组 API 来处理 Microsoft Office 文件格式,特别是针对 Excel(`.xls` 和 `.xlsx`)...
poi log4j excel poi log4j excel poi log4j excel poi log4j excel poi log4j excel poi log4j excel poi log4j excel
高德地图显示&定位&poi&设置中心点 1:显示当前位置 2:设置中心点 3:poi周围设置搜索位置并设置地图中心点 4:MainActivity 显示地图、定位、poi、改变中心点 5:TestActivity单独定位功能
springboot+poi导出指定格式Excel模板,完整项目,导出即用。springboot+poi导出指定格式Excel模板,完整项目,导出即用。springboot+poi导出指定格式Excel模板,完整项目,导出即用。springboot+poi导出指定格式...
在IT领域,Apache POI是一个广泛使用的Java库,它允许开发者读取、写入和修改Microsoft Office格式的文件,特别是Excel工作簿。本教程将深入探讨如何利用Apache POI库来合并多个Excel工作表,这对于处理大量数据或者...
6. **资源利用**:提供的"报表技术POI&EasyPOI导入导出操作Excel、Word、CSV(讲义、源码、资料)"压缩包,包含了课程的讲义、源代码和相关资料,是学习和实践POI及EasyPOI的好资源。通过学习这些材料,你可以深入理解...
Apache POI是一个强大的Java库,专门用于处理Microsoft Office格式的文件,尤其是Excel。在这个场景中,我们关注的是如何使用POI来创建、读取和操作Excel文档。在Web项目中,这种功能通常用于数据导入导出,报表生成...
Apache POI是一个开源项目,它提供了读取和写入Microsoft Office格式文件的能力,包括Excel(.xlsx和.xls)。而iText则是一个用于创建和处理PDF文档的Java库。结合这两个库,我们可以将Excel的工作表内容导出到PDF中...
传统的Java Excel处理库如Apache POI在处理大量数据时可能会遇到性能瓶颈,因为它们会加载整个工作簿到内存中。而FastExcel则采用流式处理方式,只处理当前需要的数据,降低了内存占用,提高了处理速度。 在导入...
与Apache POI相比,FastExcel通过采用数组方式存储数据,显著减少了内存消耗,这对于处理大型Excel文件尤其有利。 FastExcel的核心优势在于它的性能和内存效率。由于它不支持复杂的样式设置,因此在进行基础的读写...
Apache POI 是一个开源项目,专门用于处理 Microsoft Office 格式的文件,如 Word、Excel 和 PowerPoint。在本案例中,我们关注的是如何使用 Apache POI 库来导出 Excel 文件,特别是根据模板导出和简单列表导出。...
看到现在网上excel转pdf的代码很少,在csdn上找到一个还不能用,只能做简单的转换,只好自己写了一个,代码是一个maven工程,用eclipse创建,支持单元格合并等复杂的excel,同时能同步单元格样式到pdf中。...
标题中的"POI 3.14 读excel hssf && xssf"指的是Apache POI库的3.14版本,这是一个广泛使用的Java API,用于处理Microsoft Office格式的文件,特别是Excel。Apache POI提供了HSSF(Horrible Spreadsheet Format)和...
在本示例中,我们将探讨如何使用Apache POI库从数据库导出数据到Excel表格,这在数据分析、报告生成或批量数据处理场景中非常常见。Apache POI是一个开源项目,它允许Java开发者创建、修改和显示Microsoft Office...
Apache POI 是一个开源项目,专门用于处理Microsoft Office格式的文件,如Excel、Word和PowerPoint。在Java环境中,POI提供了一套API,使得开发者能够读取、创建、修改这些文件。本教程将深入讲解如何使用Apache POI...
Apache POI是一个流行的Java库,用于读取和写入Microsoft Office格式的文件,尤其是Excel(.xlsx和.xls)文件。这个实例提供了两种方法来导出Excel文件:通过Servlet和通过main方法。这两种方法都是在Java环境中操作...
使用POI筛选字段导出Excel,以及条件查询和指定数据导出
在IT行业中,Apache POI是一个广泛使用的库,主要用于读取、写入Microsoft Office格式的文件,包括Word(.doc/.docx)和Excel(.xls/.xlsx)文档。本项目提供的"POI实现word和excel在线预览"是基于Apache POI的一个...
使用poi读取写入复杂excel内容包括样式,工具类
Apache POI 是一个广泛使用的Java库,用于处理Microsoft Office格式的文件,如Excel、Word和PowerPoint。在处理大型Excel文件时,传统的HSSF和XSSF模型可能会遇到性能瓶颈,因为它们将整个工作簿加载到内存中。为了...