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的更多相关文章

  1. Java POI导入Excel文件

    今天在公司需要做个导入Excel文件的功能,所以研究了一下,参考网上的一些资料总算是做出来了,在此记录一下防止以后忘记怎么弄. 本人用的是poi3.8,所以需要的JAR包如下: poi-3.8.jar ...

  2. 友好解决POI导入Excel文件行是不是为空

    继 解决POI读取Excel如何判断行是不是为空 后发现了一个问题.这个是一个银行的需求,有20万个客户的资料要导入系统,但有的资料是有问题的(不能正常导入),但也有能正常导入的.现在的问题是怎么知道 ...

  3. java如何导入Excel文件

    Java使用POI导入Excel文件,操作起来比较简单,支持xlsx格式. 下载POI资源包 从官网https://poi.apache.org/下载POI,笔者选择的是版本是3.17,下载后文件名是 ...

  4. Java 使用poi导入excel,结合xml文件进行数据验证的例子(增加了jar包)

    ava 使用poi导入excel,结合xml文件进行数据验证的例子(增加了jar包) 假设现在要做一个通用的导入方法: 要求: 1.xml的只定义数据库表中的column字段,字段类型,是否非空等条件 ...

  5. 项目一:第四天 1、快递员的条件分页查询-noSession,条件查询 2、快递员删除(逻辑删除) 3、基于Apache POI实现批量导入区域数据 a)Jquery OCUpload上传文件插件使用 b)Apache POI读取excel文件数据

    1. 快递员的条件分页查询-noSession,条件查询 2. 快递员删除(逻辑删除) 3. 基于Apache POI实现批量导入区域数据 a) Jquery OCUpload上传文件插件使用 b) ...

  6. java使用POI操作excel文件,实现批量导出,和导入

    一.POI的定义 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Excel 95, 97, 2000也即以.xls为后缀的excel.而poi可以操作Exc ...

  7. springMVC(5)---导入excel文件数据到数据库

    springMVC(5)---导入excel文件数据到数据库 上一篇文章写了从数据库导出数据到excel文件,这篇文章悄悄相反,写的是导入excel文件数据到数据库.上一篇链接:springMVC(4 ...

  8. excel数据 入库mysql 和 mysql数据 导入excel文件

    1.excel数据入库mysql 首先准备excel文件, 标红的地方需要留意,一个是字段名所在行,一个表名对应页: 然后私用mysql工具 navicat, 选择数据库,然后导入文件, 选中相应ex ...

  9. Java解析导入Excel文件后台代码实现

    使用MultipartFile上传Excel文件后端代码实现:(springmvc下的spring-webmvc (MultipartFile )上传) 由于POST一个包含文件上传的Form会以mu ...

随机推荐

  1. python FTP服务器实现(Python3)

    创建一个ftp.py文件(Linux环境),插入以下代码: from pyftpdlib.authorizers import DummyAuthorizer from pyftpdlib.handl ...

  2. Spring Data REST PATCH请求远程代码执行漏洞(CVE-2017-8046) 本地复现方法

      #1背景 Spring Data REST是Spring Data项目的一部分,可以轻松地在Spring Data存储库之上构建超媒体驱动的REST Web服务. 恶意的PATCH请求使用精心构造 ...

  3. Python基础_可迭代的/迭代器/生成器

    介绍 可迭代的:内部实现了__iter__方法 迭代器:内部实现了__iter__,__next__方法 生成器:yield,yield from 使用 __iter__() __next__() _ ...

  4. bootstrap中的data-toggle模态框相关

    一,点击即打开1,点击按钮 <a href="javascript:void(0)" class="btn btn-primary" data-toggl ...

  5. 使用sql查询mysql/oracle/sql server/gp数据库中指定表的字段信息(字段名/字段类型/字段长度/是否是主键/是否为空)

    1,根据数据库类型拼接不同URL /** * 根据类型不同拼接连接的URL * @param dbType 1:mysql.2:oracle.3:sql server.4:gp * @param ip ...

  6. 第三次作业— C++计算器项目的初始部分

    作业题目: C++计算器项目的初始部分 仓库 代码: Scan.h #ifndef SCAN_H #define SCAN_H #include<string> #include<i ...

  7. POJ 2411 Mondriaan's Dream 插头dp

    题目链接: http://poj.org/problem?id=2411 Mondriaan's Dream Time Limit: 3000MSMemory Limit: 65536K 问题描述 S ...

  8. 索引超出了数组界限。 在 System.Collections.Generic.Dictionary`2.Resize

    博问:Dictionary 超出了数组界限 异常: Exception type: IndexOutOfRangeException Exception message: 索引超出了数组界限. 在 S ...

  9. Beta版本发布140字评论

    1.飞天小女警组: 礼物挑选工具:系统界面十分新颖,相比于前阶段,增加了账号登陆的功能,并且还根据不同的价位区间添加了礼物的图片,并根据礼物的受欢迎程度添加了top10的功能,并且增加了关于本网站的问 ...

  10. Powershell笔记之MVA课程

    很早之前看过MVA的Powershell课程,最近准备回顾一下,还是有一些意外的收获. <<快速入门 : PowerShell 3.0 高级工具和脚本>> 1. Invoke- ...