java利用jxl实现Excel导入功能
本次项目实践基于Spring+SpringMvc+MyBatis框架,简单实现了Excel模板导出、和Excel批量导入的功能。实现过程如下:、
1、maven导入所需jar包
<dependency>
<groupId>net.sourceforge.jexcelapi</groupId>
<artifactId>jxl</artifactId>
<version>2.6.12</version>
</dependency>
2、创建Excel导出模板
import java.io.OutputStream;
import java.util.Map; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.springframework.web.servlet.view.document.AbstractExcelView; public class CommodityTypeImportModelExcel extends AbstractExcelView { @Override
protected void buildExcelDocument(Map<String, Object> map, HSSFWorkbook workBook, HttpServletRequest request,
HttpServletResponse response) throws Exception {
HSSFSheet sheet = workBook.createSheet("Sheet1");
sheet.setDefaultColumnWidth(20);
HSSFCell cell00 = getCell(sheet, 0, 0);
setText(cell00, "商品类型名称");
HSSFCell cell01 = getCell(sheet, 0, 1);
setText(cell01, "上级类型");
HSSFCell cell02 = getCell(sheet, 0, 2);
setText(cell02, "级别"); String filename = new String("商品类型模板.xls".getBytes("utf-8"), "iso8859-1");
response.setHeader("Content-Type", "application/octet-stream");
response.setHeader("Content-disposition", "attachment;filename=" + filename);
OutputStream ouputStream = response.getOutputStream();
workBook.write(ouputStream);
ouputStream.flush();
ouputStream.close();
}
}
3、controller端实现模板导出
@RequestMapping(value = "/testTypeExcelExport", method = RequestMethod.GET)
public ModelAndView testTypeExcelExport(HttpServletRequest request, ModelMap model) {
CommodityTypeImportModelExcel commodityTypeImportModelExcel = new CommodityTypeImportModelExcel();
return new ModelAndView(commodityTypeImportModelExcel);
}
4、在Html添加模板导出控件
<a id="downloadTypeModel">商品类型字典模板下载</a> <script type="text/javascript">
$(document).ready(function(){
$("#downloadTypeModel").on("click",function(){
location.href ="${pageContext.request.contextPath}/shop/testTypeExcelExport";
});
});
</script>
5、创建需要导入Excel的实体
import java.util.Date;
public class CommodityTypeDicEntity {
private Integer id;
private String typeName;
private String pName;
private String level;
private Date createTime;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getTypeName() {
return typeName;
}
public void setTypeName(String typeName) {
this.typeName = typeName;
}
public String getpName() {
return pName;
}
public void setpName(String pName) {
this.pName = pName;
}
public String getLevel() {
return level;
}
public void setLevel(String level) {
this.level = level;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
}
6、Server层利用JXL获取Excel是数据并将数据添加到List中,返回
import jxl.Sheet;
import jxl.Workbook;
/**
* 利用JXL获取Excel数据并将数据添加到List
* @param file
* @return
*/
public List<CommodityTypeDicEntity> getAllTypeByExcel(MultipartFile file){
List<CommodityTypeDicEntity> list=new ArrayList<CommodityTypeDicEntity>();
try {
Workbook rwb=Workbook.getWorkbook(file.getInputStream());
Sheet rs=rwb.getSheet("Sheet1");//或者rwb.getSheet(0)
//校验
if(null==rs){
//throw new Exception("表格不存在!");
return null;
}
int clos=rs.getColumns();//得到所有的列
int rows=rs.getRows();//得到所有的行 for (int i = 1; i < rows; i++) {
for (int j = 0; j < clos; j++) {
//第一个是列数,第二个是行数
String typeName=rs.getCell(j++, i).getContents();//默认最左边编号也算一列 所以这里得j++
String pName=rs.getCell(j++, i).getContents();
String level=rs.getCell(j++, i).getContents(); CommodityTypeDicEntity commodityTypeDicEntity = new CommodityTypeDicEntity();
commodityTypeDicEntity.setTypeName(typeName);
commodityTypeDicEntity.setpName(pName);
commodityTypeDicEntity.setLevel(level);
commodityTypeDicEntity.setCreateTime(new Date());
list.add(commodityTypeDicEntity);
}
} } catch (Exception e) {
// TODO Auto-generated catch block
//e.printStackTrace();
logger.error("解析Excel出错",e);
} finally {
try {
file.getInputStream().close();
} catch (IOException e) {
// TODO Auto-generated catch block
//e.printStackTrace();
logger.error("文件流关闭出错",e);
}
}
return list; }
7、Dao层添加批量插入方法及清空数据方法
/**
* 批量插入商品类型
* @param listInsert
* @return
*/
int createCommodityTypeDicList(List<CommodityTypeDicEntity> listInsert); /**
* 清空商品类型
* @return
*/
int deleteCommodityTypeDic();
对应Mapping中:
<insert id="createCommodityTypeDicList" parameterType="java.util.List">
INSERT INTO shell_commodity_type_dic
<trim prefix="(" suffix=")" suffixOverrides=",">
type_name,p_name,level,create_time,
</trim>
VALUES
<foreach collection="list" item="item" index="index" separator=",">
<trim prefix="(" suffix=")" suffixOverrides=",">
#{item.typeName,jdbcType=VARCHAR},
#{item.pName,jdbcType=VARCHAR},
#{item.level,jdbcType=VARCHAR},
#{item.createTime,jdbcType=TIMESTAMP},
</trim>
</foreach>
</insert> <delete id="deleteCommodityTypeDic" parameterType="int">
delete from shell_commodity_type_dic
</delete>
8、Server层加入Excel导入及数据清空
/**
*
* @param commodityDics
* @return
*/
public Map<String, Object> saveCommodityTypeDic(List<CommodityTypeDicEntity> commodityTypeDics) {
//清空商品类型
commodityDao.deleteCommodityTypeDic(); Map<String, Object> resultMap = new HashMap<String, Object>();
int count = 0;
count = commodityDao.createCommodityTypeDicList(commodityTypeDics); if(count == commodityTypeDics.size()){
resultMap.put("resultCode", "0");
resultMap.put("resultMsg", "成功导入"+count+"条数据!");
return resultMap;
}else{
resultMap.put("resultCode", "103");
resultMap.put("resultMsg", "导入失败,请检查导入数据是否正确。");
return resultMap;
}
}
9、controller端实现Excel批量导入
@RequestMapping(value = "/testTypeExcelImport", method = RequestMethod.POST)
@ResponseBody
public Map<String, Object> testTypeExcelImport(HttpServletRequest request, ModelMap model) throws Exception {
Map<String, Object> resultMap = new HashMap<String, Object>();
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
MultipartFile file = multipartRequest.getFile("commodityTypeExcel");
if(file.isEmpty()){
resultMap.put("resultCode", "101");
resultMap.put("resultMsg", "导入失败,文件为空,请检查。");
return resultMap;
}
List<CommodityTypeDicEntity> commodityTypeDics = commodityService.getAllTypeByExcel(file);
if(commodityTypeDics.size()==0){
resultMap.put("resultCode", "102");
resultMap.put("resultMsg", "导入失败,数据不存在,请检查导入信息。");
return resultMap;
}
resultMap = commodityService.saveCommodityTypeDic(commodityTypeDics);
return resultMap;
}
10、Html添加批量导入控件
<a id="batchTypeImport">商品类型字典批量导入</a>
<form id="uploadCommodityTypeExcel" style="display:none" name="uploadCommodityTypeExcel" method="post" enctype="multipart/form-data" >
<input type="file" style="display:none" name="commodityTypeExcel" id="commodityTypeExcel" onChange="uploadType()"/>
<input type="submit" style="display:none" id="commodityTypeExcelSubmit">
</form>
对应Js部分
<script type="text/javascript">
$(document).ready(function(){
// 使用 jQuery异步提交表单
$('#commodityTypeExcelSubmit').click(function() {
var file = $("#commodityTypeExcel").val();
if (file == "") {
alert("请选择要上传的文件");
return false;
} else {
//检验文件类型是否正确
var exec = (/[.]/.exec(file)) ? /[^.]+$/.exec(file.toLowerCase()) : '';
if (exec != "xls") {
alert("文件格式不对,请上传Excel文件!(扩展名xls)");
return false;
}
}
$('#uploadCommodityTypeExcel').ajaxSubmit({
url:'${pageContext.request.contextPath}/shop/testTypeExcel',
data:$('#uploadCommodityTypeExcel').serialize(),
type:"POST",
beforeSend:function()
{
ajaxbg.show();
},
success:function(msg)
{
ajaxbg.hide();
alert(msg.resultMsg);
},
error:function(){
ajaxbg.hide();
alert("导入失败!");
}
});
return false;
});
}); function uploadType(){
$("#commodityTypeExcelSubmit").click();
}
</script>
自此利用JXl进行批量导入的功能基本完成。
需要注意的点:在第【9】如果出现MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;报错,无法被成功转换,则需要确认:
1、首先在servlet.xml里是否进行了配置(SpringMVC封装了commons-fileupload上传组件)
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="31457280" />
<property name="maxInMemorySize" value="4096" />
</bean>
2、需要检查一下form表单是否有这个属性enctype="multipart/form-data",对比第【10】步。
3、是否以提交方式进行的导入请求,对比第【10】步中的js部分。
$('#uploadCommodityTypeExcel').ajaxSubmit,这个比较关键。
页面在批量导入时需要在页面上出现“正在导入。。。”遮罩效果的,请参考:http://www.cnblogs.com/conswin/p/7251341.html
java利用jxl实现Excel导入功能的更多相关文章
- Java 使用 Jxl 实现 Excel 导入导出
开发过程中经常需要用到数据的导入导出功能,之前用的是POI,这次使用JXL,JXL相对于POI来说要轻量简洁许多,在数据量不大的情况下还是非常实用的.这里做一下使用JXL的学习记录.首先需要导入相应的 ...
- 记录-java(jxl) Excel导入数据库
本内容主要包括(文件上传.excel2003数据导入数据库)excel导入数据库功能需要jxl jar包支持 下面是文件上传的前端测试代码 <%@ page language="ja ...
- JAVA利用jxl读取Excel内容
JAVA可以利用jxl简单快速的读取文件的内容,但是由于版本限制,只能读取97-03 xls格式的Excel. import java.io.File; import java.io.FileInp ...
- java利用jxl操作Excel
/** * 把从数据库查询到的数据,写入电子表格 * * @throws Exception */ public void createXls() throws Exception { Dao dao ...
- java利用EasyPoi实现Excel导出功能
easypoi功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员 就可以方便的写出Excel导出,Excel模板导出,Excel导入,Word模板导出,通过简单的注解和模板 语言( ...
- JAVA利用JXL导出 EXCEL (在原有的excel模板上把数据导到excel上)
添加依赖 <dependency> <groupId>net.sourceforge.jexcelapi</groupId> <artifactId>j ...
- Java之POI的excel导入导出
一.Apache POI是一种流行的API,它允许程序员使用Java程序创建,修改和显示MS Office文件.这由Apache软件基金会开发使用Java分布式设计或修改Microsoft Offic ...
- 解析大型.NET ERP系统 设计通用Microsoft Excel导入功能
做企业管理软件很难避免与Microsoft Excel打交道,常常是软件做好了,客户要求说再做一个Excel导入功能.导入Excel数据的功能的难度不大,从Excel列数据栏位的取值,验证值,再导入到 ...
- jxl java工具类,导出excel,导入数据库
1: 引入jxl jar 我使用的为maven管理, <!--Excel工具--> <dependency> <groupId>net.sourceforge.je ...
随机推荐
- ocacle sql: 两张表左连接 ,1对多,取一条数据,取按时间最新的
说明: MBGL_GZJH jh_id 对应 mbgl_gzjh_fkmx jh_id mbgl_gzjh_fkmx jh_id 有重复多条,但是 FKRQ 不一样,我们去 FKRQ 最新的一条. s ...
- PTA 7-3 jmu-ds-单链表的基本运算(15 分)
jmu-ds-单链表的基本运算(15 分) 实现单链表的基本运算:初始化.插入.删除.求表的长度.判空.释放.(1)初始化单链表L,输出L->next的值:(2)依次采用尾插法插入元素:输入分两 ...
- Linux 命令之sed
简介 sed 是一种在线编辑器,它一次处理一行内容.在处理的时候,会先把当前处理的行存储在临时缓冲区,这被称之为 "末世空间", 然后再使用 sed 命令处理缓冲区的内容,处理完成 ...
- 解决Geoserver请求跨域的几种思路,第二种思路用过
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景描述 跨域问题是浏览器同源安全制引起的特别常见的问题.不同前端语 ...
- 小程序之取标签中内容 例如view,text
// index.wxml页面 data-url为自定义 {{}}中内容可为后台请求到的数据 也可为固定内容例如:data-text="哈哈哈" data-url="ht ...
- 1:Javascript的数据类型和相互转换
第一节:JavaScript的数据类型 他是弱类型 var 但是正是由于其实弱类 所以其后台的数据类型转换也是我们值得思考的 JavaScript的数据类型有两种 一种是原始类型 另外一种是对象类型 ...
- Pandas 基础(3) - 生成 Dataframe 的几种方式
这一节想总结一下 生成 Dataframe 的几种方式: CSV Excel python dictionary List of tuples List of dictionary 下面分别一一介绍具 ...
- ZZNU 2095 : 我只看看不写题
把所有时间加起来,最后从大到小排序,一定要把大的先减去.注意花费的时间都是1,这一秒用过就不能再用了,所有用到了并查集的部分知识 #include<iostream> #include&l ...
- MATLAB数据类型
数据类型 1数值类型 @整数 *浮点型转整数型的转换函数,将数值转换为最为接近的整数值,若分数部分为0.5时,转换为最接近的两个整数中绝对值较大的一个. *取整函数: floor(x)向下取整 cei ...
- SpringBoot的文件上传
先在src/main/resources下新建一个static目录用以存放html页面,简单的html页面如下 <!DOCTYPE html> <html> <head& ...