Java对Excel表格的上传和下载处理方法

2025-05-29 0 83

excel表格文件的上传下载,java中涉及到文件肯定会有io流的知识。

而excel文件就要涉及到poi技术,而excel的版本包括:2003-2007和2010两个版本, 即excel的后缀名为:xls和xlsx。

这里我是按照正规的项目流程做的案例,所以可能会比网上的一些demo复杂一些。不过文件的上传下载基本都是一套固定的流程,只是每个人的实现方式不太相同。

数据库我用的是mysql。

下面是我的项目目录:

Java对Excel表格的上传和下载处理方法

按照正常的项目做了分层处理,文件上传的业务我放到了service处理,而文件下载业务还在controller层。

对前端请求处理,我分成了两个方法都放在handleexcelcontroller里面,这个类继承了baseexcelcontroller,基本的文件操作处理在baseexcelcontroller里面。

baseexcelcontroller继承了basecontroller,basecontroller类是所有controller的父类,这里用到的不太多,这个类封装了response返回值等的处理等一些方法。

项目中除了springmvc和mybatis的jar包之外还引入了:

Java对Excel表格的上传和下载处理方法

上传下载excel文件:

1、创建需要上传的excel文件,为了简化,我这里只写了四列,即四个字段

Java对Excel表格的上传和下载处理方法

2、创建jsp页面

  1. <%@pagelanguage="java"import="java.util.*"pageencoding="utf-8"%>
  2. <%@taglibprefix="c"uri="http://java.sun.com/jsp/jstl/core"%>
  3. <!doctypehtmlpublic"-//w3c//dtdhtml4.01transitional//en">
  4. <html>
  5. <head>
  6. <title>excel文件处理</title>
  7. <scripttype="text/javascript"src="<c:urlvalue='/res/js/jquery.js'/>"></script>
  8. <script>
  9. $(function(){
  10. var$wrap=$(".wrap");
  11. varfind=function(str){
  12. return$wrap.find(str);
  13. }
  14. vargetjname=function(name){
  15. returnfind("input[name='"+name+"']");
  16. }
  17. getjname("upload").click(function(){
  18. varform=newformdata(document.getelementbyid("tf"));
  19. $.ajax({
  20. url:"<c:urlvalue='/file/uploadexcel'/>",
  21. type:"post",
  22. data:form,
  23. datatype:"json",
  24. processdata:false,
  25. contenttype:false,
  26. success:function(data){
  27. //window.clearinterval(timer);
  28. if(data.success=="success"){
  29. alert("提交文件成功,已将数据存入数据库");
  30. }
  31. },
  32. error:function(e){
  33. alert("错误!");
  34. //window.clearinterval(timer);
  35. }
  36. });
  37. })
  38. getjname("download").click(function(){
  39. $.post("<c:urlvalue='/file/downloadexcel'/>",{"id":"3"},function(data){
  40. //alert("下载文件成功");
  41. },"json")
  42. })
  43. })
  44. </script>
  45. </head>
  46. <body>
  47. <divclass="wrap">
  48. <formid="tf">
  49. <p>
  50. <inputtype="file"name="file"value="选择文件"/>
  51. excel文件上传:<inputtype="button"name="upload"value="upload"/>
  52. </p>
  53. <p>
  54. excel文件下载:<inputtype="button"name="download"value="updown"/>
  55. </p>
  56. </form>
  57. </div>
  58. </body>
  59. </html>

3、依次创建controller、service、domain、mapper层,注意它们的依赖关系

1)、controller层的处理,在handleexcelcontroller里面注入baseexcelservice。因为只是做个示范,所欲我这里将泛型固定为students类

baseexcelcontroller代码:

  1. packagecn.wangze.controller;
  2. importjava.io.file;
  3. importjava.io.fileinputstream;
  4. importjava.io.filenotfoundexception;
  5. importjava.io.fileoutputstream;
  6. importjava.io.ioexception;
  7. importjava.io.inputstream;
  8. importjava.lang.reflect.method;
  9. importjava.text.simpledateformat;
  10. importjava.util.collection;
  11. importjava.util.date;
  12. importjava.util.iterator;
  13. importjava.util.list;
  14. importjavax.servlet.http.httpservletresponse;
  15. importorg.apache.commons.lang.stringutils;
  16. importorg.apache.poi.hssf.usermodel.hssfcell;
  17. importorg.apache.poi.hssf.usermodel.hssfcellstyle;
  18. importorg.apache.poi.hssf.usermodel.hssffont;
  19. importorg.apache.poi.hssf.usermodel.hssfpalette;
  20. importorg.apache.poi.hssf.usermodel.hssfrichtextstring;
  21. importorg.apache.poi.hssf.usermodel.hssfrow;
  22. importorg.apache.poi.hssf.usermodel.hssfsheet;
  23. importorg.apache.poi.hssf.usermodel.hssfworkbook;
  24. importorg.apache.poi.hssf.util.cellrangeaddress;
  25. importorg.apache.poi.hssf.util.hssfcolor;
  26. importorg.apache.poi.ss.usermodel.sheet;
  27. importorg.apache.poi.xssf.usermodel.xssfworkbook;
  28. importorg.springframework.web.multipart.multipartfile;
  29. importcn.wangze.domain.students;
  30. publicclassbaseexcelcontrollerextendsbasecontroller{
  31. //获取文件的路径
  32. stringseparator=system.getproperty("file.separator");
  33. //验证元素是否为空
  34. @suppresswarnings("all")
  35. publicbooleanisempty(objectobj){
  36. if(objinstanceofobject[]){
  37. if(((object[])obj).length==0){
  38. returntrue;
  39. }
  40. if(obj==null)returntrue;
  41. if((string.valueof(obj).trim()).length()==0){
  42. returntrue;
  43. }
  44. if(objinstanceoflist){
  45. if(((list)obj)==null||((list)obj).size()==0){
  46. returntrue;
  47. }
  48. }
  49. }
  50. returnfalse;
  51. }
  52. /**
  53. *文件上传部分
  54. **/
  55. //验证文件
  56. protectedbooleancheckpathname(stringfilename,httpservletresponseresponse){
  57. //验证文件是否存在
  58. if(isempty(filename)){
  59. senderror("上传文件不存在",response);
  60. returnfalse;
  61. }
  62. //验证文件是否是以xls或者xlsx做后缀的文件,如果不是就返回错误信息
  63. if(!(stringutils.endswithignorecase(filename,".xls")||stringutils.endswithignorecase(filename,".xlsx"))){
  64. senderror("上传文件类型错误,请核对后重新上传?",response);
  65. }
  66. returntrue;
  67. }
  68. //获取文件的sheet
  69. protectedsheetgetsheet(multipartfilefile,stringpath,stringfilename)throwsillegalstateexception,ioexception{
  70. //找到要存放到项目里面的路径,新建文件
  71. filetargetfile=newfile(path,filename);
  72. targetfile.mkdirs();
  73. if(targetfile.exists()){
  74. targetfile.delete();
  75. file.transferto(targetfile);
  76. }else{
  77. file.transferto(targetfile);
  78. }
  79. //封装输入流,封装sheet里面的内容
  80. inputstreamis=null;
  81. try{
  82. is=newfileinputstream(path+separator+filename);
  83. //判断版本是否为excel加强版
  84. if(stringutils.endswithignorecase(filename,".xls")){
  85. returnnewhssfworkbook(is).getsheetat(0);
  86. }elseif(stringutils.endswithignorecase(filename,".xlsx")){
  87. returnnewxssfworkbook(is).getsheetat(0);
  88. }
  89. returnnull;
  90. }
  91. finally{
  92. if(is!=null){
  93. is.close();
  94. }
  95. }
  96. }
  97. /**
  98. *文件下载部分
  99. **/
  100. //根据传入的sting值,判断生成在excel表的位置
  101. privatehssfcellstylegetpublicstyle(hssfworkbookworkbook,stringkey){
  102. hssffontfont=workbook.createfont();
  103. hssfcellstylestyle=workbook.createcellstyle();
  104. hssfpalettecustompalette=workbook.getcustompalette();
  105. custompalette.setcoloratindex(hssfcolor.teal.index,(byte)64,(byte)148,(byte)160);
  106. custompalette.setcoloratindex(hssfcolor.orange.index,(byte)170,(byte)204,(byte)204);
  107. style.setalignment(hssfcellstyle.align_center);
  108. style.setverticalalignment(hssfcellstyle.vertical_center);
  109. if(key=="head"){
  110. style.setfillpattern(hssfcellstyle.solid_foreground);
  111. font.setfontheightinpoints((short)12);
  112. font.setcolor(hssfcolor.teal.index);
  113. font.setboldweight(hssffont.boldweight_bold);
  114. style.setfont(font);
  115. }
  116. if(key=="title"){
  117. font.setcolor(hssfcolor.white.index);
  118. font.setboldweight(hssffont.boldweight_bold);
  119. style.setborderleft(hssfcellstyle.border_thin);
  120. style.setleftbordercolor(hssfcolor.white.index);
  121. style.setborderright(hssfcellstyle.border_thin);
  122. style.setrightbordercolor(hssfcolor.white.index);
  123. style.setfont(font);
  124. style.setfillpattern(hssfcellstyle.solid_foreground);
  125. style.setfillforegroundcolor(hssfcolor.orange.index);
  126. style.setfillbackgroundcolor(hssfcolor.orange.index);
  127. }
  128. returnstyle;
  129. }
  130. //创建head头信息
  131. privatevoidcreatehead(hssfsheetsheet,hssfcellstylestyle,string[]title){
  132. hssfrowrow1=sheet.createrow(0);
  133. hssfcellcelltitle=row1.createcell(0);
  134. celltitle.setcellvalue(newhssfrichtextstring(title[0]));
  135. sheet.addmergedregion(newcellrangeaddress(0,0,0,title.length-2));
  136. celltitle.setcellstyle(style);
  137. }
  138. //创建title信息
  139. privatevoidcreatetitle(hssfsheetsheet,hssfcellstylestyle,string[]label,intcolumnnum){
  140. hssfrowrow2=sheet.createrow(1);
  141. hssfcellcell1=null;
  142. for(intn=0;n<columnnum;n++){
  143. cell1=row2.createcell(n);
  144. cell1.setcellvalue(label[n+1]);
  145. cell1.setcellstyle(style);
  146. }
  147. }
  148. //创建content数据信息
  149. privatevoidcreatecontent(hssfsheetsheet,hssfcellstylestyle,collection<students>list,intcolumnnum,string[]parameters){
  150. intindex=0;
  151. iterator<students>it=list.iterator();
  152. while(it.hasnext()){
  153. index++;
  154. studentscash=it.next();
  155. intnum2=parameters.length;
  156. hssfrowrow=sheet.createrow(index+1);
  157. initcells(style,num2,cash,parameters,row);
  158. }
  159. }
  160. //验证是否为中文
  161. publicbooleancheckchinese(strings){
  162. intn=0;
  163. booleanflag=false;
  164. for(inti=0;i<s.length();i++){
  165. n=(int)s.charat(i);
  166. flag=(19968<=n&&n<40623)?true:false;
  167. }
  168. returnflag;
  169. }
  170. //将数据设置到excel表格内
  171. publicvoidinitcells(hssfcellstylestyle,intcolumnnum,studentst,
  172. string[]endcontent,hssfrowrow3){
  173. for(intj=0;j<columnnum;j++){
  174. hssfcellcell=row3.createcell(j);
  175. stringfieldname=endcontent[j];
  176. try{
  177. if(fieldname!=""&&!checkchinese(fieldname)){
  178. stringgetmethodname="get"+fieldname.substring(0,1).touppercase()+fieldname.substring(1);
  179. classclazz=t.getclass();
  180. methodgetmethod=clazz.getmethod(getmethodname,newclass[]{});
  181. stringvalue=(string)getmethod.invoke(t,newobject[]{});
  182. cell.setcellvalue(value);
  183. }else{
  184. cell.setcellvalue(fieldname);
  185. }
  186. cell.setcellstyle(style);
  187. }catch(exceptione){
  188. e.printstacktrace();
  189. }
  190. }
  191. }
  192. publicvoidcreateend(hssfsheetsheet,hssfcellstylestyle,intnumtext,intcolumnnum,studentst,string[]endcontent){
  193. hssfrowrow3=sheet.createrow(numtext+2);
  194. initcells(style,columnnum,t,endcontent,row3);
  195. }
  196. //根据service查询到的数据,创建excel表并插入查询的数据信息
  197. protectedstringgetoutputname(list<students>list,stringpath,string[]title,string[]parameters,studentst,string[]endcontent)
  198. throwsioexception{
  199. //根据传入的title数组的第一个值,设置文件名称
  200. stringfilename=title[0]+"_"+newsimpledateformat("yyyymmdd").format(newdate())+".xls";
  201. //输出流放到文件的本地位置
  202. fileoutputstreamfos=newfileoutputstream(path+separator+filename);
  203. //列数,根据title的个数,除去第一个就是每列title的信息
  204. intcolumnnum=title.length-1;
  205. intnumtext=list.size();
  206. hssfworkbookworkbook=newhssfworkbook();
  207. hssfsheetsheet=workbook.createsheet();
  208. sheet.setdefaultcolumnwidth(20);
  209. sheet.setdefaultrowheight((short)400);
  210. hssfcellstylecontentstyle=this.getpublicstyle(workbook,"");
  211. hssfcellstyletitlestyle=this.getpublicstyle(workbook,"title");
  212. hssfcellstyleheaderstyle=this.getpublicstyle(workbook,"head");
  213. createhead(sheet,headerstyle,title);
  214. createtitle(sheet,titlestyle,title,columnnum);
  215. createcontent(sheet,contentstyle,list,columnnum,parameters);
  216. //createend(sheet,contentstyle,numtext,columnnum,t,endcontent);
  217. workbook.write(fos);
  218. fos.flush();
  219. fos.close();
  220. returnfilename;
  221. }
  222. }

handleexcelcontroller用来处理前端请求,代码如下:

  1. packagecn.wangze.controller;
  2. importjava.io.file;
  3. importjava.util.list;
  4. importjavax.servlet.servletoutputstream;
  5. importjavax.servlet.http.httpservletresponse;
  6. importjavax.servlet.http.httpsession;
  7. importorg.apache.commons.io.fileutils;
  8. importorg.springframework.beans.factory.annotation.autowired;
  9. importorg.springframework.stereotype.controller;
  10. importorg.springframework.web.bind.annotation.requestmapping;
  11. importorg.springframework.web.multipart.multipartfile;
  12. importcn.wangze.domain.students;
  13. importcn.wangze.service.baseexcelservice;
  14. @controller
  15. @requestmapping("/file")
  16. publicclasshandleexcelcontrollerextendsbaseexcelcontroller{
  17. @autowired
  18. privatebaseexcelservicebaseexcelservice;
  19. @requestmapping("/uploadexcel")
  20. publicvoiduploadexcel(multipartfilefile,httpsessionsession,httpservletresponseresponse)throwsexception{
  21. //如果上传的文件不存在,抛出异常
  22. if(file==null){
  23. thrownewexception("文件不存在");
  24. }
  25. //获取文件名
  26. stringfilename=file.getoriginalfilename();
  27. //选择上传的文件存放到项目的路径
  28. stringpath=session.getservletcontext().getrealpath(separator+"res"+separator+"upload");
  29. if(!checkpathname(filename,response))return;
  30. stringmsg=baseexcelservice.loadexcel(getsheet(file,path,filename));
  31. sendmsg(true,msg,response);
  32. }
  33. @requestmapping("/downloadexcel")
  34. publicvoidupdownexcel(studentsstudent,httpservletresponseres,httpsessionsession,httpservletresponseresponse)
  35. throwsexception{
  36. list<students>stus=baseexcelservice.querylist(student);
  37. if(stus.size()==0){
  38. res.sendredirect("/index.jsp");
  39. return;
  40. }
  41. //下载的excel文件存放的本地路径
  42. stringpath=session.getservletcontext().getrealpath(separator+"res"+separator+"exportexcel"+separator);
  43. servletoutputstreamos=res.getoutputstream();
  44. studentst=baseexcelservice.querytotal(student);
  45. //标题文字,数值中的第一个值+当前日期为文件名称,以后的每个元素为每列的标题
  46. string[]title={"studets04","id","名字","年龄","性别"};//标题文字
  47. //对应实体类的属性值
  48. string[]parameters={"id","name","age","sex"};
  49. string[]endcontent={"","","",""};
  50. //调用父类的处理方法,生成excel文件
  51. stringfilename=getoutputname(stus,path,title,parameters,t,endcontent);
  52. try{
  53. res.reset();
  54. res.setcharacterencoding("utf8");
  55. res.setcontenttype("application/vnd.ms-excel;charset=utf8");
  56. res.setheader("content-disposition","attachment;filename="
  57. +newstring(filename.getbytes("utf-8"),"iso-8859-1"));
  58. os.write(fileutils.readfiletobytearray(newfile(path+separator+filename)));
  59. sendresult(true,response);
  60. os.flush();
  61. }finally{
  62. if(os!=null){
  63. os.close();
  64. }
  65. }
  66. }
  67. }

2)、service层的处理,把studentsmapper注入到baseexcelservice

baseexcelservice代码:

  1. packagecn.wangze.service;
  2. importjava.util.arraylist;
  3. importjava.util.hashmap;
  4. importjava.util.list;
  5. importjava.util.map;
  6. importjavax.servlet.servletoutputstream;
  7. importjavax.servlet.http.httpsession;
  8. importorg.apache.poi.ss.usermodel.cell;
  9. importorg.apache.poi.ss.usermodel.row;
  10. importorg.apache.poi.ss.usermodel.sheet;
  11. importorg.springframework.beans.factory.annotation.autowired;
  12. importorg.springframework.stereotype.service;
  13. importcn.wangze.domain.students;
  14. importcn.wangze.mapper.studentsmapper;
  15. @service
  16. publicclassbaseexcelservice{
  17. @autowired
  18. privatestudentsmapper<students>studentsmapper;
  19. //判断字符串是否为空
  20. publicbooleanisempty(stringstr){
  21. returnstr==null||str.length()==0;
  22. }
  23. //获取单个表格(字段)存放的信息
  24. privatestringgetvalue(cellcell,stringcelllable,map<string,string>errmap){
  25. cell.setcelltype(cell.cell_type_string);
  26. stringvalue=cell.getstringcellvalue().trim();
  27. returnvalue;
  28. }
  29. //通过这个方法将excel表的每行的数据放到info对象里面
  30. privatestringaddinfo(rowrow,studentsinfo){
  31. map<string,string>errmap=newhashmap<string,string>();
  32. stringid=getvalue(row.getcell(0),"id",errmap);
  33. stringusername=getvalue(row.getcell(1),"姓名",errmap);
  34. stringage=getvalue(row.getcell(2),"年龄",errmap);
  35. stringsex=getvalue(row.getcell(3),"性别",errmap);
  36. stringerrmsg=errmap.get("errmsg");
  37. if(!isempty(errmsg)){
  38. returnerrmsg;
  39. }
  40. info.setid(id);
  41. info.setname(username);
  42. info.setage(age);
  43. info.setsex(sex);
  44. returnnull;
  45. }
  46. publicstringloadexcel(sheetsheet)throwsexception{
  47. //新建一个list集合,用来存放所有行信息,即每行为单条实体信息
  48. list<students>infos=newarraylist<students>();
  49. //获取到数据行数,第一行是title,不需要存入数据库,所以rownum从1开始
  50. for(intrownum=1;rownum<=sheet.getlastrownum();rownum++){
  51. studentsinfo=newstudents();
  52. stringerrmsg2=addinfo(sheet.getrow(rownum),info);
  53. if(errmsg2!=null)returnerrmsg2;
  54. infos.add(info);
  55. }
  56. if(infos.isempty()){
  57. return"没有解析到学生数据,请查验excel文件";
  58. }
  59. //通过studentsmapper的insertsheetdata方法,将实体类存放的数据插入到数据库
  60. intresult=studentsmapper.insertsheetdata(infos);
  61. //若插入成功会返回大于1的整数,返回success
  62. if(result>=1){
  63. return"success";
  64. }
  65. return"error";
  66. }
  67. //查询所有数据库存放的学生信息
  68. publiclist<students>querylist(studentsstudents){
  69. returnstudentsmapper.querylist(students);
  70. }
  71. //获取到的学生实体信息
  72. publicstudentsquerytotal(studentsstudents){
  73. returnstudentsmapper.querytotal(students);
  74. }
  75. publicvoiddownexcel(httpsessionsession,stringseparator){
  76. }
  77. }

3)、实体层的处理,字段要对应excel表的字段

  1. packagecn.wangze.domain;
  2. publicclassstudents{
  3. stringid;
  4. stringname;
  5. stringage;
  6. stringsex;
  7. publicstringgetid(){
  8. returnid;
  9. }
  10. publicvoidsetid(stringid){
  11. this.id=id;
  12. }
  13. publicstringgetname(){
  14. returnname;
  15. }
  16. publicvoidsetname(stringname){
  17. this.name=name;
  18. }
  19. publicstringgetage(){
  20. returnage;
  21. }
  22. publicvoidsetage(stringage){
  23. this.age=age;
  24. }
  25. publicstringgetsex(){
  26. returnsex;
  27. }
  28. publicvoidsetsex(stringsex){
  29. this.sex=sex;
  30. }
  31. }

4)、dao层处理:studentsmapper.java是一个接口,业务到数据库需要执行的方法在这里声明,studentsmapper.xml相当于接口的实现类,用来连接java和数据库的操作。

studentsmapper.java代码:

  1. packagecn.wangze.mapper;
  2. importjava.util.list;
  3. publicinterfacestudentsmapper<t>{
  4. publicintinsertsheetdata(list<t>list);
  5. publiclist<t>querylist(tt);
  6. publictquerytotal(tt);
  7. }

studentsmapper.xml代码:

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <!doctypemapperpublic"-//mybatis.org//dtdmapper3.0//en""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mappernamespace="cn.wangze.mapper.studentsmapper">
  4. <sqlid="columnlist">
  5. id,name,age,sex
  6. </sql>
  7. <sqlid="columnlist_t">
  8. t.id,t.name,t.age,t.sex
  9. </sql>
  10. <sqlid="valuelist">
  11. #{id},#{name},#{age},#{sex}
  12. </sql>
  13. <sqlid="whereclause">
  14. where1=1
  15. <iftest="id!=nullandid!=''">andid=#{id}</if>
  16. <iftest="name!=nullandname!=''">andname=#{name}</if>
  17. <iftest="age!=nullandage!=''">andage=#{age}</if>
  18. <iftest="sex!=nullandsex!=''">andsex=#{sex}</if>
  19. </sql>
  20. <sqlid="whereclause_pager">
  21. where1=1
  22. <iftest="t.id!=nullandt.id!=''">andid=#{t.id}</if>
  23. <iftest="t.name!=nullandt.name!=''">andname=#{t.name}</if>
  24. <iftest="t.age!=null">andage=#{t.age}</if>
  25. <iftest="t.sex!=nullandt.sex!=''">andsex=#{t.sex}</if>
  26. </sql>
  27. <sqlid="setclause">
  28. set
  29. <trimsuffixoverrides=",">
  30. <iftest="id!=null">id=#{id},</if>
  31. <iftest="name!=null">name=#{name},</if>
  32. <iftest="pid!=null">age=#{age},</if>
  33. <iftest="url!=null">sex=#{sex},</if>
  34. </trim>
  35. </sql>
  36. <selectid="querylist"resulttype="students">
  37. select<includerefid="columnlist"/>fromstudents
  38. </select>
  39. <selectid="querytotal"parametertype="students"resulttype="students">
  40. select<includerefid="columnlist"/>fromstudents<includerefid="whereclause"/>
  41. <!–(select<includerefid="columnlist"/>fromt_account_casht
  42. <includerefid="whereclausequery"/>groupbyto_char(t.add_time,'yyyy-mm-dd'),t.account_id)a–>
  43. </select>
  44. <insertid="insertsheetdata"usegeneratedkeys="true"parametertype="java.util.list">
  45. <!–<selectkeyresulttype="long"keyproperty="id"order="after">
  46. select
  47. last_insert_id()
  48. </selectkey>–>
  49. insertintostudents(id,name,age,sex)
  50. values
  51. <foreachcollection="list"item="item"index="index"separator=",">
  52. (#{item.id},#{item.name},#{item.age},#{item.sex})
  53. </foreach>
  54. </insert>
  55. </mapper>

所有的代码就是这些了,操作的时候需要注意的多是路径的问题。最复杂的就是baseexcelcontroller的操作,它做的事情就是解析上传和创建下载excel文件。

执行完之后的结果图是这样:

在数据库查看上传的excel表:

Java对Excel表格的上传和下载处理方法

下载到d: omcat omcat6.0.32webappsexcelhandledemo esexportexcel文件夹下的excel表:

Java对Excel表格的上传和下载处理方法

这里有一点不足的地方,我相信你已经发现了,就是下载完excel表格之后,前端还没有和业务对接上,没有相应的提示来告诉操作人执行结果,只能通过代码设置好的路径去查看文件夹下是否有下载的excel文件,

不过这都是细节问题,相信难不倒聪明的各位。

总结

以上所述是小编给大家介绍的java对excel表格的上传下载处理方法,希望对大家有所帮助

原文链接:http://www.cnblogs.com/blue-wz/archive/2017/08/05/7290493.html

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 Java对Excel表格的上传和下载处理方法 https://www.kuaiidc.com/115470.html

相关文章

发表评论
暂无评论