java使用POI进行 Excel文件解析
package com.timevale.esign.vip.util; import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List; import net.sf.json.JSONObject; import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.DateUtil;
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.xssf.usermodel.XSSFCell;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import com.timevale.esign.db.bean.ErrRefLog;
import com.timevale.esign.db.utils.StringUtil;
import com.timevale.esign.db.utils.UUIDGenerator;
import com.timevale.esign.vip.bean.ExcelDataBean;
import com.timevale.esign.vip.constants.ExcelConstans; /**
* 类名:ExcellUtils.java <br/>
* 功能说明:excel解析工具类 <br/>
* 修改历史: <br/>
* 1.[2015年10月13日上午9:59:25]创建类 by hewu
*/
public class ExcelUtil { Workbook wb = null; List<String[]> dataList = new ArrayList<String[]>(100); private Logger LOG = LoggerFactory.getLogger(ExcelUtil.class); /**
* 功能说明:构造器
* @param path 修改历史:<br/>
* 1.[2015年10月13日下午3:52:19] 创建方法 by hewu
*/
public ExcelUtil(final String path) {
try {
final InputStream inp = new FileInputStream(path);
this.wb = WorkbookFactory.create(inp);
} catch (FileNotFoundException e) {
LOG.error("error to find excel File .", e);
e.printStackTrace();
} catch (InvalidFormatException e) {
LOG.error("error to InvalidFormat excel File .", e);
e.printStackTrace();
} catch (IOException e) {
LOG.error("error to deal excel File and found a IOException.", e);
e.printStackTrace();
}
} public ExcelUtil() { super();
} /**
* 功能说明:读取Excel所有数据,包含header
* @param sheetIndex sheet下标
* @return <br/>
* 修改历史:<br/>
* 1.[2015年10月13日下午3:21:47] 创建方法 by hewu
*/
public final ExcelDataBean readExcel(int sheetIndex) {
ExcelDataBean bean = new ExcelDataBean();
int columnNum = 0;
final Sheet sheet = this.wb.getSheetAt(sheetIndex);
String name = sheet.getRow(0).getCell(0).getStringCellValue().trim();
if (name.contains("企业")) {
bean.setType(ExcelConstans.USER_TYPE_ORGANIZE);
} else {
bean.setType(ExcelConstans.USER_TYPE_PERSON);
}
if (sheet.getRow(0) != null) {
columnNum = sheet.getRow(0).getLastCellNum()
- sheet.getRow(0).getFirstCellNum();
}
if (columnNum > 0) {
// for (Row row : sheet) {
int rowNum = sheet.getLastRowNum();
for (int k = 1; k <= rowNum; k++) {
final String[] singleRow = new String[columnNum];
int n = 0;
for (int i = 0; i < columnNum; i++) {
final Cell cell = sheet.getRow(k).getCell(i,
Row.CREATE_NULL_AS_BLANK);
switch (cell.getCellType()) {
case Cell.CELL_TYPE_BLANK:
singleRow[n] = "";
break;
case Cell.CELL_TYPE_BOOLEAN:
singleRow[n] = Boolean.toString(cell
.getBooleanCellValue());
break;
// 数值
case Cell.CELL_TYPE_NUMERIC:
if (DateUtil.isCellDateFormatted(cell)) {
singleRow[n] = String.valueOf(cell
.getDateCellValue());
} else {
cell.setCellType(Cell.CELL_TYPE_STRING);
String temp = cell.getStringCellValue();
// 判断是否包含小数点,如果不含小数点,则以字符串读取,如果含小数点,则转换为Double类型的字符串
if (temp.indexOf(".") > -1) {
singleRow[n] = String.valueOf(new Double(temp))
.trim();
} else {
singleRow[n] = temp.trim();
}
}
break;
case Cell.CELL_TYPE_STRING:
singleRow[n] = cell.getStringCellValue().trim();
break;
case Cell.CELL_TYPE_ERROR:
singleRow[n] = "";
break;
case Cell.CELL_TYPE_FORMULA:
cell.setCellType(Cell.CELL_TYPE_STRING);
singleRow[n] = cell.getStringCellValue();
if (singleRow[n] != null) {
singleRow[n] = singleRow[n].replaceAll("#N/A", "")
.trim();
}
break;
default:
singleRow[n] = "";
break;
}
n++;
}
// 如果第一行为空,跳过
final StringBuffer str1 = new StringBuffer();
for (int t = 0; t < columnNum; t++) {
str1.append(singleRow[t]);
}
if (!StringUtil.isNull(str1.toString())) {
this.dataList.add(singleRow);
}
}
}
bean.setColData(dataList);
return bean;
} /**
* 功能说明:读取Excel,返回Excel最大行index值,实际行数要加1
* @param sheetIndex sheet下标
* @return <br/>
* 修改历史:<br/>
* 1.[2015年10月13日下午3:21:58] 创建方法 by hewu
*/
public final int getRowNum(final int sheetIndex) {
final Sheet sheet = this.wb.getSheetAt(sheetIndex);
return sheet.getLastRowNum();
} /**
* 功能说明:读取Excel,返回数据的列数
* @param sheetIndex sheet下标
* @return int <br/>
* 修改历史:<br/>
* 1.[2015年10月13日下午3:22:07] 创建方法 by hewu
*/
public final int getColumnNum(final int sheetIndex) {
final Sheet sheet = this.wb.getSheetAt(sheetIndex);
final Row row = sheet.getRow(0);
if (row != null && row.getLastCellNum() > 0) {
return row.getLastCellNum();
}
return 0;
} /**
* 读取Excel,获取某一行数据
* @param sheetIndex sheet下标
* @param rowIndex 计数从0开始,rowIndex为0代表header行
* @return String[] 修改历史:<br/>
* 1.[2015年10月13日下午3:22:07] 创建方法 by hewu
*/
public final String[] getRowData(final int sheetIndex, final int rowIndex) {
String[] dataArray = null;
if (rowIndex > this.getColumnNum(sheetIndex)) {
return dataArray;
} else {
dataArray = new String[this.getColumnNum(sheetIndex)];
return this.dataList.get(rowIndex);
} } /**
* 功能说明:读取Excel获取某一列数据
* @param sheetIndex sheet下标
* @param colIndex 列下标
* @return <br/>
* 修改历史:<br/>
* 1.[2015年10月13日下午3:22:46] 创建方法 by hewu
*/
public final String[] getColumnData(final int sheetIndex, final int colIndex) {
String[] dataArray = null;
if (colIndex > this.getColumnNum(sheetIndex)) {
return dataArray;
} else {
if (this.dataList != null && this.dataList.size() > 0) {
dataArray = new String[this.getRowNum(sheetIndex) + 1];
int index = 0;
for (String[] rowData : this.dataList) {
if (rowData != null) {
dataArray[index] = rowData[colIndex];
index++;
}
}
}
}
return dataArray; } /**
* 功能说明:导出excel(按照参数 userType导出个人/企业的失败日志)
* @param templatePath 导出模板路径
* @param ErrRefLogs 错误对象
* @param userType 用户类型
* @return String 导出的excel的临时文件<br/>
* 修改历史:<br/>
* 1.[2015年10月13日下午8:06:48] 创建方法 by hewu
*/
public String writeExcel(String templatePath, List<ErrRefLog> errRefLogs,
int userType) {
String onceFile = "";
onceFile = FileUtil.Copy(new File(templatePath), getClass()
.getResource("/errlog").getFile()
+ UUIDGenerator.getUUID()
+ ".xlsx");
FileInputStream input = null;
Workbook workbook = null;
String regStr = "[\\【\\,\\】]";
try {
input = new FileInputStream(new File(onceFile));
workbook = WorkbookFactory.create(input);
} catch (Exception e) {
e.printStackTrace();
this.LOG.error("error to create write Excel", e);
}
final Sheet sheet = workbook.getSheetAt(0);
if (userType == ExcelConstans.USER_TYPE_PERSON) {
// 解析每一条数据,增加行
for (int i = 0; i < errRefLogs.size(); i++) {
ErrRefLog log = errRefLogs.get(i);
final Row row = sheet.createRow(i
+ ExcelConstans.EXCEL_START_INDEX);
// 增加列数据
// ErrRefLog errRefLog = ErrRefLogs.get(i);
final CellStyle ss = workbook.createCellStyle();
ss.setLocked(false); final Cell nameC = row.createCell(0);
nameC.setCellStyle(ss);
nameC.setCellType(XSSFCell.CELL_TYPE_STRING);
nameC.setCellValue(log.getName());// 写入内容 final Cell mobileC = row.createCell(1);
mobileC.setCellType(XSSFCell.CELL_TYPE_STRING);
mobileC.setCellStyle(ss);
mobileC.setCellValue(log.getMobile());// 写入内容 final Cell idNoC = row.createCell(2);
idNoC.setCellType(XSSFCell.CELL_TYPE_STRING);
idNoC.setCellStyle(ss);
idNoC.setCellValue(log.getIdNo());// 写入内容 // final Cell emailC = row.createCell(3);
// emailC.setCellType(XSSFCell.CELL_TYPE_STRING);
// emailC.setCellStyle(ss);
// emailC.setCellValue(log.getEmail());// 写入内容 final Cell companyC = row.createCell(3);
companyC.setCellType(XSSFCell.CELL_TYPE_STRING);
companyC.setCellStyle(ss);
companyC.setCellValue(log.getOrgan());// 写入内容 StringBuffer errReason = new StringBuffer();
final Cell reasonC = row.createCell(4);
reasonC.setCellType(XSSFCell.CELL_TYPE_STRING);
reasonC.setCellStyle(ss);
if(log.getErrReason().contains("【")){
String [] reason = log.getErrReason().split(regStr);
errReason.append(reason[0]+"【");
errReason.append("*"+reason[1].subSequence(reason[1].length()-1, reason[1].length())+","+reason[2].substring(0, 6)+"****");
errReason.append("】"+reason[3]);
reasonC.setCellValue(errReason.toString());
}else {
reasonC.setCellValue(log.getErrReason());
}
}
} else if (userType == ExcelConstans.USER_TYPE_ORGANIZE) {
// 解析每一条数据,增加行
for (int i = 0; i < errRefLogs.size(); i++) {
final ErrRefLog log = errRefLogs.get(i);
final JSONObject obj = JSONObject.fromObject(log
.getContentJson());
final Row row = sheet.createRow(i
+ ExcelConstans.EXCEL_START_INDEX);
// 增加列数据
// ErrRefLog errRefLog = ErrRefLogs.get(i);
final CellStyle ss = workbook.createCellStyle();
ss.setLocked(false);
ss.setAlignment(CellStyle.ALIGN_CENTER);
// 企业名称
final Cell nameC = row.createCell(0);
nameC.setCellStyle(ss);
nameC.setCellType(XSSFCell.CELL_TYPE_STRING);
nameC.setCellValue(log.getName());
// 手机号
final Cell mobileC = row.createCell(1);
mobileC.setCellType(XSSFCell.CELL_TYPE_STRING);
mobileC.setCellStyle(ss);
mobileC.setCellValue(log.getMobile());
// 组织机构代码证号
final Cell organCodeC = row.createCell(2);
organCodeC.setCellType(XSSFCell.CELL_TYPE_STRING);
organCodeC.setCellStyle(ss);
organCodeC.setCellValue(log.getOrganCode());
// 邮箱
// final Cell emailC = row.createCell(3);
// emailC.setCellType(XSSFCell.CELL_TYPE_STRING);
// emailC.setCellStyle(ss);
// emailC.setCellValue(log.getEmail());
// 单位类型
final Cell companyC = row.createCell(3);
companyC.setCellType(XSSFCell.CELL_TYPE_STRING);
companyC.setCellStyle(ss);
companyC.setCellValue(obj.getInt("organType"));
// 注册类型
final Cell userTypeC = row.createCell(4);
userTypeC.setCellType(XSSFCell.CELL_TYPE_STRING);
userTypeC.setCellStyle(ss);
userTypeC.setCellValue(obj.getInt("userType"));
// 工商注册号
final Cell regCodeC = row.createCell(5);
regCodeC.setCellType(XSSFCell.CELL_TYPE_STRING);
regCodeC.setCellStyle(ss);
regCodeC.setCellValue(obj.getString("regCode"));
// 法定代表姓名
final Cell legalNameC = row.createCell(6);
legalNameC.setCellType(XSSFCell.CELL_TYPE_STRING);
legalNameC.setCellStyle(ss);
legalNameC.setCellValue(obj.getString("legalName"));
// 法定代表人身份证号
final Cell legalIdNoC = row.createCell(7);
legalIdNoC.setCellType(XSSFCell.CELL_TYPE_STRING);
legalIdNoC.setCellStyle(ss);
legalIdNoC.setCellValue(obj.getString("legalIdNo"));
// 法定代表人归属地
final Cell legalAreaC = row.createCell(8);
legalAreaC.setCellType(XSSFCell.CELL_TYPE_STRING);
legalAreaC.setCellStyle(ss);
legalAreaC.setCellValue(obj.getInt("legalArea"));
// 代理人姓名
final Cell agentNameC = row.createCell(9);
agentNameC.setCellType(XSSFCell.CELL_TYPE_STRING);
agentNameC.setCellStyle(ss);
agentNameC.setCellValue(obj.getString("agentName"));
// 代理人姓名
final Cell agentIdNoC = row.createCell(10);
agentIdNoC.setCellType(XSSFCell.CELL_TYPE_STRING);
agentIdNoC.setCellStyle(ss);
agentIdNoC.setCellValue(obj.getString("agentIdNo"));
// 公司地址
final Cell addressC = row.createCell(11);
addressC.setCellType(XSSFCell.CELL_TYPE_STRING);
addressC.setCellStyle(ss);
addressC.setCellValue(obj.getString("address"));
// 经营范围
final Cell scopeC = row.createCell(12);
scopeC.setCellType(XSSFCell.CELL_TYPE_STRING);
scopeC.setCellStyle(ss);
scopeC.setCellValue(obj.getString("scope"));
// 失败原因
StringBuffer errReason = new StringBuffer();
final Cell reasonC = row.createCell(13);
reasonC.setCellType(XSSFCell.CELL_TYPE_STRING);
reasonC.setCellStyle(ss);
if(log.getErrReason().contains("【")){
String [] reason = log.getErrReason().split(regStr);
errReason.append(reason[0]+"【");
errReason.append("*"+reason[1].subSequence(reason[1].length()-1, reason[1].length())+","+reason[2].substring(0, 6)+"****");
errReason.append("】"+reason[3]);
reasonC.setCellValue(errReason.toString());
}else {
reasonC.setCellValue(log.getErrReason());
}
}
} else { }
// 新建一输出流
FileOutputStream fout;
try {
fout = new FileOutputStream(onceFile);
// 存盘
workbook.write(fout);
fout.flush();
// 结束关闭
fout.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
this.LOG.error("fileNotFoundException", e);
} catch (IOException e) {
e.printStackTrace();
this.LOG.error("IOException", e);
}
return onceFile;
} // public static void main(String[] args) {
// // 导入excel
// // ExcelUtils utils = new ExcelUtils("D:\\用户导入模版.xls");
// ExcelUtil utils = new ExcelUtil("d:\\企业用户导入模版 .xlsx");
// List<String[]> list = utils.readExcel(0);
// for (int i = 0; i < list.size(); i++) {
// String[] str = list.get(i);
// for (int j = 0; j < str.length; j++) {
// System.out.println(str[j]);
// }
//
// }
// //导出excel
// ExcelUtils utils = new ExcelUtils(
// ExcelConstans.ERR_ORGANIZE_ACCOUNT_EXPORT_DIR);
// List<ErrRefLog> accounts = new ArrayList<ErrRefLog>();
// String path = utils.writeExcel(
// ExcelConstans.ERR_ORGANIZE_ACCOUNT_EXPORT_DIR, accounts, 2);
// System.out.println(path);
// }
// public static void main(String[] args) {
// String regStr = "[\\【\\,\\】]";
// String s = "我是【张三,430381199007086018】使用";
// System.out.println(s.split(regStr)[2]);
//
// }
}
文件解析的相关依赖包可以去maven库下载
java使用POI进行 Excel文件解析的更多相关文章
- java使用POI实现excel文件的读取,兼容后缀名xls和xlsx
需要用的jar包如下: 如果是maven管理的项目,添加依赖如下: <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --&g ...
- Java Struts2 POI创建Excel文件并实现文件下载
Java Struts2 POI创建Excel文件并实现文件下载2013-09-04 18:53 6059人阅读 评论(1) 收藏 举报 分类: Java EE(49) Struts(6) 版权声明: ...
- JAVA使用POI读取EXCEL文件的简单model
一.JAVA使用POI读取EXCEL文件的简单model 1.所需要的jar commons-codec-1.10.jarcommons-logging-1.2.jarjunit-4.12.jarlo ...
- java通过poi编写excel文件
public String writeExcel(List<MedicalWhiteList> MedicalWhiteList) { if(MedicalWhiteList == nul ...
- Java使用POI操作Excel文件
1.简介 Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式文件读和写的功能. 2.依赖的jar包 <!-- ex ...
- java使用POI操作excel文件,实现批量导出,和导入
一.POI的定义 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Excel 95, 97, 2000也即以.xls为后缀的excel.而poi可以操作Exc ...
- Java实现POI读取Excel文件,兼容后缀名xls和xlsx
1.引入所需的jar包: maven管理项目的话直接添加以下坐标即可: <!-- https://mvnrepository.com/artifact/org.apache.poi/poi -- ...
- java的poi导入excel时解析日期
if (r.getCellType()==Cell.CELL_TYPE_NUMERIC){ if(HSSFDateUtil.isCellDateFormatted(r)){ //用于转化为日期格式 D ...
- Java通过poi创建Excel文件并分页追加数据
以下的main函数,先生成一个excel文件,并设置sheet的名称,设置excel头:而后,以分页的方式,向文件中追加数据 maven依赖 <dependency> <groupI ...
随机推荐
- C#中的Linq使用
First()与FirstOrDefault() 如何结合Expression 如何拼接以避免复杂的switch语句
- cdq分治略解
前言 陌上花开,可缓缓归矣 --吴越王 寓意:意思是:田间阡陌上的花开了,你可以一边赏花,一边慢慢回来. 隐意:春天都到了,你怎么还没有回来.形容吴越王 ...
- 【leetcode 5040. 边框着色】解题报告
方法一:dfs的非递归形式 using ll=long long; const ll MAXN=50LL; unordered_set<ll> vis,mark; vector<ve ...
- 321. Create Maximum Number (c++ ——> lexicographical_compare)
Given two arrays of length m and n with digits 0-9 representing two numbers. Create the maximum numb ...
- const 迭代器和 const_iterator (vector/set/map)
vector: 如同一般复合类型一样,vector 迭代器也可以声明成: const vector<int>::iterator it1 = v.begin(); vector<in ...
- leecode刷题(7)-- 加一
leecode刷题(7)-- 加一 加一 描述: 给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一. 最高位数字存放在数组的首位, 数组中每个元素只存储一个数字. 你可以假设除了整数 ...
- HDU6300-2018ACM暑假多校联合训练1003-Triangle Partition
题意是给3n个点,其中不可能存在任意三点共线的情况,让你在其中建n个三角形,点不能重复使用,三角形不能相互覆盖 做法是给每个点排序,按照先y轴排,再x轴排的顺序,三个三个一组从下往上输出,有人说是凸包 ...
- 【spring boot】FilterRegistrationBean介绍
前言 以往的javaee配置过滤器是在web.xml中配置的,如下代码 <filter> <filter-name>TestFilter</filter-name> ...
- 有关git的使用,和git的一些提交冲突。
git 的一些基本用法 git init :初始化文件(创建文件夹). git add . :监控工作区的状态树(将被修改的文件提交到暂存区) git status :未跟踪状态(Untracked) ...
- 使用带参数的SQL语句向数据库中插入空值
private void button1_Click(object sender, EventArgs e) { string name = textBox1.Text; int age = Conv ...