java处理excel有很多第三方的包,我今天使用org.apcahe.poi 做实验。
主要包含的对象:(本次试验主要用到红色表示几个类)
HSSFWorkbook excel的文档对象
HSSFSheet excel的表单
HSSFRow excel的行
HSSFCell excel的单元格
HSSFFont excel的字体
HSSFName execl名称
HSSFDataFormat excel日期格式
实验目的:从一个给定的已经存在的excel文件中读取数据并解析,然后校验,最终存入一个excel对象中。
完成情况:已经完成数据读取解析,存入excel对象。现在还未做校验。
实验表格如下:
手机号 | 身份证 | 银行卡 | 邮箱 | 设备ID | IP地址 | |
源码如下:
ExcelTest_4.java
package LinkAnalysis;
import java.io.IOException;
/**
* Created by carrot on 16/8/10.
*/
public class ExcelTest_4 {
private static final String filePath = "/Users/carrot/Documents/ExcelTest_3.xls";
public static void main(String[] args) throws IOException {
ExcelDataDO excelDataDO = AnalysisExcel.AnalysisExcel(filePath);
}
}
ExcelDataDO.java
package LinkAnalysis;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
/**
* Created by carrot on 16/8/10.
*/
public class ExcelDataDO implements Serializable {
// file name for excel
private String fileName;
// tab name in the file
private String tabName;
// tab index in the file
private int tabIndex;
// amount of row
private int amountRow;
// effectively number of row
private int effNumRow;
// amount of cel
private int amountCel;
// effectively number of cel
private int effNumCel;
// form data for tab
private Map<String, List<String>> excelData;
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public String getTabName() {
return tabName;
}
public void setTabName(String tabName) {
this.tabName = tabName;
}
public int getTabIndex() {
return tabIndex;
}
public void setTabIndex(int tabIndex) {
this.tabIndex = tabIndex;
}
public int getAmountRow() {
return amountRow;
}
public void setAmountRow(int amountRow) {
this.amountRow = amountRow;
}
public int getEffNumRow() {
return effNumRow;
}
public void setEffNumRow(int effNumRow) {
this.effNumRow = effNumRow;
}
public int getAmountCel() {
return amountCel;
}
public void setAmountCel(int amountCel) {
this.amountCel = amountCel;
}
public int getEffNumCel() {
return effNumCel;
}
public void setEffNumCel(int effNumCel) {
this.effNumCel = effNumCel;
}
public Map<String, List<String>> getExcelData() {
return excelData;
}
public void setExcelData(Map<String, List<String>> excelData) {
this.excelData = excelData;
}
}
AnalysisExcel.java
package LinkAnalysis;
import com.google.common.collect.Maps;
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 java.io.FileInputStream;
import java.io.IOException;
import java.util.List;
import java.util.Map;
/**
* Created by carrot on 16/8/10.
*/
public class AnalysisExcel {
private static HSSFWorkbook hssfWorkbook; // excel 文档对象
private static HSSFSheet hssfSheet; // excel 表单
private static HSSFRow hssfRow; // excel 行
private static HSSFCell hssfCell; // excel 格子单元
/**
* 存储excel解析出的数据 key: String类型值,存储Field字段 value: List<String>类型,存储某一列的相同Field的值
*/
private static Map<String, List<String>> map = Maps.newHashMap();
private static List<String> list;
// Excel数据对象
private static ExcelDataDO excelDataDO = new ExcelDataDO();
public static ExcelDataDO AnalysisExcel(String filename) throws IOException {
FileInputStream fileInputStream = null;
try {
fileInputStream = new FileInputStream(filename); // 打开文件流
if (null == fileInputStream) {
return null;
}
} catch (IOException e) {
throw new IOException("文件不存在/打开失败");
}
hssfWorkbook = new HSSFWorkbook(fileInputStream); // 用文件流创建excel对象
/**
* 获取excel对象中表单tab的数量,分别对每一个tab进行单独处理
*/
for (int i = 0; i < hssfWorkbook.getNumberOfSheets(); ++i) {
hssfSheet = hssfWorkbook.getSheetAt(i); // 获取一个表单
if (null == hssfSheet) { // 当表单不存在,直接结束处理
return null;
}
AnalysisTab(hssfSheet); // 处理一个表单
}
fileInputStream.close(); // 关闭文件流
excelDataDO.setExcelData(map); // 为excel数据对象设置数据
return excelDataDO;
}
private static void AnalysisTab(HSSFSheet hssfSheet) {
int amountRow = hssfSheet.getLastRowNum() - hssfSheet.getFirstRowNum(); // 获取行数
int amountCel = 0;
for (int i = 1; i <= amountRow; ++i) { // 处理行
hssfRow = hssfSheet.getRow(i); // 获取行对象
if (null == hssfRow) { // 行为空,跳过,继续解析下一行
continue;
}
amountCel = hssfRow.getLastCellNum(); // 获取本行的列数
for (int j = 0; j < amountCel; ++j) { // 处理列
hssfCell = hssfRow.getCell(j); // 获取单元格对象
if (null == hssfCell) { // 单元格为空,跳过,继续解析下一个单元格
continue;
}
TypeAnalysis(hssfCell, j); // 分析单元格数据类型
}
}
}
private static void TypeAnalysis(HSSFCell hssfCell, int celNum) {
int celType = hssfCell.getCellType(); // 获取单元格数据类型
String key = hssfSheet.getRow(0).getCell(celNum).getStringCellValue(); // 获取第celNUm列的Field
list = LinkAnalysis.Lists.getList(map, key); // 获取用于存储同一Field(列)的相同类型数据的list
switch (celType) { // 匹配数据类型
case HSSFCell.CELL_TYPE_NUMERIC:
list.add(String.valueOf(hssfCell.getNumericCellValue())); // 将数据add进list
map.put(key, list); // 将数据存入excel数据对象
break;
case HSSFCell.CELL_TYPE_STRING:
list.add(hssfCell.getStringCellValue());
map.put(key, list);
break;
case HSSFCell.CELL_TYPE_FORMULA:
list.add(hssfCell.getCellFormula());
map.put(key, list);
break;
case HSSFCell.CELL_TYPE_BLANK:
// 前面已处理,此处不可能为空
break;
case HSSFCell.CELL_TYPE_BOOLEAN:
list.add(String.valueOf(hssfCell.getBooleanCellValue()));
map.put(key, list);
break;
case HSSFCell.CELL_TYPE_ERROR:
list.add(String.valueOf(hssfCell.getErrorCellValue()));
map.put(key, list);
break;
default:
//
break;
}
}
}
Lists.java
package LinkAnalysis;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* Created by carrot on 16/8/10.
*/
public class Lists {
public static List<String> getList(Map map, String key) {
if (!map.containsKey(key)) {
return new ArrayList();
}
return (List<String>) map.get(key);
}
}
代码能跑通。数据的有效性校验还没有做,后续补上。