java poi解析限制长度,Java使用POI解析后綴為.xls和.xlsx的Excel的完美處理

在我們做web開發中,經常性的於Excel表格進行打交道,但其中的坑只有我們自己去做了才知道,坑是有多大。當Excel表格中使用了公式計算數據的時候,我們用POI中的CELL_TYPE_FORMULA這個類型只能拿到類似於這樣的公式:SUM(P4-Q4-R4-S4),那怎么獲取他的值呢,接下來,請看以下demo

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.InputStream;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import org.apache.poi.ss.usermodel.Cell;

import org.apache.poi.ss.usermodel.CellValue;

import org.apache.poi.ss.usermodel.DateUtil;

import org.apache.poi.ss.usermodel.FormulaEvaluator;

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;

/**

*

* @author arryluo

*

*/

public class Texst {

private static final String EXCEL_XLS = "xls";

private static final String EXCEL_XLSX = "xlsx";

private static XSSFWorkbook xssfWorkbook = null;

private static HSSFWorkbook workbook = null;

public static void main(String[] args) {

// 判斷后綴是xls,還是xlsx

String path = "d:/user.xls";

File file = new File(path);

if (checkFile(file)) {

// 進行后綴為xlsx的Excel操作

xlsx(file);

} else {

// 進行xls的操作

xls(file);

}

}

// 檢查該文件是否是xls,還是xlsx類型

private static boolean checkFile(File file) {

boolean flg = false;

if (file.exists()) {

String name = file.getName();

// String lastindex = name.substring(name.lastIndexOf(".") + 1);

if (name.endsWith(EXCEL_XLSX))

flg = true;

else

flg = false;

} else {

System.out.println("文件不存在");

}

return flg;

}

// 如果是xlsx,做什么操作

private static void xlsx(File file) {

try {

xssfWorkbook = new XSSFWorkbook(new FileInputStream(file));

show(xssfWorkbook);

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

//他們兩者都有相同的父類,而且都是父類中的方法操作,那我干脆點直接將他們用父類的形式抽取出來,這樣解決了代碼的冗余問題

private static void show(Workbook workbook) {

// 循環工作表Sheet

for (int numSheet = 0; numSheet < workbook.getNumberOfSheets(); numSheet++) {

Sheet xssfSheet = workbook.getSheetAt(numSheet);

// 這種主要是判斷是否含空以免包空指針

if (xssfSheet == null) {

continue;

}

// 循環行Row

// 從第三行讀取(這個根據自己的實際需求而定,因為我是在第三行之后才是我需要的數據)

for (int rowNum = 3; rowNum <= xssfSheet.getLastRowNum(); rowNum++) {

Row xssfRow = xssfSheet.getRow(rowNum);

if (xssfRow == null) {

continue;

}

// 循環列Cell

System.out.println("多少列" + xssfRow.getLastCellNum());

for (int cellNum = 0; cellNum <= xssfRow.getLastCellNum(); cellNum++) {

Cell xssfCell = xssfRow.getCell(cellNum);

if (xssfCell == null) {

continue;

}

System.out.println(getValue(xssfCell, workbook));

}

System.out.print("******");

}

}

}

// 如果是就做什么操作

private static void xls(File file) {

try {

InputStream inputStream = new FileInputStream(file);

workbook = new HSSFWorkbook(inputStream);

show(workbook);

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

@SuppressWarnings("static-access")

// 將他們兩者的父類抽取出來,這樣減少代碼量,同時便於管理

private static String getValue(Cell xssfCell, Workbook workbook) {

String value = "";

switch (xssfCell.getCellType()) {

case Cell.CELL_TYPE_STRING:

value = String.valueOf(xssfCell.getRichStringCellValue()

.getString());

System.out.print("|");

break;

case Cell.CELL_TYPE_NUMERIC:

if (DateUtil.isCellDateFormatted(xssfCell)) {

value = String.valueOf(String.valueOf(xssfCell

.getDateCellValue()));

} else {

value = String.valueOf(xssfCell.getNumericCellValue());

}

System.out.print("|");

break;

case Cell.CELL_TYPE_BOOLEAN:

value = String.valueOf(xssfCell.getBooleanCellValue());

System.out.print("|");

break;

// 公式,

case Cell.CELL_TYPE_FORMULA:

// 獲取Excel中用公式獲取到的值,//=SUM(P4-Q4-R4-S4)Excel用這種類似的公式計算出來的值用POI無法獲取,要想獲取的話,就必須一下操作

FormulaEvaluator evaluator = workbook.getCreationHelper()

.createFormulaEvaluator();

evaluator.evaluateFormulaCell(xssfCell);

CellValue cellValue = evaluator.evaluate(xssfCell);

value = String.valueOf(cellValue.getNumberValue());

break;

case Cell.CELL_TYPE_ERROR:

value = String.valueOf(xssfCell.getErrorCellValue());

break;

default:

}

return value;

}

}

架包鏈接:

鏈接:http://pan.baidu.com/s/1i4DGVuX 密碼:6xrw

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值