Java 使用POI导入Excel文件

来源:互联网 发布:免费网络加速器 编辑:程序博客网 时间:2024/05/01 05:11

最近工作中开发个小功能,有个项目需要导入的配置文件是Excel文件,查阅网上资料,是用POI实现的,现把自己实现的过程和简单demo分享一下。
首先需要下载与POI有关的jar包,这个可以从官网下载,网址:https://poi.apache.org/download.html

选择左侧的download,然后拉到最下面,点击Binary Artifacts ,可以下载以前的版本,我用的是poi-bin-3.8-20120326.zip。

代码需要导入的jar包如下,可能有些不太必要。

完整代码如下:

import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;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.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;public class ExcelImportTest {private final static String SEPARATOR = "&";public static void main(String args[]) {String path = "d:/test.xls";File file = new File(path);try {Workbook workbook = null;InputStream is = new FileInputStream(file);if (FilenameUtils.getExtension(file.getName()).toLowerCase().equals("xls")) {//excel2003workbook = new HSSFWorkbook(is);} else if (FilenameUtils.getExtension(file.getName()).toLowerCase().equals("xlsx")) {//excel2007workbook = new XSSFWorkbook(is);}List<String> list = null;//遍历Excel中所有的sheets,如果某个sheet为空,则跳过。for(int i=0;i<workbook.getNumberOfSheets();i++){list = exportListFromExcel(workbook, i);if(list==null){continue;}for(int j=0;j<list.size();j++){String member = list.get(j);System.out.println("member="+member);String[] mem = member.split(SEPARATOR);//由于最前面有SEPARATOR间隔符,k=0是为空,所以从1开始遍历吧for(int k=1;k<mem.length;k++){System.out.println(mem[k]);}}}} catch (FileNotFoundException e1) {// TODO Auto-generated catch blocke1.printStackTrace();} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}private static List<String> exportListFromExcel(Workbook workbook,int sheetNum) {Sheet sheet = workbook.getSheetAt(sheetNum);// 解析公式结果FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator();List<String> list = new ArrayList<String>();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.htmlswitch (cellValue.getCellType()) {case Cell.CELL_TYPE_BOOLEAN:sb.append(SEPARATOR + cellValue.getBooleanValue());break;case Cell.CELL_TYPE_NUMERIC:// 这里的日期类型会被转换为数字类型,需要判别后区分处理//处理数据后会自动处理为double类型,所以这边做了去掉结尾.0if (DateUtil.isCellDateFormatted(cell)) {sb.append(SEPARATOR + cell.getDateCellValue().toString().split("\\.")[0]);} else {sb.append(SEPARATOR + String.valueOf(cellValue.getNumberValue()).split("\\.")[0]);}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;}}

以上demo可以直接运行,如果有错误,查看导入的包是否完整或包版本不一致导致冲突。

导出为Excel的demo见下一篇博客,链接http://blog.csdn.net/bcdmz76/article/details/78820440

原创粉丝点击