excel 解析

07版的代码


package com.trusdom.fms.util;



import java.io.File;
import java.io.FileInputStream;
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 java.util.regex.Matcher;
import java.util.regex.Pattern;


import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;




/**
 *   @author sjw
 * 
 *         解析2007+版本excel工资单表头及正文
 * 
 *         默认第一行为标题
 */
public class AnalysisExcelXlsx {
private Row row;
private Workbook wb;
org.apache.poi.ss.usermodel.Sheet sheet;
/**
* 读取Excel表格表头的

* @param InputStream
* @return String 表头内容的数组
*/
public String[] readExcelTitle(InputStream is) {
try {
wb = WorkbookFactory.create(is);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
 
sheet = wb.getSheetAt(0);


row = sheet.getRow(0);


int colNum = row.getPhysicalNumberOfCells();
// System.out.println("文件总列数:\n" + colNum + "\n");
String[] title = new String[colNum];


for (int i = 0; i < colNum; i++) {
title[i] = getCellFormatValue((XSSFCell) 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 {
wb = new XSSFWorkbook(is);

sheet = wb.getSheetAt(0);
int rowNum = sheet.getLastRowNum();
int firstNum = sheet.getFirstRowNum();
   

row = sheet.getRow(0);
int colNum = row.getPhysicalNumberOfCells();
//除掉空行
for(int k=1;k<=rowNum;k++){
row = sheet.getRow(k);
if(null==row){
rowNum--;
}
}
//遍历的总行数应该去掉 表头行
for (int i = 1; i <= rowNum; i++) {
row = sheet.getRow(i);
int j = 0;
while (j < colNum&&null!=row) {
/* str=str==""?"":(str+getCellFormatValue((XSSFCell) row.getCell((short) j)).trim() + "&&");
j++;*/
if(!"".equals((XSSFCell)row.getCell((short)j))){
 
str+=getCellFormatValue((XSSFCell) row.getCell((short) j)).trim()+"&&";
j++;
}else{
str="";
}
 
 
}
content.put(i, str);
str = "";
}
} catch (IOException e) {
e.printStackTrace();
System.out.println("文件解析错误,请稍后再试!");
}
return content;
}


/**
* 验证工资单中内容校验   待修改

* @param in
*            输入流,指向被解析的文件
* @param map
*            解析文件后返回的解析后的文件数据,
* @return 返回是否合格
* @throws Exception
*/
public static boolean validateExcelContent(String filePath, Map<Integer, String> map) throws Exception {
File file = new File(filePath);
InputStream in = new FileInputStream(file);
AnalysisExcelXlsx xlsx = new AnalysisExcelXlsx();
String[] excelTitle = xlsx.readExcelTitle(in);
boolean flag = true;
if (excelTitle.length == 0 || excelTitle == null){
System.out.println("文件表头不能为空,请检查该文件表头!");
flag = false;
}
/*InputStream in2 = new FileInputStream(file);
map = xlsx.readExcelContent(in2);*/
if (map.size() == 0 || map == null) {
System.out.println("文件内容不能为空,请检查源文件内容");
flag = false;
} else {
for (int i = 1; i <= map.size(); i++) {
String str = map.get(i);
String[] excelContent = str.split("&&");
for (int j = 0; j < excelContent.length; j++) {
if ("姓名".equals(excelTitle[j].trim())) {
Pattern nameReg=Pattern.compile("[a-zA-z]{2,}\\s*[a-zA-Z]*");
String signtemp="[`0123456789~!@#$%^&*()+=|{}':;',\\[\\].<>/?~!@#¥%……&*()——+|{}【】‘;:”“’。,、?]";
if ("".equals(excelContent[j].trim())) {
System.out.println("第" + (i + 1) + "行,“姓名”一列中数据为空,请检查源文件!");
flag = false;
}else{
for(int k=0;k<signtemp.length();k++){
if(excelContent[j].trim().contains(String.valueOf(signtemp.charAt(k)))){
System.out.println("第" + (i + 1) + "行,“姓名”一列中数据存在非法字符,请检查源文件!");
flag = false;
break;
}
}
}
}
if ("身份证号/护照号".equals(excelTitle[j].trim())) {
 if ("".equals(excelContent[j].trim())) {
System.out.println("第" + (i + 1) + "行,“身份证号/护照号”一列中数据为空,请检查源文件!");
flag = false;
  } else {
Pattern icardpattern = Pattern.compile(
"^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([\\d|x|X]{1})$");
Pattern passportpattern = Pattern
.compile("^1[45][0-9]{7}|G[0-9]{8}|E[0-9]{7}|P[0-9]{7}|S[0-9]{7,8}|D[0-9]+$");
Pattern temp = Pattern.compile("[1-9]{1}");
Matcher icardNum = icardpattern.matcher(excelContent[j].trim());
Matcher passNum = passportpattern.matcher(excelContent[j].trim());
Matcher tempNum = temp.matcher(String.valueOf(excelContent[j].trim().charAt(0)));
if (tempNum.matches()) {
if (!icardNum.matches()) {
System.out.println("第" + (i + 1) + "行,“身份证号/护照号”一列中数据格式错误,请检查源文件!");
flag = false;
}
} else {
if (!passNum.matches()) {
System.out.println("第" + (i + 1) + "行,“身份证号/护照号”一列中数据格式错误,请检查源文件!");
flag = false;
}
}
}
}
if ("税后收入".equals(excelTitle[j].trim())) {
if ("".equals(excelContent[j].trim())&&"0".equals(excelContent[j].trim())) {
System.out.println("第" + (i + 1) + "行,“税后收入”一列中数据为空,请检查源文件!");
flag = false;
}
else{
Pattern pattern = Pattern.compile("^[1-9]\\d+\\.*[0-9]{0,2}");
Matcher isNum = pattern.matcher(excelContent[j].trim());
if (!isNum.matches()) {
System.out.println("第" + (i + 1) + "行,“税后收入”一列中只能为数字,且最多精确到小数点后两位!");
flag = false;
}
}
}
}
}
}
return flag;
}


/**
* 获取单元格数据内容为字符串类型的数据

* @param cell
*            Excel单元格
* @return String 单元格数据内容
*/
private String getStringCellValue(XSSFCell cell) {
String strCell = "";
switch (cell.getCellType()) {
case XSSFCell.CELL_TYPE_STRING:
strCell = cell.getStringCellValue();
break;
case XSSFCell.CELL_TYPE_NUMERIC:
strCell = String.valueOf(cell.getNumericCellValue());
break;
case XSSFCell.CELL_TYPE_BOOLEAN:
strCell = String.valueOf(cell.getBooleanCellValue());
break;
case XSSFCell.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(XSSFCell cell) {
String result = "";
try {
int cellType = cell.getCellType();
if (cellType == XSSFCell.CELL_TYPE_NUMERIC) {
Date date = cell.getDateCellValue();
result = (date.getYear() + 1900) + "-" + (date.getMonth() + 1) + "-" + date.getDate();
} else if (cellType == XSSFCell.CELL_TYPE_STRING) {


String date = cell.getDateCellValue().toString();
result = date.replaceAll("[年月]", "-").replace("日", "").trim();
} else if (cellType == XSSFCell.CELL_TYPE_BLANK) {
result = "";
}
} catch (Exception e) {
System.out.println("日期格式不正确!");
e.printStackTrace();
}
return result;
}


/**
* 根据Cell类型设置数据

* @param cell
* @return
*/
private String getCellFormatValue(XSSFCell cell) {
String cellvalue = "";
if (cell != null) {


switch (cell.getCellType()) {


case XSSFCell.CELL_TYPE_NUMERIC:
case XSSFCell.CELL_TYPE_FORMULA: {


if (DateUtil.isCellDateFormatted(cell)) {
boolean flag = DateUtil.isCellDateFormatted(cell);
Date date = cell.getDateCellValue();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
cellvalue = sdf.format(date);
} else {
cellvalue = String.valueOf(cell.getNumericCellValue());
}
break;
}
case XSSFCell.CELL_TYPE_STRING:
cellvalue = cell.getRichStringCellValue().getString();
break;


default:
cellvalue = " ";
}
} else {
cellvalue = "";
}
return cellvalue;

}

}
















03版的代码

package com.trusdom.fms.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.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.DateUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;




/**
 * @author sjw
 * 
 *         解析97-2003版本excel工资单表头及正文 默认第一行为标题
 *
 */
public class AnalysisExcelXls {
private static final Logger LOGGER = LoggerFactory.getLogger(AnalysisExcelXls.class);
private HSSFRow  row;
private HSSFWorkbook  wb;
private HSSFSheet  sheet;
/**
* 读取Excel表格表头的

* @param InputStream
* @return String 表头内容的数组
*/
public String[] readExcelTitle(InputStream is) {
try {
//wb = WorkbookFactory.create(is);
wb=new HSSFWorkbook(is);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
 
sheet = wb.getSheetAt(0);


row = sheet.getRow(0);


int colNum = row.getPhysicalNumberOfCells();
System.out.println("文件总列数:\n" + colNum + "\n");
String[] title = new String[colNum];


for (int i = 0; i < colNum; i++) {
title[i] = getCellFormatValue((HSSFCell) 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 {
wb = new HSSFWorkbook(is);

sheet = wb.getSheetAt(0);
int rowNum = sheet.getLastRowNum();
int firstNum = sheet.getFirstRowNum();
   

row = sheet.getRow(0);
int colNum = row.getPhysicalNumberOfCells();
//除掉空行
for(int k=1;k<=rowNum;k++){
row = sheet.getRow(k);
if(null==row){
rowNum--;
}
}
//遍历的总行数应该去掉 表头行
for (int i = 1; i <= rowNum; i++) {
row = sheet.getRow(i);
int j = 0;
while (j < colNum&&null!=row) {
/* str=str==""?"":(str+getCellFormatValue((HSSFCell) row.getCell((short) j)).trim() + "&&");
j++;*/
if(!"".equals((HSSFCell)row.getCell((short)j))){
str+=getCellFormatValue((HSSFCell) row.getCell((short) j)).trim()+"&&";
j++;
}else{
str="";
}
 
 
}
content.put(i, str);
str = "";
}
} catch (IOException e) {
e.printStackTrace();
System.out.println("文件解析错误,请稍后再试!");
}
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 = cell.getDateCellValue().toString();
result = date.replaceAll("[年月]", "-").replace("日", "").trim();
} else if (cellType == HSSFCell.CELL_TYPE_BLANK) {
result = "";
}
} catch (Exception e) {
System.out.println("日期格式不正确!");
e.printStackTrace();
}
return result;
}


/**
* 根据Cell类型设置数据

* @param cell
* @return
*/
private String getCellFormatValue(HSSFCell cell) {
String cellvalue = "";
if (cell != null) {
int cellType = cell.getCellType();
switch (cellType) {


case HSSFCell.CELL_TYPE_NUMERIC:
case HSSFCell.CELL_TYPE_FORMULA: {
if (DateUtil.isCellDateFormatted(cell)) {
boolean flag = DateUtil.isCellDateFormatted(cell);
Date date = cell.getDateCellValue();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
cellvalue = sdf.format(date);
} else {  
cellvalue = String.valueOf( cell.getNumericCellValue());
}
break;
}
case HSSFCell.CELL_TYPE_STRING:
cellvalue = cell.getRichStringCellValue().getString();
break;


default:
cellvalue = " ";
}
} else {
cellvalue = "";
}
return cellvalue;


}






}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值