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 ...
随机推荐
- [linux] ssh远程执行本地脚本
1.ssh密钥登录 略 2.免确认机器指纹,ssh -o StrictHostKeyChecking=no [root@XM-v125 ~]# ssh wykai@192.168.0.110 The ...
- Django_cookie+session
一.cookie和session介绍 cookie 由服务器产生内容,浏览器收到请求后保存在本地:当浏览器再次访问时,浏览器会自动带上cookie,这样服务器就能通过cookie的内容来判断这个是“谁 ...
- MVC 漫长之路(一)
1.新建项目 mvc 视图引擎选中 Razor 2.允许我们设置这个项目关于 MVC 的一些设置,确认选中了“空”项目模板 3. 4.打开 Global.asax 文件 配置路由名称等 ...
- Scrum Meeting 10.26
1.会议内容 姓名 今日任务 明日任务 预估时间(h) 徐越 学习服务器配置 配置SQLserver 4 卞忠昊 阅读代码 找上届代码的bug 3 武鑫 查阅资料 查阅资料,各种app的界面设计 3 ...
- Daily Scrumming 2015.10.23(Day 4)
今明两天任务表 Member Today’s Task Tomorrow’s Task 江昊 继续学习rails ActiveRecord 数据库迁移 域名备案申请 学习rails router配置与 ...
- OO第四次作业-对前三次作业总结
第一次作业由于直接没怎么学过java,全靠一星期速成,前几天看了java的语法,但是因为光看没有打代码,学习效果并不是特别好.由面向过程转向面向对象,不是特别清楚该怎么办,虽然写的是两个类,但实际上是 ...
- 跟踪调试Linux内核的启动过程
跟踪调试Linux内核的启动过程---使用gdb 符钰婧 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/UST ...
- YQCB冲刺第二周第二天
今天的任务依然为实现查看消费明细的功能. 遇到的问题为从数据库中分类读取,实现图标的显示. 站立会议为: 任务面板为:
- 02.基于IDEA+Spring+Maven搭建测试项目--详细过程
一.背景介绍 1.1公司相关技术 Git:是一款免费的开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目,方便多人集成开发 Maven:是基于项目对象模型(POM),可以通过一小段描述信息 ...
- BZOJ5305 HAOI2018苹果树(概率期望+动态规划)
每种父亲编号小于儿子编号的有标号二叉树的出现概率是相同的,问题相当于求所有n个点的此种树的所有结点两两距离之和. 设f[n]为答案,g[n]为所有此种树所有结点的深度之和,h[n]为此种树的个数. 枚 ...