最近在公司实习的一个内部项目采购平台,需求需要导入项目表,所以最近就研究了一下,在网上了找了一些例子,可能我是新手,调试了好久的,算是有回报了,写下文字记录自己的心路历程。
首先我们要在struts2下上传一个Excel,这样的例子网上很多,上传的文件的时候文件
路径可以写死在程序中,也可以利用struts 标签库搞一个<s:form>出来,其中
<s:form theme="simple" action="uploadaction!upload" οnsubmit="return checkType()" enctype="multipart/form-data" method="post">
选择文件: <s:file name="ufile" accept="excel/*" id="ufilename" /> 这里的name属性要与后面代码的一致,不然
计算变成数字,在对数字处理中判断即可正确显示。
首先我们要在struts2下上传一个Excel,这样的例子网上很多,上传的文件的时候文件
路径可以写死在程序中,也可以利用struts 标签库搞一个<s:form>出来,其中
<s:form theme="simple" action="uploadaction!upload" οnsubmit="return checkType()" enctype="multipart/form-data" method="post">
选择文件: <s:file name="ufile" accept="excel/*" id="ufilename" /> 这里的name属性要与后面代码的一致,不然
找不到文件。这里只贴下上传方法的代码:
public String upload() {
String directory = "/upload"; //定义文件路径
String targetFileName = ufileFileName ;
String targetDirectory = ServletActionContext.getServletContext().getRealPath(directory);
//生成上传对象;
File target = new File(targetDirectory,targetFileName);
//如果文件已经存在,则删除原有文件
if(target.exists()){
target.delete();
System.out.println("文件已存在,将被覆盖!");
}
//复制文件
try{
FileUtils.copyFile(ufile, target);
}catch(Exception e ){
e.printStackTrace();
}
importExcel(ufileFileName);
return SUCCESS;
}
上传成功之后,我们可以再tomcat里面找到webapps找到我们的项目包,接着找到upload,即可看到上传的文件,另外struts2 限制了上传文件大小,好像规定为2M,这个我没具体去测试了,呵呵。完成任务即可。接着我们要用到Apach下的POI工具包去解析Excel,在这个上面花费了不少的时间。解析出来之后,要把数据赋值给实体类project相应的属性,由于当时设计数据库表时,定义了有int,double ,String ,Date型已至于获取单元格信息后出现问题。日期会变成数字,整数5输出后变成5.0,听从了老大的建议,除了ID,全部定义成String,减少了开发麻烦,后面需要计算的话在强制转换。
POI解析需要的包:poi-ooxml-schemas-3.7-beta3
importExcel方法;
public void importExcel(String ufileFileName ){
System.out.println("0000");
String directory = "/upload"; //定义上传的路径;
String targetDirectory = ServletActionContext.getServletContext().getRealPath(directory);
//生成上传的文件对象
//上面定义的文件名与也页面的保持一致 ufileFileName
File target = new File(targetDirectory,ufileFileName); //
//定义一个接收对象List
List list = new ArrayList();
//读取上传的文件
try{
FileInputStream si = new FileInputStream(target);
//初始化一个工作簿
HSSFWorkbook wb = new HSSFWorkbook(si);
//第一张表单
Sheet sheet = wb.getSheetAt(0);
int rowNum = sheet.getLastRowNum()+1; //row行初始行数位0;
System.out.println("sheet表行数为:"+rowNum); //打印总行数
//上传的Excel表带有表头,所以从第二行开始,索引为1 ;
for(int i=1;i<rowNum;i++){ //索引从0开始,即为表的第1行;
Project project = new Project() ; //new一个project实例
Row row = sheet.getRow(i);
int cellNum = row.getLastCellNum();
for(int j=1;j<cellNum;j++){ //
Cell cell = row.getCell(j);
String cellValue = null ;
//类型转换;
if (cell.getCellType() == HSSFCell.CELL_TYPE_STRING) {// 对字符串的处理
cellValue = cell.getStringCellValue() ;
} else if (cell.getCellType() == HSSFCell.CELL_TYPE_BOOLEAN) {// 对布尔值的处理
cellValue = String.valueOf(cell.getBooleanCellValue());
} else if (HSSFCell.CELL_TYPE_NUMERIC ==cell.getCellType() ) { //对数字的处理
if (HSSFDateUtil.isCellDateFormatted(cell)) {
Date d = cell.getDateCellValue(); //对日期处理
DateFormat formater = new SimpleDateFormat("yyyy-MM-dd hh:mm");
cellValue = formater.format(d);
} else {// 其余按照数字处理
cellValue = cell.getNumericCellValue()+" " ;
}
}
// 下面按照数据出现位置封装到实体类中
switch(j){
case 1 : project.setPro_name(cellValue);
case 2 : project.setBid_company(cellValue) ;
case 3 : project.setCustomer(cellValue);
case 4 : project.setSignd_date(cellValue);
case 5 : project.setSign_state(cellValue);
case 6 : project.setBid_date(cellValue);
case 7 : project.setPur_num(cellValue);
case 8 : project.setContract_num(cellValue);
case 9 : project.setContract_sum(cellValue);
case 10 : project.setService_sum(cellValue);
case 11 : project.setSell_sum(cellValue) ;
case 12 : project.setReceived_sum(cellValue);
case 13 : project.setUnreceive_sum(cellValue);
case 14 : project.setPur_sum(cellValue) ;
case 15 : project.setPur_received_sum(cellValue);
case 16 : project.setPur_unreceived_sum(cellValue);
case 17 : project.setInvoiced_sum(cellValue);
case 18 : project.setUninvoice_sum(cellValue);
}
projectDaoImpl.addProject(project);
}
}
}catch(Exception e ){
e.printStackTrace() ;
}
}
对于Excel表中单元格类型判断处理非常有必要,日期处理更要特别小心,不加判断的话是好像是从1900-00-01计算变成数字,在对数字处理中判断即可正确显示。