1,准备poi依赖的jar包.这部分不具体说了,看到导入相信你之前肯定研究过导出了.
不明白的童鞋看这篇:点击打开链接,打不开就访问这个址:http://blog.youkuaiyun.com/qq_36074672/article/details/54093319#t1
2,首先你要明确导入excel是怎么回事?具体思路?
a,所谓导入说的通俗易懂点就是文件上传,这里导入excel文件,实际上就是将excel文件解析成你需要的数据(导入是严格有格式要求的,按照导出的格式进行反推.视不同项目而定!需要自己的逻辑!说是没法说清楚的.)
b,说下大体步骤:首先前台点击导入按钮,选择文件,这里博主使用的easyui框架,直接就把不是以*.xls结尾的文件给pass掉了.如果读者使用其他的,需要进行相应的js校验(应该是的,我没弄过).选中之前导出生成的excel文件.进行导入操作(文件上传操作).
c,这里需要注意的是:一般前台都使用ajax异步处理机制,需要返回给前台一个信息(导入成功与否的提示!以及关闭哪些窗口!).由于ajax无法传递file文件,这里需要用FormData将表单的数据封装到这里.不懂得去百度搜索下,很简单的,(博主后续文章也会写).
d,传到controller中后解析表单中的数据,其中可能不单单只有file文件,也有可能会有其他需要用户填写的.对应上前台控件的''name''属性值即可.在下面代码中会有,这里简单描述下.(练练写作能力,太渣了!哈哈)
e,接收到file后,首先将file文件(也就是excel文件)写到一个路径下(这里博主写到服务器上的upload文件夹下了),如果想要备份以后看的话,可以也到固定盘下如"c://xxx文件夹/子文件夹"的位置,可以生产一个时间戳用来保证上传文件名字不重复,重复的话会覆盖之前的文件.
f,创建Workbook,利用之前上传的文件绝对路径生产一个输入流.具体代码看.
g,根据格式自己解析出来需要的数据,在进行插入数据库的操作.(这的逻辑就因人而异了,博主这里只是启示左右.)
h,需要进行校验,不能随便一个excel文件导入都能导入进来吧!校验方向:excel格式的校验,数据合理化校验.(这个部分没啥分享的了,因为水平有限!博主是个彩币.哈哈,只是想到这俩方向!)
上面叭叭叭说了一堆,很多童鞋已经懵逼了,下面直接上代码,当然也需要简单的叙述.慢慢体会吧!可能某一块就令你茅塞顿开!!!
首先是spring-mvc.xml需要下面这段代码(文件上传,一定要有,否则会出错的):
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8"/>
<property name="maxUploadSize" value="20971520"/>
<property name="maxInMemorySize" value="2048"/>
<property name="resolveLazily" value="true"/>
<!-- 配置的是虚拟路径 -->
<!-- <property name="uploadTempDir" value="/uploadFile/temp"/> -->
</bean>
前台(博主用的easyui框架)代码:
<body>
<div align="center">
<form id="news_scheme_upload_form" enctype="multipart/form-data">
<table align="center" cellpadding="10">
<tr align="center">
<td colspan="2"><input id="news_scheme_upload_file" name="file" type="text" style="width:300px" data-options="required:true,prompt:'请选择导出生成的excel文件'"></td>
</tr>
<tr align="center">
<td>设置名称:</td>
<td><input id="news_scheme_upload_schemeName" class="easyui-textbox" type="text" name="schemeName" data-options="required:true,missingMessage:'请输入方案名称',prompt:'请输入方案名称'" style="width:200px"></input></td>
</tr>
<tr align="center">
<td>设置备注:</td>
<td><input id="news_scheme_upload_schemeRemark" class="easyui-textbox" type="text" name="schemeRemark" data-options="required:true,multiline:true,prompt:'请输入方案备注信息'" style="width:200px;height:80px"></td>
</tr>
<tr align="center">
<td colspan="2"><span id="news_scheme_upload_message"></span></td>
</tr>
<tr align="center">
<td colspan="2"><a id="news_scheme_upload_button" href="#" class="easyui-linkbutton" data-options="iconCls:'icon-ok'">确认 </a></td>
</tr>
</table>
</form>
</div>
<script type="text/javascript" src="js/jquery.form.js"></script>
<script type="text/javascript">
$('#news_scheme_upload_file').filebox({
buttonText: '选择文件',
buttonAlign: 'left',
//限定了上传文件的类型只能为"*.xls"类型.
accept: ['application/vnd.ms-excel'],
});
$('#news_scheme_upload_button').on('click',function(){
if($(".validatebox-text.validatebox-invalid:first").val()==null){
//使用FormData,进行Ajax请求并'上传文件'.普通异步传递无法传传递文件,下面一句相当于把表单中的所有属性都封装进去了.
var formData = new FormData(document.getElementById("news_scheme_upload_form"));
$.ajax({
url : 'newsSchemes/upload',
type : 'POST',
data : formData,
// 告诉jQuery不要去处理发送的数据
processData : false,
// 告诉jQuery不要去设置Content-Type请求头
contentType : false,
beforeSend: function(){
//数据合理.显示绿色
$("#news_scheme_upload_message").css('color',"green");
$("#news_scheme_upload_message").html("数据合理,正在导入,请稍后...");
},
success : function(data) {
if(data==0){
//提示信息变成红色.
$("#news_scheme_upload_message").css('color',"#ff0000");
$("#news_scheme_upload_message").html("数据导入失败!!!!");
}else if(data==-1){
//提示信息变成红色.
$("#news_scheme_upload_message").css('color',"#ff0000");
$("#news_scheme_upload_message").html("数据导入失败!格式错误!!");
}else if(data==-2){
//提示信息变成红色.
$("#news_scheme_upload_message").css('color',"#ff0000");
$("#news_scheme_upload_message").html("数据导入失败!格式错误!");
}else {
//提示信息变成绿色.
$("#news_scheme_upload_message").css('color',"green");
$("#news_scheme_upload_message").html("数据导入成功!");
// alert( "文件导入成功重新reload当前页面" );
$( "#news_scheme_manage_div" ).dialog( "close" );
//$.messager.alert("提示信息","恭喜您删除成功!","info");
$( "#news_scheme_manage" ).datagrid( 'reload' );
// 删除所有选中的行数的状态
$( '#news_scheme_manage' ).datagrid( 'clearSelections' );
//点击返回重新刷新该页面对应的panel.
$("#news_anls_centerPanel").panel('refresh');
}
},
error : function(data) {
//提示信息变成红色.
$("#news_scheme_upload_message").css('color',"#ff0000");
$("#news_scheme_upload_message").html("数据导入失败!请检查导入的excel文件是否与导出的文件完全一样!不一样则会导入失败!");
}
});
}else{
//document.getElementById("news_scheme_upload_message").style.color="#ff0000";
//提示信息变成红色.
$("#news_scheme_upload_message").css('color',"#ff0000");
$("#news_scheme_upload_message").html("数据不能为空!请检查带有警告的数据!");
}
});
</script>
</body>
controller中代码:
@RequestMapping(value = "/newsSchemes/upload")
@ResponseBody
public Integer importNewsScheme(@RequestParam(value = "file", required = false) MultipartFile file,String schemeName,String schemeRemark) throws IOException{
//存储到服务器上的路径.
String filePath = this.request.getSession().getServletContext().getRealPath("/")+"WEB-INF/upload";
//获取文件名xxx.xls(前台设定了这里只能上传excel文件)
String fileName = file.getOriginalFilename();
//防止重名.(时间戳+文件名:*.xls结尾)
fileName = DateUtil.createTimeStemp(new Date())+fileName;
System.err.println("文件上传的临时文件夹:"+filePath);
//文件写入到指定位置
ExcelUtils.write(file , filePath , fileName);
String currPid = (String) this.session.getAttribute("currPid");
//切换到rsdb数据库
DataSourceContextHolder.setDbType(DataSourceType.SOURCE_RSDB);
//获取项目下的新闻源id数组
Integer[] proSids = this.projectService.siteIdsByPid(currPid);
int row = this.newsSchemesService.importNewsScheme(filePath+"//"+fileName , currPid , schemeName , schemeRemark , new Date() , proSids);
//根据row的值,前台返回什么样的提示.
return row;
}
service层代码(只是启示作用,需要结合实际进行解析封装.):
@Override
public Integer importNewsScheme(String absolutePath,String currPid,String schemeName,String schemeRemark,Date time
,Integer[] proSids){
//获取工作簿workbook
Workbook wb = ExcelUtils.getWorkBook(absolutePath);
//校验导入的excel格式是否一致
// 得到一个工作表
Sheet sheet = wb.getSheetAt(0);
//获取工作表的总行数
int totalRowNum = sheet.getLastRowNum();
//System.err.println("总行数totalRowNum:"+totalRowNum);
if(totalRowNum==0){//说明是空表,没有数据,故格式不对
return -1;
}
//获取2个表格分界处那行没有任何数据的行号.行号+1就是下一个表头行号.
int emptyRowNum = 0;
for(int i = 1 ; i <= totalRowNum ; i++){
if(sheet.getRow(i)==null || sheet.getRow(i).getPhysicalNumberOfCells()==0){
emptyRowNum = i;
break;
}
}
//System.err.println("分界2个数据表格的那行行数emptyRowNum:"+emptyRowNum);
if(emptyRowNum<3){
return -1;
}
//获取唯一标识行
Row uniqueRow = sheet.getRow(emptyRowNum+3);
int w=0;
if(uniqueRow==null){//说明格式不对
return -1;
}
if(uniqueRow.getPhysicalNumberOfCells()!=0){
int q=0;
//说明他有几组数据.(党媒,央媒...)
for(int i=0;i<emptyRowNum-2;i++){
if(uniqueRow.getCell(q)!=null && uniqueRow.getCell(q+1)!=null && uniqueRow.getCell(q+2)!=null){
//格式校验,已经列头校验
if(ExcelUtils.getCellValue(uniqueRow.getCell(q)).equals("新闻源id") && ExcelUtils.getCellValue(uniqueRow.getCell(q+1)).equals("新闻源站点名称") && ExcelUtils.getCellValue(uniqueRow.getCell(q+2)).equals("url")){
w=w+1;
}
}
q=q+3;
}
}
//w==emptyRowNum-2说明新闻方案表格式验证成功
if(w==emptyRowNum-2){
//封装方案插入基本信息
NewsSchemes newsSchemes = new NewsSchemes(schemeName,time,time,schemeRemark,currPid);
//插入新闻方案数据库news_scheme表中
Integer uploadSchemeId = this.addNewsScheme(newsSchemes);
//获取第一个表格,的列属性.也就是弟2行,下标为1
Row schemeRowNum = sheet.getRow(1);
//存储NewsMediaCategory的集合.有几个就说明有几个自定义媒体类型
List<NewsMediaCategory> newsMediaCategoryList = new ArrayList<NewsMediaCategory>();
//头两行为表头信息(直接从第三行开始解析遍历,也就是从下标2开始)
for(int i=2;i<emptyRowNum;i++){
NewsMediaCategory newsMediaCategory = new NewsMediaCategory();
//System.err.println("第"+(i+1)+"行数据:");
Row row = sheet.getRow(i);
for(int j=0;j<row.getLastCellNum();j++){
//获取每一个单元格的数据
Cell cell = row.getCell(j);
String cellValue = ExcelUtils.getCellValue(cell);
//获取方案表.列属性名
String columnName = ExcelUtils.getCellValue(schemeRowNum.getCell(j));
if("自定义媒体名称".equals(columnName)){
newsMediaCategory.setName(cellValue);
}else if("备注信息".equals(columnName)){
newsMediaCategory.setRemark(cellValue);
}
//System.err.print(","+cellValue);
}
//设置创建时间,更新时间,第一插入都为系统当前时间
newsMediaCategory.setCreate_time(time);
newsMediaCategory.setUpdate_time(time);
newsMediaCategory.setNews_scheme_id(uploadSchemeId);
newsMediaCategoryList.add(newsMediaCategory);
//System.err.println();
}
//下面是向List<NewsMediaCategory>中的NewsMediaCategory赋值包含的新闻源id数组
int n = 0;
if(newsMediaCategoryList!=null && newsMediaCategoryList.size()>0){
for(NewsMediaCategory nmc : newsMediaCategoryList){
List<Integer> sidsList = new ArrayList<Integer>();
//封装每一个NewsMediaCategory的sids属性
for(int j=emptyRowNum+4;j<=totalRowNum;j++){
//System.err.println("--------"+j+"----");
Row row = sheet.getRow(j);
//System.err.println("ddddd"+row.getCell(n));
//只有当有数据是才封装
if(row.getCell(n)!=null){
if(CommonUtils.isNumeric(ExcelUtils.getCellValue(row.getCell(n)))){
//说明是数字,合理性正确.
sidsList.add(Integer.parseInt(ExcelUtils.getCellValue(row.getCell(n))));
}else{
//说明新闻源id不为数字,数据不合理.
return -2;
}
}
}
//list转换成数组.
Integer[] sids = sidsList.toArray(new Integer[sidsList.size()]);
//与当前需要导入方案的项目,的新闻源集合取交集,留下的源可以插入进去
sids = CommonUtils.arrayJiaoJi(sids , proSids);
/*
* 这里预留.以后会提示是否将没有的新闻源,添加到该项目下.
*/
//将符合条件的新闻源封装到NewsMediaCategory对象中去.
nmc.setSids(sids);
//每次取得只是新闻源id数组那一列数据,作为存入数据库中的依据,其他2列为展示信息.
n=n+3;
}
}
int row=0;
for(NewsMediaCategory nmc : newsMediaCategoryList){
if(nmc.getSids()!=null && nmc.getSids().length>0){
//插入数据库
row = this.newsMediaCategoryService.addNewsMediaCate(nmc);
//System.err.println("--"+nmc.getName()+"---"+nmc.getRemark()+"---"+nmc.getSids().length);
}
}
return row;
}else{
return -1;
}
}
Excel工具类代码(还是那句话,启示作用,熟悉之后,写符合自己的工具类):
package com.***.utils;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
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.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.springframework.web.multipart.MultipartFile;
/**
* <b>处理excel文件的工具类</b>
* @author GQ
* @date 2016年12月27日 上午10:39:56
* @status
*/
public class ExcelUtils {
/**
* 方法描述:用于下载文件,根据存在的文件绝对路径下载.<br>
* 返回类型:void<br>
* 作者:GQ<br>
* 创建时间:2016年12月27日上午10:51:17
* @param filePath 欲下载的文件绝对路径.<br>如:"F:\apache-tomcat-7.0.70\webapps\Rs_sys\WEB-INF\download\xxx.xls"
* @param request request请求
* @param response response请求<br>
*/
public static void download(String filePath,HttpServletRequest request,HttpServletResponse response){
HSSFWorkbook workbook=null;
ServletOutputStream sos=null;
try {
File file = new File(filePath);
if (!file.exists()) {
response.sendError(404, "File not found!");
return;
}
BufferedInputStream br = new BufferedInputStream(new FileInputStream(
filePath));
String downLoadName = null;
String agent = request.getHeader("USER-AGENT");
if (null != agent && -1 != agent.indexOf("MSIE")) // IE
{
downLoadName = java.net.URLEncoder.encode(file.getName(), "UTF-8");
} else if (null != agent && -1 != agent.indexOf("Mozilla")) // Firefox
{
downLoadName = new String(file.getName().getBytes("UTF-8"),
"iso-8859-1");
} else {
downLoadName = java.net.URLEncoder.encode(file.getName(), "UTF-8");
}
byte[] buf = new byte[1024];
int len = 0;
response.reset();
response.setContentType("application/vnd.ms-excel;charset=UTF-8");
response.setHeader("Content-Disposition", "attachment; filename="
+ downLoadName);
OutputStream out = response.getOutputStream();
while ((len = br.read(buf)) > 0) {
out.write(buf, 0, len);
}
br.close();
out.close();
}catch (Exception e) {
e.printStackTrace();
}finally{
try {
if (null != workbook) {
workbook.close();
}
if(null!=sos){
sos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 方法描述:获取单元格中的数据,根据存储的值的类型不同,调用相应的方法获取数据,最后返回一个字符串类型的数据<br>
* 返回类型:String<br>
* 作者:GQ<br>
* 创建时间:2016年12月28日下午6:24:00
* @param cell 单元格
* @return<br>
*/
public static String getCellValue(Cell cell) {
String cellValue = "";
//DecimalFormat df = new DecimalFormat("#");
switch (cell.getCellType()) {
case HSSFCell.CELL_TYPE_STRING:
cellValue = cell.getRichStringCellValue().getString().trim();
break;
case HSSFCell.CELL_TYPE_NUMERIC:
cellValue = String.valueOf(new Integer((int)cell.getNumericCellValue()));
break;
case HSSFCell.CELL_TYPE_BOOLEAN:
cellValue = String.valueOf(cell.getBooleanCellValue()).trim();
break;
case HSSFCell.CELL_TYPE_FORMULA:
cellValue = cell.getCellFormula();
break;
default:
cellValue = "";
}
return cellValue;
}
/**
* 方法描述:文件写入<br>
* 返回类型:void<br>
* 作者:GQ<br>
* 创建时间:2016年12月30日下午1:41:24
* @param file 为获得到的文件(也就是要讲这个文件写到哪里)
* @param filePath 文件写入的位置
* @param fileName<br> 文件的名
*/
public static void write(MultipartFile file,String filePath,String fileName){
//在指定目录下建立一个空的文件,作用:别的file文件往里写入
File targetFile = new File(filePath, fileName);
if(!targetFile.exists()){
targetFile.mkdirs();
}
//保存
try {
//将前台传过来的file文件写到targetFile中.
file.transferTo(targetFile);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 方法描述:创建行,rowNum控制创建第几行.sheet控制在哪个工作簿上创建<br>
* 返回类型:HSSFRow<br>
* 作者:GQ<br>
* 创建时间:2017年1月3日下午4:58:09
* @param sheet 工作簿
* @param rowNum 行数(下标从0开始)
* @return<br>
*/
public static HSSFRow createRow(HSSFSheet sheet,int rowNum) {
return sheet.getRow(rowNum)!=null?sheet.getRow(rowNum):sheet.createRow(rowNum);
}
/**
* 方法描述:创建一个cell,样式,值.<br>
* 返回类型:void<br>
* 作者:GQ<br>
* 创建时间:2017年1月3日下午4:02:32<br>
* @param cellnum 第几个cell,下标从0开始,即0代表第一个<br>
* @param value 该cell的值<br>
* @param row 行<br>
* @param style 样式(采用哪个样式)<br>
*/
public static HSSFCell createCell(HSSFSheet sheet, int rowNumm, int cellNum, HSSFCellStyle style, String value) {
HSSFRow row = createRow(sheet,rowNumm);
HSSFCell cell = row.createCell((short) cellNum);
cell.setCellValue(new HSSFRichTextString(value));
cell.setCellStyle(style);
return cell;
}
/**
* 方法描述:创建多个单元格.必须是同一行的.并赋值上相应数据<br>
* 返回类型:HSSFCell<br>
* 作者:GQ<br>
* 创建时间:2017年1月3日下午5:21:52
* @param sheet 工作簿
* @param rowNumm 行数
* @param cellNums 要创建的单元格下标数组
* @param style 样式
* @param values 单元格下标对应的值,一个对应一个,顺序不能乱
*/
public static List<HSSFCell> createMultiCell(HSSFSheet sheet, int rowNumm, Integer[] cellNums, HSSFCellStyle style, String[] values) {
List<HSSFCell> cellList = new ArrayList<HSSFCell>();
for(int i=0;i<cellNums.length;i++){
HSSFCell cell = createCell(sheet , rowNumm , cellNums[i] , style , values[i]);
cellList.add(cell);
}
return cellList;
}
/**
* 方法描述:创建自定义cell单元格的基础样式.<br>
* 返回类型:HSSFCellStyle<br>
* 作者:GQ<br>
* 创建时间:2017年1月3日下午4:04:02
* @param workbook
*/
public static HSSFCellStyle getCellStyle(HSSFWorkbook workbook) {
/*//设置字体;
HSSFFont font = workbook.createFont();
//设置字体大小;
font.setFontHeightInPoints((short) 5);
//设置字体名字;
font.setFontName("Courier New");*/
//font.setItalic(true);
//font.setStrikeout(true);
//设置样式;
HSSFCellStyle style = workbook.createCellStyle();
//设置底边框;
style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
//设置底边框颜色;
style.setBottomBorderColor(HSSFColor.BLACK.index);
//设置左边框;
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
//设置左边框颜色;
style.setLeftBorderColor(HSSFColor.BLACK.index);
//设置右边框;
style.setBorderRight(HSSFCellStyle.BORDER_THIN);
//设置右边框颜色;
style.setRightBorderColor(HSSFColor.BLACK.index);
//设置顶边框;
style.setBorderTop(HSSFCellStyle.BORDER_THIN);
//设置顶边框颜色;
style.setTopBorderColor(HSSFColor.BLACK.index);
//在样式用应用设置的字体;
//style.setFont(font);
//设置自动换行;
style.setWrapText(true);
//设置水平对齐的样式为居中对齐;
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
//设置垂直对齐的样式为居中对齐;
style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
return style;
}
/**
* 方法描述:自定义设置标题样式,只有下边框<br>
* 返回类型:HSSFCellStyle<br>
* 作者:GQ<br>
* 创建时间:2017年1月3日下午4:20:42<br>
* @param workbook<br>
*/
public static HSSFCellStyle getTitleStyle(HSSFWorkbook workbook){
HSSFCellStyle style = workbook.createCellStyle();
style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 创建一个居中格式
// 设置标题只有下边框
style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
return style;
}
/**
* 方法描述:合并单元格<br>
* 返回类型:int<br>
* 作者:GQ<br>
* 创建时间:2017年1月4日上午10:45:20<br>
* @param sheet 工作簿<br>
* @param firstRow 合并起止行(下标从0开始)<br>
* @param lastRow 合并截止行(下标从0开始)<br>
* @param firstCol 合并起止列(下标从0开始)<br>
* @param lastCol 合并截止列(下标从0开始)<br>
*/
public static int mergedRegion(HSSFSheet sheet,int firstRow, int lastRow, int firstCol, int lastCol){
return sheet.addMergedRegion(new CellRangeAddress(firstRow,lastRow,firstCol,lastCol));
}
/**
* 方法描述:将生成好的excel文件,写入到指定路径下的文件中.<br>
* 返回类型:void<br>
* 作者:GQ<br>
* 创建时间:2017年1月4日上午10:57:04<br>
* @param wb 一个workbook,对应一个Excel文件<br>
* @param absolutePath excel文件的绝对路径<br>
*/
public static void writeExcelToLocation(HSSFWorkbook wb,String absolutePath){
try {
FileOutputStream fout = new FileOutputStream(absolutePath);
wb.write(fout);
fout.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 方法描述:获取workbook,将文件转换为workbook对象<br>
* 返回类型:Workbook<br>
* 作者:GQ<br>
* 创建时间:2017年1月4日下午5:12:20<br>
* @param absolutePath 文件的绝对路径(excel文件)<br>
* @return<br>
*/
public static Workbook getWorkBook(String absolutePath){
FileInputStream fis =null;
Workbook wb = null;
try{
// 获取一个绝对地址的流
fis = new FileInputStream(absolutePath);
wb = new HSSFWorkbook(fis);
}catch(IOException e){
// TODO Auto-generated catch block
e.printStackTrace();
}
return wb;
}
}
controller中的生成时间戳的方法代码:
public static String createTimeStemp(Date date){
SimpleDateFormat dfs = new SimpleDateFormat("yyyyMMddHHmmss");// 设置日期格式
String tStamp = dfs.format(date);
return tStamp;
}