POI导入excel文件2
POI上传到服务器读取excel文件1中已经介绍了上传文件和导入excel所有的内容http://www.cnblogs.com/fxwl/p/5896893.html ,
本文中只是单单读取本地文件并打印到空值台
并对列合并单元格进行了简单的排除
package com.daat.manager.base.web.tools; import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.PushbackInputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern; import org.apache.poi.POIXMLDocument;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Cell;
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.ss.usermodel.WorkbookFactory;
import org.apache.poi.ss.util.CellRangeAddress; public class ExcelInfo { public static void main(String[] args){
long start2003 = System.currentTimeMillis();
String path2003 = "D:\\";
String FileName="aaaaa.xls";
excelInfo(path2003,FileName);
long end2003 = System.currentTimeMillis();
System.out.println("解析Excel2003完毕!共用时"+(end2003-start2003)+"毫秒!");
}
public static List excelInfo(String path,String FileName){
List excellist=new ArrayList();
String path2003 = "";//Excel2003文件路径
//解析Excel
excellist = parseExcel(path+File.separator+FileName);
System.out.println(excellist.size());
// deleteFile(path,FileName);
return excellist;
}
/**
* 根据路径加载解析Excel
* @param path
* @return
*/
public static List parseExcel(String path){
List excellist = new ArrayList();
System.out.println(path);
Map map = new HashMap();
File file = null;
InputStream input = null;
Workbook workBook = null;
Sheet sheet = null;
if (path != null && path.length() > ) {
// 判断文件是否是Excel(2003、2007)
String suffix = path.substring(path.lastIndexOf("."), path.length()); if (".xls".equals(suffix) || ".xlsx".equals(suffix)) {// 2003后缀或2007后缀
file = new File(path);
try {
input = new FileInputStream(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
throw new RuntimeException("未找到指定的文件!");
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("读取Excel文件发生异常!");
} if (!input.markSupported()) {
input = new PushbackInputStream(input, );
}
try {
if (POIFSFileSystem.hasPOIFSHeader(input)
|| POIXMLDocument.hasOOXMLHeader(input)) {
workBook = WorkbookFactory.create(input);
} else {
throw new RuntimeException("非法的输入流:当前输入流非OLE2流或OOXML流!");
}
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("创建表格工作簿对象发生IO异常!原因:"+ e.getMessage());
} catch (InvalidFormatException e) {
// Your InputStream was neither an OLE2 stream, nor an OOXML
// stream.
e.printStackTrace();
throw new RuntimeException("非法的输入流:当前输入流非OLE2流或OOXML流!");
}
try {
if (workBook != null) {
int numberSheet = workBook.getNumberOfSheets();
if (numberSheet > ) {
sheet = workBook.getSheetAt();// 获取第一个工作簿(Sheet)的内容【注意根据实际需要进行修改】
//getExcelContent(sheet);
readExcelSheet(sheet,);
} else {
throw new RuntimeException("目标表格工作簿(Sheet)数目为0!");
}
}
input.close();
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("关闭输入流异常!" + e.getMessage());
}
} else {
throw new RuntimeException("非法的Excel文件后缀!");
}
} else {
throw new RuntimeException("非法的文件路径!");
}
return excellist;
} /**
* 解析(读取)Excel内容
* @param sheet
* @return
*/
@SuppressWarnings("static-access")
public static void getExcelContent(Sheet sheet){ int rowCount = sheet.getPhysicalNumberOfRows();// 总行数
int colCount = sheet.getRow().getPhysicalNumberOfCells();// 总列数
if(rowCount<=){
throw new RuntimeException("内容为空");
}
Row titleRow=sheet.getRow();//标题行
for(int i=;i<rowCount;i++){
List excetList =new ArrayList();
Row row = sheet.getRow(i);// 第i行
Cell cell = row.getCell();// 列1列
for(int j=;j<colCount;j++){
if(cell.getCellType() == cell.CELL_TYPE_BLANK){//空值
excetList.add(" ");
}else if(cell.getCellType()==cell.CELL_TYPE_STRING){//string类型
excetList.add(cell.getStringCellValue().trim());
}else if(cell.getCellType() == cell.CELL_TYPE_NUMERIC){//数字类型
if (HSSFDateUtil.isCellDateFormatted(cell)) {//日期类型
excetList.add(cell.getDateCellValue());
}else{
excetList.add(cell.getNumericCellValue());
}
}
}
System.out.println("第"+i++"行-----"+excetList.toString());
} } /**
* 读取excel文件
* @param wb
* @param sheetIndex sheet页下标:从0开始
* @param startReadLine 开始读取的行:从0开始
* @param tailLine 去除最后读取的行
*/
public static void readExcelSheet( Sheet sheet, int startReadLine) { Row row = null;
List strlist=new ArrayList();
for(int i=startReadLine; i<=sheet.getLastRowNum(); i++) { row = sheet.getRow(i);
for(Cell c : row) {
c.setCellType(Cell.CELL_TYPE_STRING);
boolean isMerge = isMergedRegion(sheet, i, c.getColumnIndex());
//判断是否具有合并单元格
if(isMerge) {
String rs = getMergedRegionValue(sheet, row.getRowNum(), c.getColumnIndex());
if(!contains(strlist,rs)){
System.out.print(rs + " ");
} }else {
System.out.print(c.getRichStringCellValue()+" ");
}
}
System.out.println(); } } /**
* 获取合并单元格的值
* @param sheet
* @param row
* @param column
* @return
*/
public static String getMergedRegionValue(Sheet sheet ,int row , int column){ int sheetMergeCount = sheet.getNumMergedRegions(); for(int i = ; i < sheetMergeCount ; i++){
CellRangeAddress ca = sheet.getMergedRegion(i);
int firstColumn = ca.getFirstColumn();
int lastColumn = ca.getLastColumn();
int firstRow = ca.getFirstRow();
int lastRow = ca.getLastRow(); if(row >= firstRow && row <= lastRow){ if(column >= firstColumn && column <= lastColumn){
Row fRow = sheet.getRow(firstRow);
Cell fCell = fRow.getCell(firstColumn);
return getCellValue(fCell) ;
}
}
} return null ;
} /**
* 获取单元格的值
* @param cell
* @return
*/
public static String getCellValue(Cell cell) { if (cell == null)
return ""; if (cell.getCellType() == Cell.CELL_TYPE_STRING) { return cell.getStringCellValue(); } else if (cell.getCellType() == Cell.CELL_TYPE_BOOLEAN) { return String.valueOf(cell.getBooleanCellValue()); } else if (cell.getCellType() == Cell.CELL_TYPE_FORMULA) { return cell.getCellFormula(); } else if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) { return String.valueOf(cell.getNumericCellValue()); }
return "";
} /**
* 判断合并了行
* @param sheet
* @param row
* @param column
* @return
*/
@SuppressWarnings("unused")
public static boolean isMergedRow(Sheet sheet,int row ,int column) { int sheetMergeCount = sheet.getNumMergedRegions();
for (int i = ; i < sheetMergeCount; i++) {
CellRangeAddress range = sheet.getMergedRegion(i);
int firstColumn = range.getFirstColumn();
int lastColumn = range.getLastColumn();
int firstRow = range.getFirstRow();
int lastRow = range.getLastRow();
if(row == firstRow && row == lastRow){
if(column >= firstColumn && column <= lastColumn){
return true;
}
}
}
return false;
} /**
* 判断指定的单元格是否是合并单元格
*
* @param sheet
* @param row
* 行下标
* @param column
* 列下标
* @return
*/
@SuppressWarnings("unused")
public static boolean isMergedRegion(Sheet sheet, int row, int column) { int sheetMergeCount = sheet.getNumMergedRegions();
for (int i = ; i < sheetMergeCount; i++) { CellRangeAddress range = sheet.getMergedRegion(i);
int firstColumn = range.getFirstColumn();
int lastColumn = range.getLastColumn();
int firstRow = range.getFirstRow();
int lastRow = range.getLastRow();
if (row >= firstRow && row <= lastRow) {
if (column >= firstColumn && column <= lastColumn) {
return true;
}
}
}
return false;
} /**
* 判断sheet页中是否含有合并单元格
* @param sheet
* @return
*/
public boolean hasMerged(Sheet sheet) {
return sheet.getNumMergedRegions() > ? true : false;
} /**
* 合并单元格
*
* @param sheet
* @param firstRow
* 开始行
* @param lastRow
* 结束行
* @param firstCol
* 开始列
* @param lastCol
* 结束列
*/
@SuppressWarnings("unused")
public void mergeRegion(Sheet sheet, int firstRow, int lastRow,
int firstCol, int lastCol) {
sheet.addMergedRegion(new CellRangeAddress(firstRow, lastRow, firstCol,
lastCol));
}
/**
* 判断某个字符串是否存在于数组中
* @param stringArray 原数组
* @param source 查找的字符串
* @return 是否找到
*/
public static boolean contains(List stringArray, String source) {
// 利用list的包含方法,进行判断
if (stringArray.contains(source)) {
return true;
} else {
stringArray.add(source);
return false;
}
} }
转载表明出处谢谢
POI导入excel文件2的更多相关文章
- Java POI导入Excel文件
今天在公司需要做个导入Excel文件的功能,所以研究了一下,参考网上的一些资料总算是做出来了,在此记录一下防止以后忘记怎么弄. 本人用的是poi3.8,所以需要的JAR包如下: poi-3.8.jar ...
- 友好解决POI导入Excel文件行是不是为空
继 解决POI读取Excel如何判断行是不是为空 后发现了一个问题.这个是一个银行的需求,有20万个客户的资料要导入系统,但有的资料是有问题的(不能正常导入),但也有能正常导入的.现在的问题是怎么知道 ...
- java如何导入Excel文件
Java使用POI导入Excel文件,操作起来比较简单,支持xlsx格式. 下载POI资源包 从官网https://poi.apache.org/下载POI,笔者选择的是版本是3.17,下载后文件名是 ...
- Java 使用poi导入excel,结合xml文件进行数据验证的例子(增加了jar包)
ava 使用poi导入excel,结合xml文件进行数据验证的例子(增加了jar包) 假设现在要做一个通用的导入方法: 要求: 1.xml的只定义数据库表中的column字段,字段类型,是否非空等条件 ...
- 项目一:第四天 1、快递员的条件分页查询-noSession,条件查询 2、快递员删除(逻辑删除) 3、基于Apache POI实现批量导入区域数据 a)Jquery OCUpload上传文件插件使用 b)Apache POI读取excel文件数据
1. 快递员的条件分页查询-noSession,条件查询 2. 快递员删除(逻辑删除) 3. 基于Apache POI实现批量导入区域数据 a) Jquery OCUpload上传文件插件使用 b) ...
- java使用POI操作excel文件,实现批量导出,和导入
一.POI的定义 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Excel 95, 97, 2000也即以.xls为后缀的excel.而poi可以操作Exc ...
- springMVC(5)---导入excel文件数据到数据库
springMVC(5)---导入excel文件数据到数据库 上一篇文章写了从数据库导出数据到excel文件,这篇文章悄悄相反,写的是导入excel文件数据到数据库.上一篇链接:springMVC(4 ...
- excel数据 入库mysql 和 mysql数据 导入excel文件
1.excel数据入库mysql 首先准备excel文件, 标红的地方需要留意,一个是字段名所在行,一个表名对应页: 然后私用mysql工具 navicat, 选择数据库,然后导入文件, 选中相应ex ...
- Java解析导入Excel文件后台代码实现
使用MultipartFile上传Excel文件后端代码实现:(springmvc下的spring-webmvc (MultipartFile )上传) 由于POST一个包含文件上传的Form会以mu ...
随机推荐
- Annotation 使用备忘2
title: Annotation 使用备忘 date: 2018-01-02 20:48:43 tags: [Annotation] categories: [Programming,Java] - ...
- Spring Cloud限流思路及解决方案
转自: http://blog.csdn.net/zl1zl2zl3/article/details/78683855 在高并发的应用中,限流往往是一个绕不开的话题.本文详细探讨在Spring Clo ...
- Python基础_异常处理与跟踪
异常的种类 AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x IOError 输入/输出异常:基本上是无法打开文件 ImportError 无法引入模块或 ...
- 安装Visual studio 2013并进行单元测试
刚开始在没有老师的指导下自己弄了一个简单的单元测试,最后与老师的对比发现错误百出,于是另起一篇.安装VS2013没有什么问题,安装过程如下图: 接下来别开始练习书上的单元测试. 先是简单的创建C#的类 ...
- 渐入OO课的深处,探索多线程的秘密——OO第二次博客总结
一次又一次的挑战,一次又一次全新的知识,我来到了多线程的面前 第五次作业 1.度量分析 >第五次作业由于很大程度上调用的是前两次电梯的一些代码,所以存在的问题与前几次也十分相似.同时由于第一次使 ...
- vue 过渡效果
Vue中提供了`<transition>`和`<transition-group>`来为元素增加过渡动画.文档写的很清楚,但是实际使用起来还是费了一番功夫.这里做一个简单的记录 ...
- 0506Scrum项目1.0
1.确定选题. 应用NABCD模型,分析你们初步选定的项目,充分说明你们选题的理由. 录制为演说视频,上传到视频网站,并把链接发到团队博客上. 截止日期:2016.5.6日晚10点 团队名称:虫洞 团 ...
- 【第二周】PSP
日期 C类别 C内容 S开始时间 E结束时间 I间隔(单位:分钟) T净时间(单位:分钟) 9月8日 编程 结对编程 12:15 13:15 10 50 编程 结对编程 16:35 17:30 ...
- 获取字符串中某个指定的子串出现的开始位置(CHARINDEX用法)
CHARINDEX作用 写SQL语句我们经常需要判断一个字符串中是否包含另一个字符串,但是SQL SERVER中并没有像C#提供了Contains函数,不过SQL SERVER中提供了一个叫CHAEI ...
- linux中inittab文件详解
init的进程号是1(ps -aux | less),从这一点就能看出,init进程是系统所有进程的起点,Linux在完成核内引导以后,就开始运行init程序. init程序需要读取配置文件/etc/ ...