ExcelReader(解析Excel的工具类)

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: package cn.com.css.common.util; import java.io.IOException; import java.io.InputStream; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.M

package cn.com.css.common.util;

import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;

public class ExcelReader {
 
 private POIFSFileSystem fs;
 private HSSFWorkbook wb;
 private HSSFSheet sheet;
 private HSSFRow row;

 /**
  * 读取Excel表格表头的内容
  *
  * @param InputStream
  * @return String 表头内容的数组
  */
 public String[] readExcelTitle(InputStream is) {
  try {
   fs = new POIFSFileSystem(is);
   wb = new HSSFWorkbook(fs);
  } catch (IOException e) {
   e.printStackTrace();
  }
  sheet = wb.getSheetAt(0);
  row = sheet.getRow(0);
  // 标题总列数
  int colNum = row.getPhysicalNumberOfCells();
  String[] title = new String[colNum];
  for (int i = 0; i < colNum; i++) {
   title[i] = getCellFormatValue(row.getCell((short) i));
  }
  return title;
 }

 /**
  * 读取Excel数据内容
  *
  * @param InputStream
  * @return Map 包含单元格数据内容的Map对象
  */
 public Map<Integer, String> readExcelContent(InputStream is) {
  Map<Integer, String> content = new HashMap<Integer, String>();
  String str = "";
  try {
   fs = new POIFSFileSystem(is);
   wb = new HSSFWorkbook(fs);
  } catch (IOException e) {
   e.printStackTrace();
  }
  sheet = wb.getSheetAt(0);
  // 得到总行数
  int rowNum = sheet.getLastRowNum();
  row = sheet.getRow(0);
  int colNum1 = row.getPhysicalNumberOfCells(); // 获取有数据的列的个数
  int colNum = 15;
  // 正文内容应该从第二行开始,第一行为表头的标题
  for (int i = 1; i <= rowNum; i++) {
   row = sheet.getRow(i);
   int j = 0;

   while (j < colNum) {
    String cell = getCellFormatValue(row.getCell((short) j)).trim();
    if (cell == "") {
     j++;
     continue;
    }
    str += cell + " ";
    j++;
   }
   str.trim();
   // System.out.println(str);
   content.put(i, str);
   str = "";
  }
  return content;
 }

 /**
  * 获取单元格数据内容为字符串类型的数据
  *
  * @param cell
  *            Excel单元格
  * @return String 单元格数据内容
  */
 /*
  * private String getStringCellValue(HSSFCell cell) { String strCell = "";
  * switch (cell.getCellType()) { case HSSFCell.CELL_TYPE_STRING: strCell =
  * cell.getStringCellValue(); break; case HSSFCell.CELL_TYPE_NUMERIC:
  * strCell = String.valueOf(cell.getNumericCellValue()); break; case
  * HSSFCell.CELL_TYPE_BOOLEAN: strCell =
  * String.valueOf(cell.getBooleanCellValue()); break; case
  * HSSFCell.CELL_TYPE_BLANK: strCell = ""; break; default: strCell = "";
  * break; } if (strCell.equals("") || strCell == null) { return ""; } if
  * (cell == null) { return ""; } return strCell; }
  */

 /**
  * 获取单元格数据内容为日期类型的数据
  *
  * @param cell
  *            Excel单元格
  * @return String 单元格数据内容
  */
 // private String getDateCellValue(HSSFCell cell) {
 // String result = "";
 // try {
 // int cellType = cell.getCellType();
 // if (cellType == HSSFCell.CELL_TYPE_NUMERIC) {
 // Date date = cell.getDateCellValue();
 // result = (date.getYear() + 1900) + "-" + (date.getMonth() + 1)
 // + "-" + date.getDate();
 // } else if (cellType == HSSFCell.CELL_TYPE_STRING) {
 // String date = getStringCellValue(cell);
 // result = date.replaceAll("[年月]", "-").replace("日", "").trim();
 // } else if (cellType == HSSFCell.CELL_TYPE_BLANK) {
 // result = "";
 // }
 // } catch (Exception e) {
 // //System.out.println("日期格式不正确!");
 // e.printStackTrace();
 // }
 // return result;
 // }

 /**
  * 根据HSSFCell类型设置数据
  *
  * @param cell
  * @return
  */
 private String getCellFormatValue(HSSFCell cell) {
  String cellvalue = "";
  if (cell != null) {
   // 判断当前Cell的Type
   switch (cell.getCellType()) {
   // 如果当前Cell的Type为NUMERIC
   case HSSFCell.CELL_TYPE_NUMERIC: {
    cellvalue = String.valueOf(cell.getNumericCellValue());
    break;
   }
   case HSSFCell.CELL_TYPE_FORMULA: {
    // 判断当前的cell是否为Date
    if (HSSFDateUtil.isCellDateFormatted(cell)) {
     // 如果是Date类型则,转化为Data格式

     // 方法1:这样子的data格式是带时分秒的:2011-10-12 0:00:00
     // cellvalue = cell.getDateCellValue().toLocaleString();

     // 方法2:这样子的data格式是不带带时分秒的:2011-10-12
     Date date = cell.getDateCellValue();
     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
     cellvalue = sdf.format(date);

    }
    // 如果是纯数字
    else {
     // 取得当前Cell的数值
     cellvalue = String.valueOf(cell.getNumericCellValue());
    }
    break;
   }
    // 如果当前Cell的Type为STRIN
   case HSSFCell.CELL_TYPE_STRING:
    // 取得当前的Cell字符串
    cellvalue = cell.getRichStringCellValue().getString();
    break;
   // 默认的Cell值
   default:
    cellvalue = " ";
   }
  } else {
   cellvalue = "";
  }
  return cellvalue;

 }

}

目录
相关文章
|
25天前
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
122 9
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
3月前
|
数据处理 Python
Python 高级技巧:深入解析读取 Excel 文件的多种方法
在数据分析中,从 Excel 文件读取数据是常见需求。本文介绍了使用 Python 的三个库:`pandas`、`openpyxl` 和 `xlrd` 来高效处理 Excel 文件的方法。`pandas` 提供了简洁的接口,而 `openpyxl` 和 `xlrd` 则针对不同版本的 Excel 文件格式提供了详细的数据读取和处理功能。此外,还介绍了如何处理复杂格式(如合并单元格)和进行性能优化(如分块读取)。通过这些技巧,可以轻松应对各种 Excel 数据处理任务。
287 16
|
3月前
|
前端开发 JavaScript
💥【exceljs】纯前端如何实现Excel导出下载和上传解析?
本文介绍了用于处理Excel文件的库——ExcelJS,相较于SheetJS,ExcelJS支持更高级的样式自定义且易于使用。表格对比显示,ExcelJS在样式设置、内存效率及流式操作方面更具优势。主要适用于Node.js环境,也支持浏览器端使用。文中详细展示了如何利用ExcelJS实现前端的Excel导出下载和上传解析功能,并提供了示例代码。此外,还提供了在线调试的仓库链接和运行命令,方便读者实践。
578 5
|
5月前
|
前端开发 PHP
ThinkPHP6之Excel解析
ThinkPHP6之Excel解析
67 0
|
7月前
|
Java 数据库连接
提升编程效率的利器: 解析Google Guava库之IO工具类(九)
提升编程效率的利器: 解析Google Guava库之IO工具类(九)
|
6月前
|
存储 数据可视化 数据挖掘
|
7月前
|
缓存 安全 Java
提升编程效率的利器: 解析Google Guava库之集合工具类-50个示例(八)
提升编程效率的利器: 解析Google Guava库之集合工具类-50个示例(八)
|
2月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
117 2
|
1月前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是"将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。创建型模式分为5种:单例模式、工厂方法模式抽象工厂式、原型模式、建造者模式。
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析

热门文章

最新文章

推荐镜像

更多