java的excel导入_Java操作Excel文件导入

75a3bf8974c9bd5a56863a745113d139.gif 可以支持公式、日期等格式!

966903dea4bcb507358d5dcce8b912e5.gif

不说废话,上代码:

/**

* Jun 25, 2012

*/

import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

import java.io.InputStream;

import java.util.ArrayList;

import java.util.List;

import org.apache.commons.io.FilenameUtils;

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.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;

/**

* Excel组件

*

* @author Snowolf

* @version 1.0

* @since 1.0

*/

public abstract class ExcelHelper {

/**

* Excel 2003

*/

private final static String XLS = "xls";

/**

* Excel 2007

*/

private final static String XLSX = "xlsx";

/**

* 分隔符

*/

private final static String SEPARATOR = "|";

/**

* 由Excel文件的Sheet导出至List

*

* @param file

* @param sheetNum

* @return

*/

public static List exportListFromExcel(File file, int sheetNum)

throws IOException {

return exportListFromExcel(new FileInputStream(file),

FilenameUtils.getExtension(file.getName()), sheetNum);

}

/**

* 由Excel流的Sheet导出至List

*

* @param is

* @param extensionName

* @param sheetNum

* @return

* @throws IOException

*/

public static List exportListFromExcel(InputStream is,

String extensionName, int sheetNum) throws IOException {

Workbook workbook = null;

if (extensionName.toLowerCase().equals(XLS)) {

workbook = new HSSFWorkbook(is);

} else if (extensionName.toLowerCase().equals(XLSX)) {

workbook = new XSSFWorkbook(is);

}

return exportListFromExcel(workbook, sheetNum);

}

/**

* 由指定的Sheet导出至List

*

* @param workbook

* @param sheetNum

* @return

* @throws IOException

*/

private static List exportListFromExcel(Workbook workbook,

int sheetNum) {

Sheet sheet = workbook.getSheetAt(sheetNum);

// 解析公式结果

FormulaEvaluator evaluator = workbook.getCreationHelper()

.createFormulaEvaluator();

List list = new ArrayList();

int minRowIx = sheet.getFirstRowNum();

int maxRowIx = sheet.getLastRowNum();

for (int rowIx = minRowIx; rowIx <= maxRowIx; rowIx++) {

Row row = sheet.getRow(rowIx);

StringBuilder sb = new StringBuilder();

short minColIx = row.getFirstCellNum();

short maxColIx = row.getLastCellNum();

for (short colIx = minColIx; colIx <= maxColIx; colIx++) {

Cell cell = row.getCell(new Integer(colIx));

CellValue cellValue = evaluator.evaluate(cell);

if (cellValue == null) {

continue;

}

// 经过公式解析,最后只存在Boolean、Numeric和String三种数据类型,此外就是Error了

// 其余数据类型,根据官方文档,完全可以忽略http://poi.apache.org/spreadsheet/eval.html

switch (cellValue.getCellType()) {

case Cell.CELL_TYPE_BOOLEAN:

sb.append(SEPARATOR + cellValue.getBooleanValue());

break;

case Cell.CELL_TYPE_NUMERIC:

// 这里的日期类型会被转换为数字类型,需要判别后区分处理

if (DateUtil.isCellDateFormatted(cell)) {

sb.append(SEPARATOR + cell.getDateCellValue());

} else {

sb.append(SEPARATOR + cellValue.getNumberValue());

}

break;

case Cell.CELL_TYPE_STRING:

sb.append(SEPARATOR + cellValue.getStringValue());

break;

case Cell.CELL_TYPE_FORMULA:

break;

case Cell.CELL_TYPE_BLANK:

break;

case Cell.CELL_TYPE_ERROR:

break;

default:

break;

}

}

list.add(sb.toString());

}

return list;

}

}

由于Excel中的数据有日期、公式等等格式,参考http://poi.apache.org/spreadsheet/eval.html做了修改,完全兼容。

966903dea4bcb507358d5dcce8b912e5.gif

当前的Excel,C列是根据A、B相乘计算而来,D列是日期格式:

92e28b05caf1b73705e685248f892a91.png

测试下:

/**

* Jun 25, 2012

*/

import java.io.File;

import java.io.IOException;

import java.util.List;

import static org.junit.Assert.*;

import org.junit.Test;

/**

*

* @author Snowolf

* @version 1.0

* @since 1.0

*/

public class ExcelHelperTest {

@Test

public void test() {

String path = "excel.xlsx";

List list = null;

try {

list = ExcelHelper.exportListFromExcel(new File(path), 0);

assertNotNull(list);

} catch (IOException e) {

fail();

}

}

}

就是这样了

f5f0ee5874a11dbfe627562e5650a796.png

详见附件!

966903dea4bcb507358d5dcce8b912e5.gif

存档于此,备查~~

966903dea4bcb507358d5dcce8b912e5.gif

423b6ee6c1c58faf813288b5cc24bbe1.png

大小: 6.8 KB

c2aa8388c32c0bd4aa0c4b09c2accf1c.png

大小: 5.8 KB

poi.zip (14.3 KB)

下载次数: 1049

12

5

分享到:

18e900b8666ce6f233d25ec02f95ee59.png

72dd548719f0ace4d5f9bca64e1d7715.png

2012-06-27 17:33

浏览 64378

评论

11 楼

zi_wu_xian

2016-09-02

好复杂啊,还是用PageOffice导入excel文件吧,代码简单,生成的文件格式规范

10 楼

sandyagor

2016-08-21

这是一个maven工程,

9 楼

Agwawaw

2015-09-14

项目总是报错,不知为什么

8 楼

yu335738607

2015-08-24

加qq335738607 沟通此问题

7 楼

yu335738607

2015-08-24

有excel  大小限制吗

6 楼

zhenglu119

2013-06-05

XSSFWorkbook 在3.8jar包的情况下。导入不进来, 是神马情况啊。

5 楼

snowolf

2012-06-29

snowolf 写道

snowolf 写道

programdolt 写道

很好,getRichStringCellValue 日期,公式等都支持了?通过

FormulaEvaluator evaluator = workbook.getCreationHelper()

.createFormulaEvaluator();

Cell cell = row.getCell(new Integer(j));

CellValue cellValue = evaluator.evaluate(cell);进行公式、日期等等的解析,完全支持了!

当然,日期支持转换为数字了,需要重新转码了!

case Cell.CELL_TYPE_NUMERIC:

// 这里的日期类型会被转换为数字类型,需要判别后区分处理

if (DateUtil.isCellDateFormatted(cell)) {

sb.append(SEPARATOR + cell.getDateCellValue());

} else {

sb.append(SEPARATOR + cellValue.getNumberValue());

}这样就有对应的日期了,当然,你可以根据需要转换格式!

966903dea4bcb507358d5dcce8b912e5.gif

4 楼

Function

2012-06-28

试试 jxl

3 楼

snowolf

2012-06-28

snowolf 写道

programdolt 写道

很好,getRichStringCellValue 日期,公式等都支持了?通过

FormulaEvaluator evaluator = workbook.getCreationHelper()

.createFormulaEvaluator();

Cell cell = row.getCell(new Integer(j));

CellValue cellValue = evaluator.evaluate(cell);进行公式、日期等等的解析,完全支持了!

当然,日期支持转换为数字了,需要重新转码了!

2 楼

snowolf

2012-06-28

programdolt 写道

很好,getRichStringCellValue 日期,公式等都支持了?通过

FormulaEvaluator evaluator = workbook.getCreationHelper()

.createFormulaEvaluator();

Cell cell = row.getCell(new Integer(j));

CellValue cellValue = evaluator.evaluate(cell);进行公式、日期等等的解析,完全支持了!

1 楼

programdolt

2012-06-27

很好,getRichStringCellValue 日期,公式等都支持了?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值