这几天做了文件上传,导入Excel,写入Excel,在平时项目中都是比较常用的。我这里做了文件上传后直接显示到页面上
1、文件上传,需要commons.fileupload-1.2.0.jar、commons.io-1.4.0.jar两个jar包,实现如下效果,文件上传我这里介绍两种方法,一是就用FileItem上传,二是io流写入-转换成字节码上传,实现方法Java类中介绍。
新建一个jsp,代码如下,注意:上传文件,form表单中enctype="multipart/form-data"的意思,是设置表单的MIME 编码。默认情况,这个编码格式是application/x-www-form-urlencoded,不能用于文件上传;只有使用了multipart /form-data,才能完整的传递文件数据,进行下面的操作.
enctype="multipart/form-data"是上传二进制数据; form里面的input的值以2进制的方式传过去。
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>上传Excel</title> <!--这是我项目中的一个地址,<%=baseUrl%>,这个大家可以不用管,下面跳转到action地址,根据自己的来--> <%@ include file="/global/commonPage/includeHead/head.jsp" %> </head> function improtBudgetVersion(){ var file=document.getElementById("fileName").value; //我这里是做了一个测试,只传excel文件, var reg=/.+\.xls/; if(file==""){ alert("请选择一个导入文件") return; } if(!reg.test(file)){ alert("导入文件的Excel类型只能是:xls"); return; } //传到upImageFile类中的importExcel方法 fileForm.action = "<%=baseUrl%>/upImageFile.do?method=importExcel"; fileForm.submit(); } </script> <body> <form action="" enctype="multipart/form-data" id="fileForm" name="fileForm" method="post" > <div id="filePanel"> <table > <tr> <td width="103px" style="font-size:10px;text-align:center"></td> <td><input type="file" id="fileName" name="fileName" /></td> <td style="width:80px"><input type="button" value="导入" onclick="javascript:improtBudgetVersion()" id="import1"/></td> <td><input type="button" value="导出" onclick="exportClik()" id="export" style="right: auto"></td> <td><input type="button" onclick="search()" value="查看" ></td> </tr> </table> <textarea type="textarea" id="textareaId" style="width:460;height:100;" readonly="true">${msg}</textarea> </div> </body> </html>
jsp写好后,新建UpImageFileAction类,代码如下:第一种用FileItem上传,代码如下:
import org.apache.commons.fileupload.DefaultFileItemFactory; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUpload; import org.apache.commons.fileupload.FileUploadException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.util.Iterator; import java.util.List; public class UpImageFileAction extends BaseDispatchAction { public File uploadFile(HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException, FileUploadException { request.setCharacterEncoding("gb2312"); response.setContentType("text/html;charset=gb2312"); File uploadDirectoryFile = null; // 文件上传到的目录 File tempDirectoryFile = null; // 临时文件目录 File uploadedFile = null; // 上传的文件 String nativeWebAppFoldPath =request.getRealPath("/");//得到文件的当前路径 tempDirectoryFile = new File(nativeWebAppFoldPath + "tempDirectory"); //我是把上传的文件存在c盘下面,这个你可以自己随便写 uploadDirectoryFile = new File("C:\\Users\\Administrator\\Desktop\\upload\\"); // 文件夹不存在就自动创建 if (!tempDirectoryFile.exists()) { tempDirectoryFile.mkdirs(); } // 文件夹不存在就自动创建 if (!uploadDirectoryFile.exists()) { uploadDirectoryFile.mkdirs(); } DefaultFileItemFactory factory = new DefaultFileItemFactory(); factory.setSizeThreshold(1024000); // 最大内存大小 factory.setRepository(tempDirectoryFile); // 临时目录 FileUpload upload = new FileUpload(factory); upload.setSizeMax(2000000); // 设置允许上传文件大小,单位:字节 upload.setFileItemFactory(factory); upload.setHeaderEncoding("UTF-8"); try { //得到上传的文件 List items = upload.parseRequest(request); // 创建集合迭代器,获取一个迭代器中当前位置的对象 Iterator itr = items.iterator(); // 判断迭代器后面是否有东西 while (itr.hasNext()) { // iter.next:当指针为空,会自动向后移 FileItem item = (FileItem) itr.next(); if (item.isFormField()) { System.out.println("表单参数名:" + item.getFieldName() + ",表单参数值:" + item.getString("UTF-8")); } else { if (item.getName() != null && !item.getName().equals("")) { String fileName = item.getName(); long fileSize = item.getSize(); String fileType = item.getContentType(); System.out.println("上传文件的大小:" + fileSize); System.out.println("上传文件的类型:" + fileType); System.out.println("上传文件的名称:" + fileName); //上传文件的保存路径 uploadedFile = new File(uploadDirectoryFile, fileName); item.write(uploadedFile); System.out.println("上传成功"); } else { System.out.println("上传失败"); } } } }catch (Exception e) { e.printStackTrace(); } return uploadedFile ; }
第二种,用io流-转换成字节数组上传
import org.apache.commons.fileupload.DefaultFileItemFactory;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUpload;
import org.apache.commons.fileupload.FileUploadException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.Iterator;
import java.util.List;
public class UpImageFileAction extends BaseDispatchAction {
private File uploadFile(HttpServletRequest request,
HttpServletResponse response) throws UnsupportedEncodingException,
FileUploadException {
request.setCharacterEncoding("gb2312");
response.setContentType("text/html;charset=gb2312");
File uploadDirectoryFile = null; // 文件上传到的目录
File tempDirectoryFile = null; // 临时文件目录
File uploadedFile = null; // 上传的文件
String nativeWebAppFoldPath =request.getRealPath("/");//得到文件的当前路径
tempDirectoryFile = new File(nativeWebAppFoldPath + "tempDirectory");
uploadDirectoryFile = new File("C:\\Users\\Administrator\\Desktop\\upload\\");
// 文件夹不存在就自动创建
if (!tempDirectoryFile.exists()) {
tempDirectoryFile.mkdirs();
}
// 文件夹不存在就自动创建
if (!uploadDirectoryFile.exists()) {
uploadDirectoryFile.mkdirs();
}
DefaultFileItemFactory factory = new DefaultFileItemFactory();
factory.setSizeThreshold(1024000); // 最大内存大小
factory.setRepository(tempDirectoryFile); // 临时目录
FileUpload upload = new FileUpload(factory);
upload.setSizeMax(2000000); // 设置允许上传文件大小,单位:字节
upload.setFileItemFactory(factory);
upload.setHeaderEncoding("UTF-8");
try {
//得到上传的文件
List items = upload.parseRequest(request);
// 创建集合迭代器,获取一个迭代器中当前位置的对象
Iterator itr = items.iterator();
// 判断迭代器后面是否有东西
while (itr.hasNext()) {
// iter.next:当指针为空,会自动向后移
FileItem item = (FileItem) itr.next();
if (item.isFormField()) {
System.out.println("表单参数名:" + item.getFieldName() + ",表单参数值:" + item.getString("UTF-8"));
} else {
if (item.getName() != null && !item.getName().equals("")) {
String fileName = item.getName();
long fileSize = item.getSize();
String fileType = item.getContentType();
System.out.println("上传文件的大小:" + fileSize);
System.out.println("上传文件的类型:" + fileType);
System.out.println("上传文件的名称:" + fileName);
//把文件转换成字节数组
ByteArrayInputStream in = (ByteArrayInputStream) item.getInputStream();
byte[] buffer = new byte[1024];
int len = 0;
fileName = new File(fileName).getName();
fileName=uploadDirectoryFile+fileName;
OutputStream out =new FileOutputStream(fileName);
while ((len = in.read(buffer))!=-1){
out.write(buffer,0,len);
}
System.out.println("上传成功");
} else {
System.out.println("上传失败");
}
}
}
}catch (Exception e) {
e.printStackTrace();
}
return null ;
}
}
2、文件倒入,上传后导入页面,显示如下,前端我用的jsrender做的,下一篇讲解jsrender,前端代码如下
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
String data = (String)request.getAttribute("data") ;
%>
<html>
<head>
<title>上传Excel</title>
<%@ include file="/global/commonPage/includeHead/head.jsp" %>
<!--导入jqery-jar,jsrener包-->
<script type="text/javascript" src="<%=baseUrl%>/global/scripts/jquery/jquery-1.7.2.min.js"></script>
<script type="text/javascript" src="<%=baseUrl%>/global/scripts/jsrender.js"></script>
</head>
<script>
function search(){
var aaa = '<%=data%>';
var htmlStr = $("#dataTemplate").render(JSON.parse(aaa));
$("#dataList").html(htmlStr);
}
function improtBudgetVersion(){
var file=document.getElementById("fileName").value;
var reg=/.+\.xls/;
if(file==""){
alert("请选择一个导入文件")
return;
}
if(!reg.test(file)){
alert("导入文件的Excel类型只能是:xls");
return;
}
fileForm.action = "<%=baseUrl%>/upImageFile.do?method=importExcel";
fileForm.submit();
}
</script>
<body>
<script type="text/x-jsrender" id="dataTemplate">
//薪资大于1w的显示红色,否则显示绿色
{{if pay > 10000}}
<tr class="g-grid-tr" style="background: red;">
{{else}}
<tr class="g-grid-tr" style="background: green;">
{{/if}}
<td class="tdEdit" style="text-align: center;">{{:#getIndex()}}:{{:name}}</td>
<td class="tdEdit" style="text-align: center;">{{:sex}}</td>
<td class="tdEdit" style="text-align: center;">{{:age}}</td>
<td class="tdEdit" style="text-align: center;">{{>pay}}</td>
<td class="tdEdit" style="text-align: center;">{{:phone}}</td>
</tr>
</script>
<input type="button" onclick="search()" value="查看" >
<form action="" enctype="multipart/form-data" id="fileForm" name="fileForm" method="post" >
<div id="filePanel">
<table >
<tr>
<td width="103px" style="font-size:10px;text-align:center"></td>
<td><input type="file" id="fileName" name="fileName" /></td>
<td style="width:80px"><input type="button" value="导入" onclick="javascript:improtBudgetVersion()" id="import1"/></td>
<td><input type="button" value="导出" onclick="exportClik()" id="export" style="right: auto"></td>
</tr>
</table>
<textarea type="textarea" id="textareaId" style="width:460;height:100;" readonly="true">${msg}</textarea>
</div>
</form>
<div class="g-panel-body" style="height: 200px; overflow-y: auto">
<table align="center" cellpadding="0" cellspacing="1" class="table" >
<thead class="g-grid-hd">
<tr>
<td class="tdTitle" style="text-align: center; width:20%" >姓名</td>
<td class="tdTitle" style="text-align: center; width:10%">性别</td>
<td class="tdTitle" style="text-align: center; width:10%">年龄</td>
<td class="tdTitle" style="text-align: center; width:10%">薪资</td>
<td class="tdTitle" style="text-align: center; width:10%">电话</td>
</tr>
</thead>
<tbody id="dataList">
</tbody>
</table>
</div>
</body>
</html>
后台Java代码,用到jxl-2.6.jar包就可以了,接到上面的方法写,倒入jxl-2.6.jar,先新建一个Export实体类,如下
导入的方法代码
import com.brainlong.framework.struts.BaseDispatchAction;
import jxl.Sheet;
import jxl.SheetSettings;
import jxl.Workbook;
import jxl.format.*;
import jxl.read.biff.BiffException;
import jxl.write.*;
import jxl.write.biff.RowsExceededException;
import mc.global.demo.Export;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import java.io.*;
import java.util.Iterator;
import java.util.List;
public ActionForward importExcel(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)throws Exception{
File file = uploadFile(request, response);
Workbook workbook = Workbook.getWorkbook(new FileInputStream(file));
//创建对工作表的引用
Sheet sheet = workbook.getSheet(0);//使用索引获取第一个工作表
System.out.println("工作表名称:"+sheet.getName());
int rows=sheet.getRows();
int cols=sheet.getColumns();
System.out.println("一共"+rows+"行,"+cols+"列");
// List<Export> obj= new ArrayList<Export>();
JSONArray obj =new JSONArray();
for (int i=1;i<rows;i++){
Export export = new Export();
// sheet.getCell(j,i).getContents();得到指定单元格的内容
// String item =(sheet.getCell(j,i).getContents().equals("")? "":sheet.getCell(j,i).getContents()).trim();
String name= sheet.getCell(0,i).getContents();
String sex =sheet.getCell(1,i).getContents();
String age =sheet.getCell(2,i).getContents();
String pay=sheet.getCell(3,i).getContents();
String phone=sheet.getCell(4,i).getContents();
System.out.println(name);
System.out.println(sex);
System.out.println(age);
System.out.println(pay);
System.out.println(phone);
export.setName(name);
export.setSex(sex);
export.setAge(age);
export.setPay(pay);
export.setPhone(phone);
obj.add(JSONObject.fromObject(export));
}
//返回数据源
request.setAttribute("data", obj.toString());
return mapping.findForward("upExcelJsp");
}
3、导出功能的实现
jsp代码如下,我这里写的比较简单,点击导入按钮后直接跳转到action,然后在action中本地建一个excel写入
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>导入Excel</title>
t type="text/javascript" src="<%=baseUrl%>/global/scripts/jsrender.js"></script>
</head>
<script>
function exportClik(){
alert(11);
var file=document.getElementById("fileName").value;
fileForm.action = "<%=baseUrl%>/upImageFile.do?method=exportExcel";
fileForm.submit();
}
</script>
<body>
<form action="" enctype="multipart/form-data" id="fileForm" name="fileForm" method="post" >
<div id="filePanel">
<table >
<tr>
<td width="103px" style="font-size:10px;text-align:center"></td>
<td><input type="file" id="fileName" name="fileName" /></td>
<td style="width:80px"><input type="button" value="导入" onclick="javascript:improtBudgetVersion()" id="import1"/></td>
<td><input type="button" value="导出" onclick="exportClik()" id="export" style="right: auto"></td>
</tr>
</table>
</div>
</form>
</body>
</html>