java Excel 导入

页面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;
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值