页面Html
引入JS ajaxfileupload.js
<script src="statistics/js/ajaxfileupload.js " type="text/javascript " charset="utf-8 "></script>
JS代码
这里要注意fileElementId : ['uploadFile'], 方括号中的值是type='file'的文本域的id。
Controller 层方法
以下两工具类
public class UploadUtil {
private static final Logger log = Logger.getLogger(UploadUtil.class);
/**
* 字符集编码格式
*/
private final static String CODE = "UTF-8";
public static List<String> uploadFile(HttpServletRequest request){
List<String> reLs = null;
String savePath = request.getSession().getServletContext().getRealPath("/WEB-INF/upload");
File file = new File(savePath);
// 判断上传文件的保存目录是否存在
if (!file.exists() && !file.isDirectory()) {
log.info(savePath + "目录不存在,需要创建");
// 创建目录
file.mkdir();
}
try {
// 使用Apache文件上传组件处理文件上传步骤:
// 1、创建一个DiskFileItemFactory工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
// 2、创建一个文件上传解析器
ServletFileUpload upload = new ServletFileUpload(factory);
// 解决上传文件名的中文乱码
upload.setHeaderEncoding(CODE);
// 3、判断提交上来的数据是否是上传表单的数据
if (!ServletFileUpload.isMultipartContent(request)) {
// 按照传统方式获取数据
return reLs;
}
// 4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项
reLs = new ArrayList<String>();
List<FileItem> list = upload.parseRequest(request);
for (FileItem item : list) {
String oldFileName = "";
// 如果fileitem中封装的是普通输入项的数据
if (item.isFormField()) {
String name = item.getFieldName();
String value = item.getString(CODE);
log.info(name + ":" + value);
}
// 如果fileitem中封装的是上传文件
else {
// 得到上传的文件名称,
String filename = item.getName();
if (filename == null || filename.trim().equals("")) {
continue;
}
/**
* 注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如: c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt
* 处理获取到的上传文件的文件名的路径部分,只保留文件名部分
*/
filename = filename.substring(filename.lastIndexOf("\\") + 1);
// 获取item中的上传文件的输入流
InputStream in = item.getInputStream();
// 创建一个文件输出流
log.info("文件创建的目录内------------------------------------------");
String extension = filename.lastIndexOf(".") == -1 ? "" : filename.substring(filename.lastIndexOf(".") + 1);
oldFileName = filename;
filename = System.currentTimeMillis() + "." + extension;
log.info(savePath + "/" + filename);
FileOutputStream out = new FileOutputStream(savePath + "/" + filename);
// 创建一个缓冲区
byte buffer[] = new byte[1024];
// 判断输入流中的数据是否已经读完的标识
int len = 0;
// 循环将输入流读入到缓冲区当中,(len=in.read(buffer))>0就表示in里面还有数据
while ((len = in.read(buffer)) > 0) {
// 使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath + "\\"
// + filename)当中
out.write(buffer, 0, len);
}
// 关闭输入流
in.close();
// 关闭输出流
out.close();
// 删除处理文件上传时生成的临时文件
item.delete();
reLs.add(filename + "," + oldFileName);
}
}
} catch (Exception e) {
log.error("文件上传失败!", e);
} finally {
log.info("文件上传成功!");
}
return reLs;
}
}
public final class ExcelUtil {
/**
* 对外提供读取excel 的方法
*/
public static List<List<Object>> readExcel(File file) throws IOException {
String fileName = file.getName();
String extension = fileName.lastIndexOf(".") == -1 ? "" : fileName.substring(fileName.lastIndexOf(".") + 1);
if ("xls".equals(extension)) {
return read2003Excel(file);
} else if ("xlsx".equals(extension)) {
return read2007Excel(file);
} else {
throw new IOException("不支持的文件类型");
}
}
/**
* 读取 office 2003 excel
*
* @throws IOException
* @throws FileNotFoundException
*/
private static List<List<Object>> read2003Excel(File file) throws IOException {
List<List<Object>> list = new LinkedList<List<Object>>();
HSSFWorkbook hwb = new HSSFWorkbook(new FileInputStream(file));
HSSFSheet sheet = hwb.getSheetAt(0);
Object value = null;
HSSFRow row = null;
HSSFCell cell = null;
for (int i = sheet.getFirstRowNum(); i <= sheet.getPhysicalNumberOfRows(); i++) {
row = sheet.getRow(i);
if (row == null) {
continue;
}
List<Object> linked = new LinkedList<Object>();
for (int j = row.getFirstCellNum(); j <= row.getLastCellNum(); j++) {
cell = row.getCell(j);
if (cell == null) {
continue;
}
DecimalFormat df = new DecimalFormat("0");// 格式化 number String
switch (cell.getCellType()) {
case XSSFCell.CELL_TYPE_STRING:
// System.out.println(i + "行" + j + " 列 is String type");
value = cell.getStringCellValue();
break;
case XSSFCell.CELL_TYPE_NUMERIC:
if((cell.getNumericCellValue() + "").indexOf(".") > -1 &&
cell.getNumericCellValue() != 0.0 &&
!(cell.getNumericCellValue() + "").endsWith(".0") &&
(cell.getNumericCellValue() + "").indexOf("E")==-1){
value = cell.getNumericCellValue();
} else{
value = df.format(cell.getNumericCellValue());
}
break;
case XSSFCell.CELL_TYPE_BOOLEAN:
value = cell.getBooleanCellValue();
break;
case XSSFCell.CELL_TYPE_BLANK:
value = "";
break;
default:
value = cell.toString();
}
if (value == null || "".equals(value)) {
continue;
}
linked.add(value);
}
list.add(linked);
}
return list;
}
/**
* 读取Office 2007 excel
*/
private static List<List<Object>> read2007Excel(File file) throws IOException {
List<List<Object>> list = new LinkedList<List<Object>>();
// String path = System.getProperty("user.dir") +
// System.getProperty("file.separator")+"dd.xlsx";
// System.out.println("路径:"+path);
// 构造 XSSFWorkbook 对象,strPath 传入文件路径
XSSFWorkbook xwb = new XSSFWorkbook(new FileInputStream(file));
// 读取第一章表格内容
XSSFSheet sheet = xwb.getSheetAt(0);
Object value = null;
XSSFRow row = null;
XSSFCell cell = null;
int firstCellNum = 0;
//获取列数,比最后一列列标大1
int lastCellNum = sheet.getRow(0).getLastCellNum() - 1;
for (int i = sheet.getFirstRowNum(); i <= sheet.getPhysicalNumberOfRows(); i++) {
row = sheet.getRow(i);
if (row == null) {
continue;
}
List<Object> linked = new LinkedList<Object>();
int k =0;
for (int j = firstCellNum; j <= lastCellNum; j++) {
cell = row.getCell(j);
if (cell == null) {
linked.add("");
k++;
} else {
DecimalFormat df = new DecimalFormat("0");// 格式化 number String
switch (cell.getCellType()) {
case XSSFCell.CELL_TYPE_STRING:
value = cell.getStringCellValue();
break;
case XSSFCell.CELL_TYPE_NUMERIC:
if((cell.getNumericCellValue() + "").indexOf(".") > -1 &&
cell.getNumericCellValue() != 0.0 &&
!(cell.getNumericCellValue() + "").endsWith(".0") &&
(cell.getNumericCellValue() + "").indexOf("E")==-1){
value = cell.getNumericCellValue();
} else{
value = df.format(cell.getNumericCellValue());
}
break;
case XSSFCell.CELL_TYPE_BOOLEAN:
// System.out.println(i + "行" + j + " 列 is Boolean type");
value = cell.getBooleanCellValue();
break;
case XSSFCell.CELL_TYPE_BLANK:
value = "";
break;
default:
value = cell.toString();
}
if (value == null || "".equals(value)) {
value = "";
k++;
}
linked.add(value);
}
}
if(k == (lastCellNum - firstCellNum + 1))
{
continue;
}
list.add(linked);
}
file.delete();
return list;
}
}