POI上传到服务器读取excel文件1中已经介绍了上传文件和导入excel所有的内容http://www.cnblogs.com/fxwl/p/5896893.html ,

本文中只是单单读取本地文件并打印到空值台

并对列合并单元格进行了简单的排除

  1. package com.daat.manager.base.web.tools;
  2.  
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.io.FileNotFoundException;
  6. import java.io.IOException;
  7. import java.io.InputStream;
  8. import java.io.PushbackInputStream;
  9. import java.util.ArrayList;
  10. import java.util.Arrays;
  11. import java.util.Date;
  12. import java.util.HashMap;
  13. import java.util.List;
  14. import java.util.Map;
  15. import java.util.regex.Matcher;
  16. import java.util.regex.Pattern;
  17.  
  18. import org.apache.poi.POIXMLDocument;
  19. import org.apache.poi.hssf.usermodel.HSSFDateUtil;
  20. import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
  21. import org.apache.poi.poifs.filesystem.POIFSFileSystem;
  22. import org.apache.poi.ss.usermodel.Cell;
  23. import org.apache.poi.ss.usermodel.Row;
  24. import org.apache.poi.ss.usermodel.Sheet;
  25. import org.apache.poi.ss.usermodel.Workbook;
  26. import org.apache.poi.ss.usermodel.WorkbookFactory;
  27. import org.apache.poi.ss.util.CellRangeAddress;
  28.  
  29. public class ExcelInfo {
  30.  
  31. public static void main(String[] args){
  32. long start2003 = System.currentTimeMillis();
  33. String path2003 = "D:\\";
  34. String FileName="aaaaa.xls";
  35. excelInfo(path2003,FileName);
  36. long end2003 = System.currentTimeMillis();
  37. System.out.println("解析Excel2003完毕!共用时"+(end2003-start2003)+"毫秒!");
  38. }
  39. public static List excelInfo(String path,String FileName){
  40. List excellist=new ArrayList();
  41. String path2003 = "";//Excel2003文件路径
  42. //解析Excel
  43. excellist = parseExcel(path+File.separator+FileName);
  44. System.out.println(excellist.size());
  45. // deleteFile(path,FileName);
  46. return excellist;
  47. }
  48. /**
  49. * 根据路径加载解析Excel
  50. * @param path
  51. * @return
  52. */
  53. public static List parseExcel(String path){
  54. List excellist = new ArrayList();
  55. System.out.println(path);
  56. Map map = new HashMap();
  57. File file = null;
  58. InputStream input = null;
  59. Workbook workBook = null;
  60. Sheet sheet = null;
  61. if (path != null && path.length() > ) {
  62. // 判断文件是否是Excel(2003、2007)
  63. String suffix = path.substring(path.lastIndexOf("."), path.length());
  64.  
  65. if (".xls".equals(suffix) || ".xlsx".equals(suffix)) {// 2003后缀或2007后缀
  66. file = new File(path);
  67. try {
  68. input = new FileInputStream(file);
  69. } catch (FileNotFoundException e) {
  70. e.printStackTrace();
  71. throw new RuntimeException("未找到指定的文件!");
  72. } catch (Exception e) {
  73. e.printStackTrace();
  74. throw new RuntimeException("读取Excel文件发生异常!");
  75. }
  76.  
  77. if (!input.markSupported()) {
  78. input = new PushbackInputStream(input, );
  79. }
  80. try {
  81. if (POIFSFileSystem.hasPOIFSHeader(input)
  82. || POIXMLDocument.hasOOXMLHeader(input)) {
  83. workBook = WorkbookFactory.create(input);
  84. } else {
  85. throw new RuntimeException("非法的输入流:当前输入流非OLE2流或OOXML流!");
  86. }
  87. } catch (IOException e) {
  88. e.printStackTrace();
  89. throw new RuntimeException("创建表格工作簿对象发生IO异常!原因:"+ e.getMessage());
  90. } catch (InvalidFormatException e) {
  91. // Your InputStream was neither an OLE2 stream, nor an OOXML
  92. // stream.
  93. e.printStackTrace();
  94. throw new RuntimeException("非法的输入流:当前输入流非OLE2流或OOXML流!");
  95. }
  96. try {
  97. if (workBook != null) {
  98. int numberSheet = workBook.getNumberOfSheets();
  99. if (numberSheet > ) {
  100. sheet = workBook.getSheetAt();// 获取第一个工作簿(Sheet)的内容【注意根据实际需要进行修改】
  101. //getExcelContent(sheet);
  102. readExcelSheet(sheet,);
  103. } else {
  104. throw new RuntimeException("目标表格工作簿(Sheet)数目为0!");
  105. }
  106. }
  107. input.close();
  108. } catch (IOException e) {
  109. e.printStackTrace();
  110. throw new RuntimeException("关闭输入流异常!" + e.getMessage());
  111. }
  112. } else {
  113. throw new RuntimeException("非法的Excel文件后缀!");
  114. }
  115. } else {
  116. throw new RuntimeException("非法的文件路径!");
  117. }
  118. return excellist;
  119. }
  120.  
  121. /**
  122. * 解析(读取)Excel内容
  123. * @param sheet
  124. * @return
  125. */
  126. @SuppressWarnings("static-access")
  127. public static void getExcelContent(Sheet sheet){
  128.  
  129. int rowCount = sheet.getPhysicalNumberOfRows();// 总行数
  130. int colCount = sheet.getRow().getPhysicalNumberOfCells();// 总列数
  131. if(rowCount<=){
  132. throw new RuntimeException("内容为空");
  133. }
  134. Row titleRow=sheet.getRow();//标题行
  135. for(int i=;i<rowCount;i++){
  136. List excetList =new ArrayList();
  137. Row row = sheet.getRow(i);// 第i行
  138. Cell cell = row.getCell();// 列1列
  139. for(int j=;j<colCount;j++){
  140. if(cell.getCellType() == cell.CELL_TYPE_BLANK){//空值
  141. excetList.add(" ");
  142. }else if(cell.getCellType()==cell.CELL_TYPE_STRING){//string类型
  143. excetList.add(cell.getStringCellValue().trim());
  144. }else if(cell.getCellType() == cell.CELL_TYPE_NUMERIC){//数字类型
  145. if (HSSFDateUtil.isCellDateFormatted(cell)) {//日期类型
  146. excetList.add(cell.getDateCellValue());
  147. }else{
  148. excetList.add(cell.getNumericCellValue());
  149. }
  150. }
  151. }
  152. System.out.println("第"+i++"行-----"+excetList.toString());
  153. }
  154.  
  155. }
  156.  
  157. /**
  158. * 读取excel文件
  159. * @param wb
  160. * @param sheetIndex sheet页下标:从0开始
  161. * @param startReadLine 开始读取的行:从0开始
  162. * @param tailLine 去除最后读取的行
  163. */
  164. public static void readExcelSheet( Sheet sheet, int startReadLine) {
  165.  
  166. Row row = null;
  167. List strlist=new ArrayList();
  168. for(int i=startReadLine; i<=sheet.getLastRowNum(); i++) {
  169.  
  170. row = sheet.getRow(i);
  171. for(Cell c : row) {
  172. c.setCellType(Cell.CELL_TYPE_STRING);
  173. boolean isMerge = isMergedRegion(sheet, i, c.getColumnIndex());
  174. //判断是否具有合并单元格
  175. if(isMerge) {
  176. String rs = getMergedRegionValue(sheet, row.getRowNum(), c.getColumnIndex());
  177. if(!contains(strlist,rs)){
  178. System.out.print(rs + " ");
  179. }
  180.  
  181. }else {
  182. System.out.print(c.getRichStringCellValue()+" ");
  183. }
  184. }
  185. System.out.println();
  186.  
  187. }
  188.  
  189. }
  190.  
  191. /**
  192. * 获取合并单元格的值
  193. * @param sheet
  194. * @param row
  195. * @param column
  196. * @return
  197. */
  198. public static String getMergedRegionValue(Sheet sheet ,int row , int column){
  199.  
  200. int sheetMergeCount = sheet.getNumMergedRegions();
  201.  
  202. for(int i = ; i < sheetMergeCount ; i++){
  203. CellRangeAddress ca = sheet.getMergedRegion(i);
  204. int firstColumn = ca.getFirstColumn();
  205. int lastColumn = ca.getLastColumn();
  206. int firstRow = ca.getFirstRow();
  207. int lastRow = ca.getLastRow();
  208.  
  209. if(row >= firstRow && row <= lastRow){
  210.  
  211. if(column >= firstColumn && column <= lastColumn){
  212. Row fRow = sheet.getRow(firstRow);
  213. Cell fCell = fRow.getCell(firstColumn);
  214. return getCellValue(fCell) ;
  215. }
  216. }
  217. }
  218.  
  219. return null ;
  220. }
  221.  
  222. /**
  223. * 获取单元格的值
  224. * @param cell
  225. * @return
  226. */
  227. public static String getCellValue(Cell cell) {
  228.  
  229. if (cell == null)
  230. return "";
  231.  
  232. if (cell.getCellType() == Cell.CELL_TYPE_STRING) {
  233.  
  234. return cell.getStringCellValue();
  235.  
  236. } else if (cell.getCellType() == Cell.CELL_TYPE_BOOLEAN) {
  237.  
  238. return String.valueOf(cell.getBooleanCellValue());
  239.  
  240. } else if (cell.getCellType() == Cell.CELL_TYPE_FORMULA) {
  241.  
  242. return cell.getCellFormula();
  243.  
  244. } else if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
  245.  
  246. return String.valueOf(cell.getNumericCellValue());
  247.  
  248. }
  249. return "";
  250. }
  251.  
  252. /**
  253. * 判断合并了行
  254. * @param sheet
  255. * @param row
  256. * @param column
  257. * @return
  258. */
  259. @SuppressWarnings("unused")
  260. public static boolean isMergedRow(Sheet sheet,int row ,int column) {
  261.  
  262. int sheetMergeCount = sheet.getNumMergedRegions();
  263. for (int i = ; i < sheetMergeCount; i++) {
  264. CellRangeAddress range = sheet.getMergedRegion(i);
  265. int firstColumn = range.getFirstColumn();
  266. int lastColumn = range.getLastColumn();
  267. int firstRow = range.getFirstRow();
  268. int lastRow = range.getLastRow();
  269. if(row == firstRow && row == lastRow){
  270. if(column >= firstColumn && column <= lastColumn){
  271. return true;
  272. }
  273. }
  274. }
  275. return false;
  276. }
  277.  
  278. /**
  279. * 判断指定的单元格是否是合并单元格
  280. *
  281. * @param sheet
  282. * @param row
  283. * 行下标
  284. * @param column
  285. * 列下标
  286. * @return
  287. */
  288. @SuppressWarnings("unused")
  289. public static boolean isMergedRegion(Sheet sheet, int row, int column) {
  290.  
  291. int sheetMergeCount = sheet.getNumMergedRegions();
  292. for (int i = ; i < sheetMergeCount; i++) {
  293.  
  294. CellRangeAddress range = sheet.getMergedRegion(i);
  295. int firstColumn = range.getFirstColumn();
  296. int lastColumn = range.getLastColumn();
  297. int firstRow = range.getFirstRow();
  298. int lastRow = range.getLastRow();
  299. if (row >= firstRow && row <= lastRow) {
  300. if (column >= firstColumn && column <= lastColumn) {
  301. return true;
  302. }
  303. }
  304. }
  305. return false;
  306. }
  307.  
  308. /**
  309. * 判断sheet页中是否含有合并单元格
  310. * @param sheet
  311. * @return
  312. */
  313. public boolean hasMerged(Sheet sheet) {
  314. return sheet.getNumMergedRegions() > ? true : false;
  315. }
  316.  
  317. /**
  318. * 合并单元格
  319. *
  320. * @param sheet
  321. * @param firstRow
  322. * 开始行
  323. * @param lastRow
  324. * 结束行
  325. * @param firstCol
  326. * 开始列
  327. * @param lastCol
  328. * 结束列
  329. */
  330. @SuppressWarnings("unused")
  331. public void mergeRegion(Sheet sheet, int firstRow, int lastRow,
  332. int firstCol, int lastCol) {
  333. sheet.addMergedRegion(new CellRangeAddress(firstRow, lastRow, firstCol,
  334. lastCol));
  335. }
  336. /**
  337. * 判断某个字符串是否存在于数组中
  338. * @param stringArray 原数组
  339. * @param source 查找的字符串
  340. * @return 是否找到
  341. */
  342. public static boolean contains(List stringArray, String source) {
  343. // 利用list的包含方法,进行判断
  344. if (stringArray.contains(source)) {
  345. return true;
  346. } else {
  347. stringArray.add(source);
  348. return false;
  349. }
  350. }
  351.  
  352. }

转载表明出处谢谢

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. textarea拖拽控制

    一.用处 textarea默认时允许用户以拖拽形式来改变textarea大小,但textarea的大小变化会撑大其父节点,有时会破坏整体布局,有时我们并不希望textarea随意拖拽. forklif ...

  2. Django_rest_framework_组件(authentication、permission、throttle)

    认证组件 说明 from rest_framework.authentication import BaseAuthentication class TestAuthentication(BaseAu ...

  3. CocoaPods pod install的时候报错:invalid byte sequence in UTF-8 (ArgumentError)解决办法

    CocoaPods pod install的时候报错:invalid byte sequence in UTF-8 (ArgumentError)解决办法: 基本可以确定是Podfile中的内容编码有 ...

  4. 利用cocoapods创建基于git的私有库Spec Repo

    上一篇文章记录了我利用cocoapods创建基于SVN的私有库的全部过程,今天我再记录一下基于git创建的过程. 整体先说明一下创建一个私有的podspec包括如下那么几个步骤: 创建并设置一个私有的 ...

  5. 软件功能说明书final修订

    贪吃蛇(单词版)软件功能说明书final修订 1 开发背景 “贪吃蛇”这个游戏对于80,90后的人来说是童年的记忆,可以将其说为是一个时代的经典,实现了传统贪吃蛇的游戏功能:现在人们对英语的重视程度越 ...

  6. 学霸网站-Alpha版本发布说明

    项目名称 学霸网站 项目版本 Alpha 项目团队 ourteam 发布日期 2014-11-23 一.版本的新功能 1.匿名提问 用户提问的时候可以选择匿名提问,这样在问题的详细信息不会显示提出者的 ...

  7. TeamWork#1,Week 2,Learn In Team

    我觉得做为一个团队,每个人的能力固然重要,但是更重要的是几个人能同心协力. 俗话说“三个臭皮匠,赛过诸葛亮”,团队合作往往能激发出团体不可思议的潜力,集体协作干出的成果往往能超过成员个人业绩的总和.在 ...

  8. 使用switchPage.js插件jQuery全屏滚动翻页

    1. 先引入jquery.js,再引入switchPage.js 文件地址:点击打开链接 <script src="jquery.min.js"></script ...

  9. c++课的圆周面积

    又回顾了一下一两个月没动过的类,似乎又有点手生了,不过还好还可以做. 在栋哥的推荐下下载了一个vs2015,表示从dev的白鼠形式的简单操作缓过来还有些不习惯呢,不过有些功能,例如诊断还是挺好用的 这 ...

  10. 优先队列的一种实现--堆ADT

    二叉堆的两个重要性质: 1.结构性,为完全二叉树,可以用数组方便地表示.2.堆序性:树中每个节点的关键字值大于或等于其父节点的关键字值. 二叉堆的数据结构声明如下: struct HeapStruct ...