java导出excel(非模板)可导出多个sheet
当初为了写导出也是废了不少劲,今天突然想起来就将此方法上传,之前也写过模板导出所以这个是非模板的。
方法
- 1.导出excel(单标题,单sheet)
- 2.含多个sheet 每个sheet中的标题一致
- 3.含多个sheet 每个sheet中的标题不一致
- 并且还有两个其他导出格式。
注意事项
将pagedata换成map即可!!!
<!--依赖--> <dependency> <groupid>javax.servlet</groupid> <artifactid>javax.servlet-api</artifactid> <version>3.0.1</version> <scope>provided</scope> </dependency> <dependency> <groupid>org.apache.poi</groupid> <artifactid>poi</artifactid> <version>3.17</version> </dependency> <dependency> <groupid>org.apache.poi</groupid> <artifactid>poi-ooxml</artifactid> <version>3.17</version> </dependency> <dependency> <groupid> org.apache.httpcomponents </groupid> <artifactid> httpclient </artifactid> <version>4.5.9</version> </dependency> <!--json-lib --> <dependency> <groupid>net.sf.json-lib</groupid> <artifactid>json-lib</artifactid> <version>2.4</version> <classifier>jdk15</classifier> </dependency> <dependency> <groupid>net.sf.jxls</groupid> <artifactid>jxls-core</artifactid> <version>1.0-rc-1</version> </dependency>
import net.sf.jxls.transformer.xlstransformer; import org.apache.poi.hssf.usermodel.*; import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.util.cellrangeaddress; import org.apache.poi.xssf.usermodel.xssfcellstyle; import org.apache.poi.xssf.usermodel.xssfworkbook; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; import java.io.*; import java.net.urlencoder; import java.text.simpledateformat; import java.util.*; /** * @auther: sjj * @date: 2019/5/29 16:50 * @classname: excelutil * @description: 导出excel */ public class excelutil { /** * 导出excel * @param pds 需要导出的数据 * @param pd 导出excel公用数据,需包含title(标题)、headers(逗号隔开,为导出表头),filename(文件名,只须写上名字,这里会进行处理拼接) * @param request * @param response * @return */ public static void exportdata(list<linkedhashmap<object,object>> pds, pagedata pd, httpservletrequest request, httpservletresponse response) { if(pds.size()<1){ // return statuscode.is_null; return; } try { hssfworkbook workbook = new hssfworkbook(); //设置标题 hssfsheet sheet = workbook.createsheet(pd.getstring("title")); //headers表示excel表中第一行的表头 string[] headers=pd.getstring("headers").split(","); //表头字体 font headerfont = workbook.createfont(); headerfont.setfontname("微软雅黑"); headerfont.setcolor(hssffont.color_normal); headerfont.setbold(true); //创建单元格,并设置值表头 设置表头居中 hssfcellstyle stylemain = workbook.createcellstyle(); //水平居中 stylemain.setalignment(horizontalalignment.center); stylemain.setfont(headerfont); //导出样式 hssfcellstyle cellstyle_c = workbook.createcellstyle(); // 自动换行 cellstyle_c.setwraptext(true); cellstyle_c.setalignment(horizontalalignment.center); //创建标题行 hssfrow row = sheet.createrow(0); //在excel表中添加表头 for(int i=0;i<headers.length;i++){ hssfcell cell = row.createcell(i); hssfrichtextstring text = new hssfrichtextstring(headers[i]); cell.setcellvalue(text); cell.setcellstyle(stylemain); } int rownum = 1; //遍历集合数据 for(linkedhashmap<object,object> p :pds){ //依次创建行 hssfrow row1 = sheet.createrow(rownum); int i=0; //遍历数据 for (object key: p.keyset()){ //创建行中列 并放入数据 hssfcell cell = row1.createcell(i); string value=string.valueof(p.get(key)); cell.setcellvalue(value!=null?value:""); if("null".equals(value)){ cell.setcellvalue(""); } cell.setcellstyle(cellstyle_c); i++; } row1.setheight((short) (26*10)); rownum++; } //自动调整列宽 for (int i = 0;i <headers.length;i++){ if(i==headers.length-2){ sheet.setcolumnwidth(i, 20 * 256); break; } if(i==3){ sheet.setcolumnwidth(i, 20 * 256); continue; } sheet.autosizecolumn(i, true); } //取得输出流 outputstream out = response.getoutputstream(); simpledateformat dateformat = new simpledateformat("yyyy年mm月dd日hh时mm分ss秒"); //清空缓存 response.reset(); //设置相应内容的编码格式 response.setcharacterencoding("utf-8"); //1.导出名称 string filename =pd.getstring("filename")+dateformat.format(new date()); //文件名乱码 //获得浏览器信息并转换为大写 string agent = request.getheader("user-agent").touppercase(); //ie浏览器和edge浏览器 if (agent.indexof("msie") > 0 || (agent.indexof("gecko")>0 && agent.indexof("rv:11")>0)) { filename = urlencoder.encode(filename, "utf-8"); } else { //其他浏览器 filename = new string(filename.getbytes("utf-8"), "iso-8859-1"); } response.setheader("content-disposition", "attachment;filename=" + filename + ".xls"); //定义输出类型 response.setcontenttype("application/msexcel"); //保存excel文件 workbook.write(out); //关闭文件流 out.close(); } catch (exception e) { e.printstacktrace(); // return statuscode.error; } // return statuscode.success; } /** * 导出excel 含多个sheet 每个sheet中的标题一致 * @param pds 需要导出的数据 * @param titles 导出excel公用数据,需包含title(标题)、headers(逗号隔开,为导出表头) * @param filename (文件名,只须写上名字,这里会进行处理拼接) * @param request * @param response * 注意 titles里面的数据顺序要与pds中一致 不然导出时会出现标题与内容不符 * @return */ public static void exportsheetdata(map<string,list<list<linkedhashmap<object,object>>>> pds, list<pagedata> titles, string filename,httpservletrequest request, httpservletresponse response) throws ioexception { if(pds.size()<1){ // return statuscode.is_null; return; } hssfworkbook workbook = new hssfworkbook(); //取得输出流 outputstream out = response.getoutputstream(); simpledateformat dateformat = new simpledateformat("yyyy年mm月dd日hh时mm分ss秒"); //重命名 filename+=dateformat.format(new date());; //清空缓存 response.reset(); //设置相应内容的编码格式 response.setcharacterencoding("utf-8"); //文件名乱码 //获得浏览器信息并转换为大写 string agent = request.getheader("user-agent").touppercase(); //ie浏览器和edge浏览器 if (agent.indexof("msie") > 0 || (agent.indexof("gecko")>0 && agent.indexof("rv:11")>0)) { filename = urlencoder.encode(filename, "utf-8"); } else { //其他浏览器 filename = new string(filename.getbytes("utf-8"), "iso-8859-1"); } response.setheader("content-disposition", "attachment;filename=" + filename + ".xls"); //定义输出类型 response.setcontenttype("application/msexcel"); int sheetnum=0; for(string namekey:pds.keyset()){ list<list<linkedhashmap<object,object>>> data=pds.get(namekey); //设置标题 hssfsheet sheet = workbook.createsheet(); //工地/消纳场名作为sheet名 workbook.setsheetname(sheetnum,namekey); //表头字体 font headerfont = workbook.createfont(); headerfont.setfontname("微软雅黑"); headerfont.setcolor(hssffont.color_normal); headerfont.setbold(true); //创建单元格,并设置值表头 设置表头居中 hssfcellstyle stylemain = workbook.createcellstyle(); //水平居中 stylemain.setalignment(horizontalalignment.center); stylemain.setfont(headerfont); //导出样式 hssfcellstyle cellstyle_c = workbook.createcellstyle(); // 自动换行 cellstyle_c.setwraptext(true); cellstyle_c.setalignment(horizontalalignment.center); int titlenum=0; int rownum = 1; int startrow=0; for(list<linkedhashmap<object,object>> list:data){ //放入数据 //创建标题行 //主标题 hssfrow title = null; //行标题 hssfrow row = null; //为了避免标题对内容进行覆盖 if(rownum==1){ title=sheet.createrow(0); row = sheet.createrow(rownum); rownum++; }else{ //让标题与上一行内容存在两个空行 startrow=rownum+2; title=sheet.createrow(startrow); row = sheet.createrow(rownum+3); rownum+=4; } pagedata pd=titles.get(titlenum); //headers表示excel表中第一行的表头 string[] headers=pd.getstring("headers").split(","); //创建主标题 hssfcell tielecell = title.createcell(0); tielecell.setcellvalue(pd.getstring("title")); tielecell.setcellstyle(stylemain); for(int i=1;i<=headers.length;i++){ hssfcell cell = title.createcell(i); // hssfrichtextstring text = new hssfrichtextstring(headers[i]); cell.setcellvalue(""); cell.setcellstyle(stylemain); } // 合并日期占两行(4个参数,分别为起始行,结束行,起始列,结束列) // 行和列都是从0开始计数,且起始结束都会合并 // 这里是合并excel中日期的两行为一行 cellrangeaddress region = new cellrangeaddress(startrow, startrow, 0, headers.length-1); sheet.addmergedregion(region); //主标题创建结束 //在excel表中添加表头 for(int i=0;i<headers.length;i++){ hssfcell cell = row.createcell(i); hssfrichtextstring text = new hssfrichtextstring(headers[i]); cell.setcellvalue(text); cell.setcellstyle(stylemain); } //表头添加结束 //遍历集合数据 for(linkedhashmap<object,object> p :list){ //依次创建行 hssfrow row1 = sheet.createrow(rownum); int i=0; //遍历数据 for (object key: p.keyset()){ //创建行中列 并放入数据 hssfcell cell = row1.createcell(i); string value=string.valueof(p.get(key)); cell.setcellvalue(value!=null?value:""); if("null".equals(value)){ cell.setcellvalue(""); } cell.setcellstyle(cellstyle_c); i++; } row1.setheight((short) (26*10)); rownum++; } //自动调整列宽 for (int i = 0;i <headers.length;i++){ if(i==headers.length-2){ sheet.setcolumnwidth(i, 20 * 256); break; } if(i==3){ sheet.setcolumnwidth(i, 20 * 256); continue; } sheet.autosizecolumn(i, true); } titlenum++; // } } sheetnum++; } //保存excel文件 workbook.write(out); //关闭文件流 out.close(); } /** * 导出excel 含多个sheet 每个sheet中的标题不一致 * @param pds 需要导出的数据 * @param titles 导出excel公用数据,需包含title(标题)、headers(逗号隔开,为导出表头),可以list<pagedata>不一致 * @param filename (文件名,只须写上名字,这里会进行处理拼接) * @param request * @param response * 注意 titles里面的数据顺序要与pds中一致 不然导出时会出现标题与内容不符 * @return */ public static void exportsheettitle(linkedhashmap<string,list<list<linkedhashmap<object,object>>>> pds, linkedlist<list<pagedata>> titles, string filename,httpservletrequest request, httpservletresponse response) throws ioexception { if(pds.size()<1){ // return statuscode.is_null; return; } hssfworkbook workbook = new hssfworkbook(); //取得输出流 outputstream out = response.getoutputstream(); simpledateformat dateformat = new simpledateformat("yyyy年mm月dd日hh时mm分ss秒"); //重命名 filename+=dateformat.format(new date());; //清空缓存 response.reset(); //设置相应内容的编码格式 response.setcharacterencoding("utf-8"); //文件名乱码 //获得浏览器信息并转换为大写 string agent = request.getheader("user-agent").touppercase(); //ie浏览器和edge浏览器 if (agent.indexof("msie") > 0 || (agent.indexof("gecko")>0 && agent.indexof("rv:11")>0)) { filename = urlencoder.encode(filename, "utf-8"); } else { //其他浏览器 filename = new string(filename.getbytes("utf-8"), "iso-8859-1"); } response.setheader("content-disposition", "attachment;filename=" + filename + ".xls"); //定义输出类型 response.setcontenttype("application/msexcel"); int sheetnum=0; for(string namekey:pds.keyset()){ list<list<linkedhashmap<object,object>>> data=pds.get(namekey); //设置标题 hssfsheet sheet = workbook.createsheet(); //工地/消纳场名作为sheet名 workbook.setsheetname(sheetnum,namekey); //表头字体 font headerfont = workbook.createfont(); headerfont.setfontname("微软雅黑"); headerfont.setcolor(hssffont.color_normal); headerfont.setbold(true); //创建单元格,并设置值表头 设置表头居中 hssfcellstyle stylemain = workbook.createcellstyle(); //水平居中 stylemain.setalignment(horizontalalignment.center); stylemain.setfont(headerfont); //导出样式 hssfcellstyle cellstyle_c = workbook.createcellstyle(); // 自动换行 cellstyle_c.setwraptext(true); cellstyle_c.setalignment(horizontalalignment.center); int titlenum=0; int rownum = 1; int startrow=0; for(list<linkedhashmap<object,object>> list:data){ //放入数据 //创建标题行 //主标题 hssfrow title = null; //行标题 hssfrow row = null; //为了避免标题对内容进行覆盖 if(rownum==1){ title=sheet.createrow(0); row = sheet.createrow(rownum); rownum++; }else{ //让标题与上一行内容存在两个空行 startrow=rownum+2; title=sheet.createrow(startrow); row = sheet.createrow(rownum+3); rownum+=4; } //遍历每个sheet中的标题 for(pagedata pd:titles.get(sheetnum)){ //headers表示excel表中第一行的表头 string[] headers=pd.getstring("headers").split(","); //创建主标题 hssfcell tielecell = title.createcell(0); tielecell.setcellvalue(pd.getstring("title")); tielecell.setcellstyle(stylemain); for(int i=1;i<=headers.length;i++){ hssfcell cell = title.createcell(i); // hssfrichtextstring text = new hssfrichtextstring(headers[i]); cell.setcellvalue(""); cell.setcellstyle(stylemain); } // 合并日期占两行(4个参数,分别为起始行,结束行,起始列,结束列) // 行和列都是从0开始计数,且起始结束都会合并 // 这里是合并excel中日期的两行为一行 cellrangeaddress region = new cellrangeaddress(startrow, startrow, 0, headers.length-1); sheet.addmergedregion(region); //主标题创建结束 //在excel表中添加表头 for(int i=0;i<headers.length;i++){ hssfcell cell = row.createcell(i); hssfrichtextstring text = new hssfrichtextstring(headers[i]); cell.setcellvalue(text); cell.setcellstyle(stylemain); } //表头添加结束 //遍历集合数据 for(linkedhashmap<object,object> p :list){ //依次创建行 hssfrow row1 = sheet.createrow(rownum); int i=0; //遍历数据 for (object key: p.keyset()){ //创建行中列 并放入数据 hssfcell cell = row1.createcell(i); string value=string.valueof(p.get(key)); cell.setcellvalue(value!=null?value:""); if("null".equals(value)){ cell.setcellvalue(""); } cell.setcellstyle(cellstyle_c); i++; } row1.setheight((short) (26*10)); rownum++; } //自动调整列宽 for (int i = 0;i <headers.length;i++){ if(i==headers.length-2){ sheet.setcolumnwidth(i, 20 * 256); break; } if(i==3){ sheet.setcolumnwidth(i, 20 * 256); continue; } sheet.autosizecolumn(i, true); } } titlenum++; // } } sheetnum++; } //保存excel文件 workbook.write(out); //关闭文件流 out.close(); } /** * 导出excel * @qkp * * @param pds 需要导出的数据 * @param pd 导出excel公用数据,需包含templatefile(模板文件),filename(文件名,只须写上名字,这里会进行处理拼接) * @param mergecells 合并单元格数组【firstrow,lastrow,firstcol,lastcol】 * @param request * @param response * @return */ public static void exportdata(map<object,object> pds, pagedata pd,int []mergecells, httpservletrequest request, httpservletresponse response) { if(pds.size()<1){ return; } try { xlstransformer transformer = new xlstransformer(); inputstream in = new fileinputstream(new file(pd.getstring("templatefile"))); xssfworkbook workbook =(xssfworkbook)transformer.transformxls(in, pds); sheet sheet = workbook.getsheetat(0); //合并单元格需要的逻辑 sheet.addmergedregion(new cellrangeaddress(mergecells[0], mergecells[1], mergecells[2], mergecells[3]));//合并单元格的函数 //表头字体 font headerfont = workbook.createfont(); headerfont.setfontname("微软雅黑"); headerfont.setcolor(hssffont.color_normal); headerfont.setbold(true); //创建单元格,并设置值表头 设置表头居中 //导出样式 xssfcellstyle cellstyle_c = workbook.createcellstyle(); // 自动换行 cellstyle_c.setwraptext(true); cellstyle_c.setalignment(horizontalalignment.center); //取得输出流 outputstream out = response.getoutputstream(); //清空缓存 response.reset(); //设置相应内容的编码格式 response.setcharacterencoding("utf-8"); //1.导出名称 string filename =pd.getstring("filename"); //文件名乱码 //获得浏览器信息并转换为大写 string agent = request.getheader("user-agent").touppercase(); //ie浏览器和edge浏览器 if (agent.indexof("msie") > 0 || (agent.indexof("gecko")>0 && agent.indexof("rv:11")>0)) { filename = urlencoder.encode(filename, "utf-8"); } else { //其他浏览器 filename = new string(filename.getbytes("utf-8"), "iso-8859-1"); } response.setheader("content-disposition", "attachment;filename=" + filename + ".xlsx"); //定义输出类型 //response.setcontenttype("application/msexcel"); response.setcontenttype("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); //保存excel文件 workbook.write(out); //关闭文件流 out.close(); } catch (exception e) { e.printstacktrace(); } } /** * 导出excel * @author qkp * @param pds 需要导出的数据 * @param pd 导出excel公用数据,需包含title(标题)、headers(逗号隔开,为导出表头),filename(文件名,只须写上名字,这里会进行处理拼接) * @param request * @param response * @return */ public static void exportdata2(list<linkedhashmap<object,object>> pds, pagedata pd, httpservletrequest request, httpservletresponse response) { if(pds.size()<1){ return; } try { hssfworkbook workbook = new hssfworkbook(); //设置标题 hssfsheet sheet = workbook.createsheet(); //headers表示excel表中第一行的表头 string[] headers=pd.getstring("headers").split(","); //表头字体 font headerfont = workbook.createfont(); headerfont.setfontname("微软雅黑"); headerfont.setcolor(hssffont.color_normal); headerfont.setbold(true); //创建单元格,并设置值表头 设置表头居中 hssfcellstyle stylemain = workbook.createcellstyle(); //水平居中 stylemain.setalignment(horizontalalignment.center); stylemain.setfont(headerfont); stylemain.setborderbottom(borderstyle.thin); stylemain.setbottombordercolor(indexedcolors.black.getindex()); stylemain.setbordertop(borderstyle.thin); stylemain.settopbordercolor(indexedcolors.black.getindex()); stylemain.setborderleft(borderstyle.thin); stylemain.setleftbordercolor(indexedcolors.black.getindex()); stylemain.setborderright(borderstyle.thin); stylemain.setrightbordercolor(indexedcolors.black.getindex()); //导出样式 hssfcellstyle cellstyle_c = workbook.createcellstyle(); // 自动换行 cellstyle_c.setwraptext(true); cellstyle_c.setalignment(horizontalalignment.center); cellstyle_c.setborderbottom(borderstyle.thin); cellstyle_c.setbottombordercolor(indexedcolors.black.getindex()); cellstyle_c.setbordertop(borderstyle.thin); cellstyle_c.settopbordercolor(indexedcolors.black.getindex()); cellstyle_c.setborderleft(borderstyle.thin); cellstyle_c.setleftbordercolor(indexedcolors.black.getindex()); cellstyle_c.setborderright(borderstyle.thin); cellstyle_c.setrightbordercolor(indexedcolors.black.getindex()); //创建列标题行 hssfrow row = sheet.createrow(0); //标题行样式 hssfcellstyle titlestyle = workbook.createcellstyle(); //表头字体 font titlefont = workbook.createfont(); titlefont.setfontname("微软雅黑"); titlefont.setcolor(hssffont.color_normal); titlefont.setbold(true); titlefont.setfontheightinpoints((short)18); titlestyle.setfont(titlefont); titlestyle.setalignment(horizontalalignment.center); hssfcell titlecell =row.createcell(0); titlecell.setcellvalue(pd.getstring("title")); titlecell.setcellstyle(titlestyle); //合并单元格需要的逻辑 sheet.addmergedregion(new cellrangeaddress(0, 0, 0,headers.length-1 ));//合并单元格的函数 row.setrowstyle(titlestyle); row.setheightinpoints(56); //列表题 row = sheet.createrow(1); row.setheightinpoints(39); //在excel表中添加表头 for(int i=0;i<headers.length;i++){ hssfcell cell = row.createcell(i); hssfrichtextstring text = new hssfrichtextstring(headers[i]); cell.setcellvalue(text); cell.setcellstyle(stylemain); } int rownum = 2; //遍历集合数据 for(linkedhashmap<object,object> p :pds){ //依次创建行 hssfrow row1 = sheet.createrow(rownum); int i=0; //遍历数据 for (object key: p.keyset()){ //创建行中列 并放入数据 hssfcell cell = row1.createcell(i); string value=string.valueof(p.get(key)); cell.setcellvalue(value!=null?value:""); if("null".equals(value)){ cell.setcellvalue(""); } cell.setcellstyle(cellstyle_c); i++; } //row1.setheight((short) (26*10)); rownum++; } //自动调整列宽 for (int i = 0;i <headers.length;i++){ if(i==headers.length-2){ sheet.setcolumnwidth(i, 20 * 256); break; } if(i==3){ sheet.setcolumnwidth(i, 20 * 256); continue; } sheet.autosizecolumn(i); //sheet.autosizecolumn(i, true); } //取得输出流 outputstream out = response.getoutputstream(); simpledateformat dateformat = new simpledateformat("yyyy年mm月dd日hh时mm分ss秒"); //清空缓存 response.reset(); //设置相应内容的编码格式 response.setcharacterencoding("utf-8"); //1.导出名称 string filename =pd.getstring("filename")+dateformat.format(new date()); //文件名乱码 //获得浏览器信息并转换为大写 string agent = request.getheader("user-agent").touppercase(); //ie浏览器和edge浏览器 if (agent.indexof("msie") > 0 || (agent.indexof("gecko")>0 && agent.indexof("rv:11")>0)) { filename = urlencoder.encode(filename, "utf-8"); } else { //其他浏览器 filename = new string(filename.getbytes("utf-8"), "iso-8859-1"); } response.setheader("content-disposition", "attachment;filename=" + filename + ".xls"); //定义输出类型 response.setcontenttype("application/msexcel"); //保存excel文件 workbook.write(out); //关闭文件流 out.close(); } catch (exception e) { e.printstacktrace(); // return statuscode.error; } // return statuscode.success; } }
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论