用 Apache POI 读取 XLSX 数据

最近因为项目的原因,需要从一些 Microsoft Office Excel 文件读取数据并加载到数据库。

Google了一下方法,发现其实可以用的 Java 第三方库很多,最著名的是 Apache 的 POI 开源项目,其官网地址是 https://poi.apache.org

从首页的简介中我发现这个项目功能非常强大,不仅能处理 Excel,它还可以处理 Word、PowerPoint、Outlook、Visio,基本上囊括了 MS Office 的全部常用组件。目前 POI 更新到了 3.16 版本,可以从这个页面下载 https://poi.apache.org/download.html#POI-3.16

和所有的 Apache 开源项目一样,POI 下载页面同时提供源码和编译好的库文件下载,有时间的朋友建议下源码看看,写得非常好(编译用 ant 就行)。下载好库文件后(或者下载源文件自己编译好后),以 External Jars 的形式导入 Eclipse 项目中,就可以开始编程了。

读取 Excel 其实很简单,步骤如下:

1. 使用一个 java.io.FileInputStream 对象打开要访问的 Excel 文件获取一个输入流

2. 用这个文件流创建一个 org.apache.poi.xssf.usermodel.XSSFWorkbook 类的实例

3. 使用 XSSFWorkbook 类的 getSheetAt(int index) 方法读取指定的 sheet,其返回一个 org.apache.poi.xssf.usermodel.XSSFSheet 类的实例

4. 使用 XSSFSheet 类的 getRow(int index) 方法读取指定的 row(这里可以进行一个循环,详情请参阅下面的代码),其返回一个 org.apache.poi.xssf.usermodel.XSSFRow 类的实例

5. 使用 XSSFRow 类的 getCell(int index) 方法读取指定的 cell(同上,可以循环读取,参阅代码),其返回一个 org.apache.poi.xssf.usermodel.XSSFCell 类的实例

6. 根据返回的 Cell 的不同类型,分别处理:字符型数字型直接输出,日期型可以指定一个格式输出,表达式则需要使用 org.apache.poi.ss.usermodel.FormulaEvaluator 类的 evaluate(Cell arg0) 方法先得到表达式的值,然后再进行第二次类型判断后才能输出。

PS:因为目标数据的特性,我只需要把数据输出到标准输出即可。

完整程序如下:

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #4e9072 }
p.p4 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #931a68 }
span.s1 { color: #931a68 }
span.s2 { color: #000000 }
span.s3 { color: #0326cc }
span.s4 { text-decoration: underline }
span.s5 { color: #7e504f }
span.s6 { color: #4e9072 }
span.s7 { color: #3933ff }

package com.peisu.xlsx;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.InputStream;

import java.text.SimpleDateFormat;

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.xssf.usermodel.XSSFCell;

import org.apache.poi.xssf.usermodel.XSSFRow;

import org.apache.poi.xssf.usermodel.XSSFSheet;

import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class XLSXLoader {

//Define the variables

private static InputStream inputStream;

private static XSSFWorkbook xssfWorkbook;

private static FormulaEvaluator formulaEvaluator;

private static int maxCellCount  = 0;

//args[0]: the path to the xlsx file

//args[1]: the sheet number to process, start from 0

//args[2]: the date format output to standard output, for example, yyyy-MM-dd

//args[3]: start from which line to read, if there is a header, start from line 1

public static void main(String[] args) {

try {

//Open the input stream from the file, initialize the workbook

inputStream = new FileInputStream(args[0]);

xssfWorkbook = new XSSFWorkbook(inputStream);

formulaEvaluator = xssfWorkbook.getCreationHelper().createFormulaEvaluator();

//Open the sheet

XSSFSheet xssfSheet = xssfWorkbook.getSheetAt(Integer.valueOf(args[1]));

if (xssfSheet != null){

//Get the first row of the sheet

XSSFRow firstXSSFRow = xssfSheet.getRow(0);

if (firstXSSFRow != null){

//Set the max cell count to be the last cell number of the first line

maxCellCount = firstXSSFRow.getLastCellNum();

//Loop to read the rows

for (int rowNum = Integer.valueOf(args[3]);rowNum <= xssfSheet.getLastRowNum();rowNum++) {

//Get the row

XSSFRow xssfRow = xssfSheet.getRow(rowNum);

if (xssfRow != null){

//Loop to read the cells

for (int cellNum = 0;cellNum < maxCellCount;cellNum++){

//Get the cell

XSSFCell xssfCell = xssfRow.getCell(cellNum);

if (xssfCell != null){

//Process the cell based on the cell type

switch (xssfCell.getCellTypeEnum()){

case STRING:

System.out.print(xssfCell.getStringCellValue());

break;

case NUMERIC:

//If the cell matches the date format, output the cell as a date

if (DateUtil.isCellDateFormatted(xssfCell)) {

SimpleDateFormat dateFormat = new SimpleDateFormat(args[2]);

System.out.print(dateFormat.format(xssfCell.getDateCellValue()));

}

else

System.out.print(xssfCell.getNumericCellValue());

break;

case BOOLEAN:

System.out.print(xssfCell.getBooleanCellValue());

break;

case FORMULA:

//For formula cell, evaluate the formula to get the result

CellValue cellValue = formulaEvaluator.evaluate(xssfCell);

//Process the formula cell based on the type of the result

switch(cellValue.getCellTypeEnum()){

case STRING:

System.out.print(xssfCell.getStringCellValue());

break;

case NUMERIC:

//If the result matches the date format, output the result as a date

if (DateUtil.isCellDateFormatted(xssfCell)) {

SimpleDateFormat dateFormat = new SimpleDateFormat(args[2]);

System.out.print(dateFormat.format(xssfCell.getDateCellValue()));

}

else

System.out.print(xssfCell.getNumericCellValue());

break;

case BOOLEAN:

System.out.print(xssfCell.getBooleanCellValue());

break;

default:

System.out.print(xssfCell.getRawValue());

}

break;

case ERROR:

//System.out.print(xssfCell.getErrorCellString());

System.out.print("");

break;

default:

System.out.print(xssfCell.getRawValue());

}

}

//Add a column delimiter between the output cells

if(cellNum < maxCellCount - 1)

System.out.print("\t");

}

}

//Add a row delimiter between the output rows

System.out.println("");

}

}

}

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

} finally {

try {

xssfWorkbook.close();

inputStream.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #4e9072 }
p.p4 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #931a68 }
span.s1 { color: #931a68 }
span.s2 { color: #000000 }
span.s3 { color: #0326cc }
span.s4 { text-decoration: underline }
span.s5 { color: #7e504f }
span.s6 { color: #4e9072 }
span.s7 { color: #3933ff }
span.Apple-tab-span { white-space: pre }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #4e9072 }
p.p4 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #931a68 }
span.s1 { color: #931a68 }
span.s2 { color: #000000 }
span.s3 { color: #0326cc }
span.s4 { text-decoration: underline }
span.s5 { color: #7e504f }
span.s6 { color: #4e9072 }
span.s7 { color: #3933ff }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #4e9072 }
p.p4 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #931a68 }
span.s1 { color: #931a68 }
span.s2 { color: #000000 }
span.s3 { color: #0326cc }
span.s4 { text-decoration: underline }
span.s5 { color: #7e504f }
span.s6 { color: #4e9072 }
span.s7 { color: #3933ff }

时间: 2024-10-28 04:34:09

用 Apache POI 读取 XLSX 数据的相关文章

使用Apache POI 读取Excel文件

生活中用到用到Excel文件的情况很多,什么商品进货单,产品维修单,餐厅的营业额等等.作为程序员,我们该如何读取Excel文件,获取我们想要的资源呢.本篇将讲解如何使用Apache POI读取Excel文件. 准备工作: 1)Apache POI 开发jar包 2)Excel资源文件,包括Excel2003,Excel2007这两种版本分别对应xls.xlsx文件. 本篇已经为您做好准备工作,请点击此处,下载资源文件,你也可以浏览Apace POI官网了解更多详细信息. 简要流程: 获取Work

poi读取xlsx

知道 大家都知道用poi读取xls  当时有时候 必须要读取xlsx  现在我把我做测试的demo分享给大家 package com.lt.main; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.util.ArrayList; im

使用poi读取xlsx中的数据

excel中的内容见下图: 详细代码: package dataprovider; import java.io.FileInputStream; import java.io.InputStream; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; pub

Apache POI读取和创建Excel ----01(简单操作)

public class ExcelCreatAndRead { /**     * 使用Apache POI创建Excel文档     * */    public static void createXL(){        /**Excel文件要存放的位置,假定在D盘下*/        String outputFile="D:\\test.xlsx";        try {        //创建新的Excel工作薄        XSSFWorkbook workboo

POI读取Excel数据保存到数据库,并反馈给用户处理信息

今天遇到这么一个需求,将课程信息以Excel的形式导入数据库,并且课程编号再数据库中不能重复,也就是我们需要先读取Excel提取信息之后保存到数据库,并将处理的信息反馈给用户.于是想到了POI读取文件提取数据,也可以利用Jxl读取Excel提取数据. 最终效果: 对于下面的Excel,总共20条数据.18条在数据库已经存在,最后两条是在同一个excel文件中重复在数据库不存在. 反馈结果:(也就是最后两个X6511只保存了一条) 思路: 1.先将Excel文件上传到本地,保存到本地磁盘 2.读取

读取Excel表格报错问题总结(用apache POI读取,表格稍微改动就报错导入不进去)

 首先是建立在用apachePOI解析Excel时一定几率是能成功解析导入的,如果一点也不能的话,也可以参考看看我总结的原因,也许也是导致你屡次导入不能的原因之一. 这个问题是前天客户反应的,不用下载的好的模版套进内容再导入的话就报错,怎么也导入不进去,客户即想用从其他直接导出的数据导入我们的产品中用想能自己复制一些其他的内容到自己建立的excel表格中导入进去.今天晚上特意抽出时间来总结一产生这个问题的几个原因. 第一个原因就是,我最后发现我们的产品中excel导入这个组件(用apache

使用POI读取xlsx文件,包含对excel中自定义时间格式的处理

package poi; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date;

java使用org.apache.poi读取与保存EXCEL文件

---恢复内容开始--- 一.读EXCEL文件 1 package com.ruijie.wis.cloud.utils; 2 3 import java.io.FileInputStream; 4 import java.io.FileNotFoundException; 5 import java.io.IOException; 6 import java.io.InputStream; 7 import java.text.DecimalFormat; 8 import java.util

apache poi读取excel(03版本之前)

一:首先导入如下三个poi包: 上述三个包下载地址:http://download.csdn.net/detail/wangzihu/8420333 二:示例代码 package com.lenovo.storage.web.util; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; impo