1.jsp利用上传
<div id="formwrapper">
<h3>导入文件</h3>
<formaction="system/healthRecord!readExcelHealthRecord.action"method="post" id="myForm"name="myForm"enctype="multipart/form-data">
<fieldset>
<legend>导入卫生检查表
</legend>
<div>
文件:<input type="file"name="uploadExcel">
<input type="submit" value="导入"/>
</div>
</fieldset>
</form>
</div>
2.action得到
private File uploadExcel; // 上传的文件 privateFile strutsUpload变量的名称必须和jsp中上传文件标签中的name属性的值一致.
/*
* 读取解析保存excel 3宿舍卫生检查表
*/
public String readExcelHealthRecord() {
List<List> datas = this.getData(uploadExcel,1);//读取数据(读取数据的源Excel,读取数据忽略的行数)
if(datas != null){
this.healthRecordService.addHealthRecordData(datas);
}
return "read_success";
}
protected List getData(File file, int ignoreRows) {
//result 第一维数组存储的是一行中格列的值,二维数组存储的是多少个行
List<List> result = newArrayList<List>();
try {
//获取工作薄workbook
HSSFWorkbook workbook = new HSSFWorkbook(newFileInputStream(file)); //读取文件流
//获得 sheet总数
int sheetCount =workbook.getNumberOfSheets();
//遍历sheet
for (int sheetIndex = 0; sheetIndex < sheetCount;sheetIndex++) {
//获得指定的sheet对象
HSSFSheet sheet =workbook.getSheetAt(sheetIndex);
//获得本sheet的总行数
int rowCount =sheet.getLastRowNum();
//如果没有数据
if(rowCount < 1){
return result;
}
//如果有数据 进入下边
//遍历行row ignoreRows忽略的行数。即标题行,不取
for (int rowIndex = ignoreRows; rowIndex<= rowCount; rowIndex++) {
//准备rowData 收集每一行数据
List<Object> rowData = newArrayList<Object>();
//获得行row对象
HSSFRow row =sheet.getRow(rowIndex);
//如果此行为空,则进入下一个循环
if (row == null) {
continue;
}
//如果此行为不为空进入以下逻辑
//获得本行中单元格的个数
int cellCount =row.getLastCellNum();
//遍历每个单元格cell
for (int cellIndex = 0;cellIndex < cellCount; cellIndex++) {
//获得单元格cell对象
HSSFCell cell =row.getCell(cellIndex);
//获得指定单元格中的数据
Object cellContent =this.getCellContent(cell);
//将单元格内容放入 行数据中
rowData.add(cellContent);
}
//将每行的数据rowData 放入结果集中
result.add(rowData);
}
//将每个sheet的结果 此处忽略掉收集了
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
//遍历完整个excel之后
return result;
}
}
/**
* 获取一个cell的数据类型
CELL_TYPE_STRING:字符型
CELL_TYPE_NUMERIC:数值型
CELL_TYPE_BOOLEAN:布尔型
CELL_TYPE_FORMULA:公式型
CELL_TYPE_BLANK:空值
* @param cell
* @return
*/
protected Object getCellContent(Cell cell) {
Object result = null;
//如果此单元格为空,则返回null;
if (cell == null) {
return result;
}
//单元格对象不为空
//单元格类型:Numeric:0, String:1,Formula:2, Blank:3, Boolean:4, Error:5
int cellType =cell.getCellType();
//判断单元格类型
switch (cellType) {
case HSSFCell.CELL_TYPE_STRING://CELL_TYPE_STRING:字符型
String tempResult=cell.getRichStringCellValue().getString();
result=this.rightTrim(tempResult);
break;
case HSSFCell.CELL_TYPE_NUMERIC://CELL_TYPE_NUMERIC:数值型
if(HSSFDateUtil.isCellDateFormatted(cell)){
result = cell.getDateCellValue();
}else{
result = cell.getNumericCellValue();
}
break;
case HSSFCell.CELL_TYPE_FORMULA://CELL_TYPE_FORMULA:公式型
result =cell.getNumericCellValue();
break;
case HSSFCell.CELL_TYPE_BOOLEAN://CELL_TYPE_BOOLEAN:布尔型
result =cell.getBooleanCellValue();
break;
caseHSSFCell.CELL_TYPE_BLANK:
result = null;
break;
caseHSSFCell.CELL_TYPE_ERROR:
result = null;
break;
default:
System.out.println("枚举了所有类型");
break;
}
return result;
}
/**
* 去掉字符串右边的空格
* @param str 要处理的字符串
* @return 处理后的字符串
*/
protected static String rightTrim(String str) {
if (str == null) {
return"";
}
int length = str.length();
for (int i = length - 1; i >= 0;i--) {
if (str.charAt(i) !=0x20) {
break;
}
length--;
}
return str.substring(0,length);
}