根据接口文档书写接口,并在前端调用接口返回显示出数据(加下载)
---恢复内容开始---
1.首先来看接口文档(其中一个接口):
接口的编写:
1 /** 2 * 7.11 余额明细查询接口3 *4 *@paramtoken5 *@parampageNum6 * 非必填 分页查询当前页数,默认为 17 *@parampageSize8 * 非必填 每页记录数,默认为 209 *@paramorderId10 * 非必填 订单号11 *@paramstartDate12 * 非必填 开始日期,格式必须:yyyyMMdd13 *@paramendDate14 * 非必填 截止日期,格式必须:yyyyMMdd15 *@return 16 */ 17 public String getBalanceDetail(String token, int pageNum, int pageSize, String orderId, String startDate, String endDate);
server中对于接口实现的编写:
1 private static final String API_URL_BASE = GlobalCache.getSystemCache("jdNewApiUrlBase");2 //通用返回 3 private static final String SUCCESS = "success";4 private static final String RESULT_MESSAGE = "resultMessage";5 private static final String RESULT_CODE = "resultCode";6 private static final String RESULT = "result";
1 /** 2 * 7.11 余额明细查询接口3 *4 *@paramtoken5 *@parampageNum6 * 非必填 分页查询当前页数,默认为 17 *@parampageSize8 * 非必填 每页记录数,默认为 209 *@paramorderId10 * 非必填 订单号11 *@paramstartDate12 * 非必填 开始日期,格式必须:yyyyMMdd13 *@paramendDate14 * 非必填 截止日期,格式必须:yyyyMMdd15 *@return 16 */ 17 @Override18 public String getBalanceDetail(String token, int pageNum, intpageSize, String orderId, String startDate, String endDate) {19 Map<String, Object> paramMap = new HashMap<>();20 paramMap.put("token", token);21 if (pageNum > 0) {22 paramMap.put("pageNum", pageNum);23 }24 if (pageSize > 0) {25 paramMap.put("pageSize", pageSize);26 }27 if(StringUtils.isNotBlank(orderId)) {28 paramMap.put("orderId", orderId);29 }30 if(StringUtils.isNotBlank(startDate)) {31 paramMap.put("startDate", startDate);32 }33 if(StringUtils.isNotBlank(endDate)) {34 paramMap.put("endDate", endDate);35 }36 String responseStr;37 try{38 responseStr = HttpsUtil.post(API_URL_BASE + "/price/getBalanceDetail", paramMap);39 } catch(Exception e) {40 LogUtil.ERROR.error("调用接口失败:" +e);41 throw new AppException("调用接口失败");42 }43 Map<String, Object> detailMsgMap =toHashMap(responseStr);44 if(isQuerySuccess(detailMsgMap)) {45 returndetailMsgMap.get(RESULT).toString();46 } else{47 LogUtil.ERROR.error("调用接口返回失败:" +responseStr);48 throw new AppException("系统出现异常,错误代码[" + detailMsgMap.get(RESULT_CODE) + "],错误信息[" + detailMsgMap.get(RESULT_MESSAGE) + "]");49 }50 }
在controller里面对接口进行调用:
/*** 查询JD预存余额*@paramrequest*@paramresponse*@return*@throwsIOException*/@RequestMapping(params= "method=deposit4JD")publicModelAndView deposit4JD(HttpServletRequest request,HttpServletResponse response,String startDate,String endDate,String orderId) {try{//获取tokenString token =jdServer.getToken();String map= jdServer.getBalance(token, 4);map= map.substring(0, map.length()-2);//首次加载页面不查询列表数据if ("GET".equalsIgnoreCase(request.getMethod())){return new ModelAndView("/pages/balancesheet/JDdeposit");}Map mapDetail= new HashMap<>();Pager pager=RequestManager.getPager(request);int pageSize =pager.getPageSize();int currentPage = (int) pager.getPageNumber();//token验证、当前页面、每页显示、订单号、开始时间、结束时间mapDetail =JSONObject.fromObject(jdServer.getBalanceDetail(token, currentPage, pageSize, orderId,startDate, endDate));/*if(paginater==null){setAttribute(request, "count", Long.toString(0));setAttribute(request, "beans", null);}else{setAttribute(request, "beans", paginater.getData());}*/int total = (int) mapDetail.get("total");if(total > 0){request.setAttribute("isData", "1");}setAttribute(request,"count", mapDetail.get("total").toString());request.setAttribute("map", map);Object objData= mapDetail.get("data");request.setAttribute("objData", objData);request.setAttribute("startDate", startDate);request.setAttribute("endDate", endDate);request.setAttribute("orderId", orderId);}catch(BizException e) {e.printStackTrace();String str= "调用JD查询接口查询预存额明细发生错误!";LogUtil.ERROR.error(str+ ":" +e.getMessage());ErrorLog error= ErrorLogUtil.getErrorLog(e, request, this.getClass().getName(), str);elServer.save(error);throw newBizException(str);}return new ModelAndView("/pages/balancesheet/JDdeposit");}
值可以让页面获取到:
1 ---------------------------- 2 <body> 3 <div class="media"> 4 <div class="media-body media-middle"> 5 <h4 align="center">京东预存款剩余余额:<font color="red"><b>${map }元</b></font></h4> 6 </div> 7 <div class="media-right media-middle e-nowrap"> 8 <a href="javascript:void(0)" οnclick="addTabs('零点余额查询', 'balancesheet.do?method=queryDayBalance')">零点余额查询</a> 9 </div> 10 </div> 11 <div id="tip" style="display: inline; width: 100%;"> 12 <form class="form-horizontal" method="POST" action="balancesheet.do?method=deposit4JD" id="mainForm" name="mainForm"> 13 <div class="container-fluid e-checkbor"> 14 <span class="e-checktit">查询条件</span> 15 <div class="row"> 16 <div class="col-md-4"> 17 <div class="form-group"> 18 <label for="startTime01" class="col-sm-4 control-label e-nowrap">创建时间:</label> 19 <div class="col-sm-8"> 20 <input class="form-control Wdate" name="startDate" id="startDate" value="${startDate}" 21 onFocus="WdatePicker({el:'startDate',dateFmt:'yyyyMMdd',maxDate:'#F{$dp.$D(\'endDate\')}'})" > 22 </div> 23 </div> 24 </div> 25 <div class="col-md-4"> 26 <div class="form-group"> 27 <label for="endTime01" class="col-sm-4 control-label e-nowrap">到:</label> 28 <div class="col-sm-8"> 29 <input class="form-control Wdate" name="endDate" id="endDate" value="${endDate }" 30 onFocus="WdatePicker({el:'endDate',dateFmt:'yyyyMMdd',minDate:'#F{$dp.$D(\'startDate\')}'})"> 31 </div> 32 </div> 33 </div> 34 <div class="col-md-4"> 35 <div class="form-group"> 36 <label for="orderId" class="col-sm-4 control-label e-nowrap">订单号:</label> 37 <div class="col-sm-8"> 38 <input id="orderId" name="orderId" class="form-control" value="${orderId}" type="text"> 39 </div> 40 </div> 41 </div> 42 43 <div class="col-md-12"> 44 <div class="form-group"> 45 <div class="col-sm-12 text-right"> 46 <input type="submit" value="查询" class="btn btn-primary" /> 47 </div> 48 </div> 49 </div> 50 </div> 51 </div> 52 <div class="container-fluid"> 53 <div class="row"> 54 <div class="col-xs-12 e-padlr-no"> 55 <div class="list-group e-marb-no"> 56 <div class="list-group-item active e-radius-no"> 57 <div class="row"> 58 <div class="col-xs-6"> 59 <span>JD预存额明细</span> 60 </div> 61 <div class="col-xs-6 text-right"> 62 <a class="e-download" href="javascript: void(0)" style='<check:privilege url="balancesheet.do?method=exportExcel"/>' 63 οnclick="exportExcel('${isData}','${startDate}','${endDate }','${orderId}')"> 64 <i class="glyphicon glyphicon-download-alt"></i> 65 导出Excel66 </a> 67 </div> 68 </div> 69 </div> 70 </div> 71 </div> 72 </div> 73 </div> 74 </form> 75 </div> 76 77 <div class="ysde"> 78 <table class="table table-bordered table-hover table-striped text-center e-table"> 79 <thead> 80 <th width="8%" nowrap="nowrap">序号</th> 81 <!-- <th width="8%" nowrap="nowrap">id</th> --> 82 <th width="8%" nowrap="nowrap">创建时间</th> 83 <!-- <th width="8%" nowrap="nowrap">账户类型[标示]</th> --> 84 <th width="8%" nowrap="nowrap">交易金额</th> 85 <th width="8%" nowrap="nowrap">账户名称</th> 86 <th width="8%" nowrap="nowrap">订单号</th> 87 <!-- <th width="8%" nowrap="nowrap">交易类型编号</th> --> 88 <th width="8%" nowrap="nowrap">交易类型</th> 89 <th width="8%" nowrap="nowrap">交易流水号</th> 90 <th width="24%" nowrap="nowrap">备注</th> 91 </thead> 92 <tbody> 93 <form action="" name="subForm" method="post" id="subForm"> 94 95 <c:forEach items="${objData}" var="par" varStatus="status"> 96 <tr οnmοuseοver="mouseoverTr(this)" οnmοuseοut="mouseoutTr(this)"> 97 <td nowrap="nowrap">${status.index+1}</td> 98 <%-- <td nowrap="nowrap">${par['id']}</td> --%> 99 <td nowrap="nowrap">${par['createdDate']}</td> 100 <%-- <td nowrap="nowrap"><c:if test="${par['accountType'] == 1}">普通商户[${par['accountType']}]</c:if></td> --%> 101 <td nowrap="nowrap">${par['amount']}</td> 102 <td nowrap="nowrap">${par['pin']}</td> 103 <td nowrap="nowrap">${par['orderId']}</td> 104 <%-- <td nowrap="nowrap">${par['tradeType']}</td> --%> 105 <td nowrap="nowrap">${par['tradeTypeName']}</td> 106 <td nowrap="nowrap">${par['tradeNo']}</td> 107 <td nowrap="nowrap"> 108 <div class="e-spilled" title="${par['notePub']}" > 109 <c:if test="${fn:length(par['notePub']) > 30}"> 110 ${fn:substring(par['notePub'],0,30)}...111 </c:if> 112 <c:if test="${fn:length(par['notePub']) <= 30}"> 113 ${par['notePub']}114 </c:if> 115 </div> 116 </td> 117 </tr> 118 </c:forEach> 119 </form> 120 </tbody> 121 </table> 122 </div> 123 124 125 <pf:rect styleClass="page" align="right"> 126 <pn:nav name="count" formName="mainForm" scope="request" /></pf:rect> 127 128 <!--添加窗口--> 129 <div id="w" class="easyui-window e-eWindow" title="" iconCls="icon-save" closed="true"> 130 <iframe src="" width="100%" height="100%" frameborder="0" id="iframe" scrolling="yes"></iframe> 131 </div> 132 <input type="hidden" id="delsucc" value="" /> 133 <!--********** About js file and plug-in dependencies **********--> 134 <%@ include file="../../pages_public/include/public_foot.jsp" %> 135 <!--********** Use only the current page **********--> 136 <script type="text/javascript" src="${pageContext.request.contextPath}/js/plugin/datePicker/WdatePicker.js"></script> 137 <script type="text/javascript"> 138 function exportExcel(isData,startDate,endDate,orderId){139 if (isData == '1') {140 $.messager.confirm('提示', '确定下载?', function(r) {141 if(r) {142 location.href = "balancesheet.do?method=exportExcel&startDate=" +startDate143 + "&endDate=" + endDate + "&orderId=" +orderId ;144 }145 });146 } else{147 $.messager.alert('提示', '没有记录,无法下载!');148 }149 }150 </script> 151 </body>
上面还有一个Excel文档的下载方式,调用controller里面的下载方法:
1 @RequestMapping(params = "method=exportExcel")2 publicModelAndView exportExcel(HttpServletRequest request, HttpServletResponse response,3 String startDate,String endDate,String orderId)4 throwsIOException {5 try{6 ExportExcle exportExcle = new ExportExcle(); //新建导出对象 7 Object[] headerArray = new Object[] { //表头数组 8 "创建时间",9 "交易金额",10 "账户名称",11 "订单号",12 "交易类型","交易流水号","备注"};13 exportExcle.setTitleAndHeader("JD预存额明细", headerArray); //设置标题和表头----------step_114 15 //数据对应的数组List 16 for(Pager pager : exportExcle.getPagerList()) {17 List<Object[]> contentList = new ArrayList<>(); //内容列表18 //---------- 将从数据库获取的数据封装成List开始 19 Map mapDetail = new HashMap<>();20 String token =jdServer.getToken();21 //Pager pager = RequestManager.getPager(request); 22 int pageSize = 1000;//pager.getPageSize(); 23 int currentPage = 1;//(int) pager.getPageNumber();24 //token验证、当前页面、每页显示、订单号、开始时间、结束时间 25 mapDetail =JSONObject.fromObject(jdServer.getBalanceDetail(token, currentPage, pageSize, orderId,startDate, endDate));26 JSONArray objData = (JSONArray)mapDetail.get("data");27 for(Object object : objData) {28 Map map =(Map) object;29 Object[] objArr = newObject[] {30 map.get("createdDate"),31 map.get("amount"),32 map.get("pin"),33 map.get("orderId"),34 map.get("tradeTypeName"),35 map.get("tradeNo"),36 String.valueOf(map.get("notePub")).trim()37 };38 contentList.add(objArr); //增加内容 39 }40 //---------- 将从数据库获取的数据封装成List结束 41 exportExcle.setContentPagerDate(contentList, pager); //设置需要导出的内容列表----------step_2 42 }43 exportExcle.exportWorkbook(response); //将文件写入输出流----------step_3 44 } catch(Exception e) {45 LogUtil.MSG.error("下载失败了", e);46 }47 return null;48 49 }
在下载Excel时,调用了封装好的exportExcel里面的方法,其封装类如下:
1 packagecom.eptok.util;2 3 importjava.io.ByteArrayOutputStream;4 importjava.io.FileOutputStream;5 importjava.io.IOException;6 importjava.io.OutputStream;7 importjava.io.UnsupportedEncodingException;8 importjava.math.BigDecimal;9 importjava.text.DecimalFormat;10 importjava.util.ArrayList;11 importjava.util.HashMap;12 importjava.util.List;13 importjava.util.Map;14 15 importjavax.servlet.http.HttpServletResponse;16 17 importorg.apache.poi.hssf.util.HSSFColor;18 importorg.apache.poi.ss.usermodel.Cell;19 importorg.apache.poi.ss.usermodel.CellStyle;20 importorg.apache.poi.ss.usermodel.Font;21 importorg.apache.poi.ss.usermodel.HorizontalAlignment;22 importorg.apache.poi.ss.usermodel.Row;23 importorg.apache.poi.ss.usermodel.Sheet;24 importorg.apache.poi.ss.usermodel.VerticalAlignment;25 importorg.apache.poi.ss.util.CellRangeAddress;26 importorg.apache.poi.xssf.streaming.SXSSFSheet;27 importorg.apache.poi.xssf.streaming.SXSSFWorkbook;28 29 importhikefa.core.web.page.Pager;30 31 public classExportExcle {32 33 /**最大导出行数*/ 34 public static final int MAX_ROWS = 500000;35 36 /**分页行数*/ 37 public static final int PAGING_ROWS = 50000;38 39 /**SXSSF操作行数*/ 40 public static final int SXSSF_ROWS = 100;41 42 /**缓存行数*/ 43 public static final int CACHE_ROWS = 1000;44 45 /**创建Workbook*/ 46 SXSSFWorkbook workbook = newSXSSFWorkbook(SXSSF_ROWS);47 48 /**当前Sheet*/ 49 Sheet sheet;50 51 /**内容总数*/ 52 private int contentCount = 0;53 54 /**总页数*/ 55 private intpageCount;56 57 /**分页列表*/ 58 private List<Pager> pagerList = new ArrayList<>();59 60 /**标题*/ 61 privateString title;62 63 /**表头数组*/ 64 privateObject[][] headerArray;65 66 /**导出列数*/ 67 private intcolCount;68 /**标题行数*/ 69 private int titleRows = 0;70 /**标题行数*/ 71 private int headerRows = 0;72 73 /**样式Map*/ 74 private Map<String, CellStyle> styleMap = new HashMap<>();75 76 /**列宽数组*/ 77 privateInteger[] intArray;78 79 /**构造方法*/ 80 publicExportExcle() {81 }82 // //***Demo***83 //ExportExcle exportExcle = new ExportExcle();//新建导出对象84 //int contentCount = 0;//从数据库获取内容总数(可选)----------step_0(数据量大于50000,建议设置)85 //exportExcle.setContentCount(contentCount);//设置内容总数(可选)----------step_0(数据量大于50000,建议设置)86 //Object[] headerArray = new Object[] {//表头数组87 //"",88 //""};89 //exportExcle.setTitleAndHeader("标题", headerArray);//设置标题和表头----------step_190 // //遍历分页列表进行操作91 //for(Pager pager : exportExcle.getPagerList()) {92 //List<Object[]> contentList = new ArrayList<>();//内容列表93 // //---------- 将从数据库获取的数据封装成List开始94 //Paginater paginater = server.findSplitPage(pager);95 //for(Object object : paginater.getData()) {96 //Map<String, Object> map = (Map<String, Object>) object;97 //Object[] objArr = new Object[] {};98 //contentList.add(objArr);//增加内容99 //}100 // //---------- 将从数据库获取的数据封装成List结束101 //exportExcle.setContentPagerDate(contentList, pager);//设置需要导出的内容列表----------step_2102 //}103 //exportExcle.exportWorkbook(response);//将文件写入输出流----------step_3 104 105 106 /**step_0:设置内容总数(不设置则默认为单页导出)*/ 107 public void setContentCount(intcontentCount) {108 this.contentCount = contentCount; //设置内容总数 109 }110 111 /**step_1:设置标题和表头数组(单行),并初始化参数*/ 112 public voidsetTitleAndHeader(String title, Object[] headerArray) {113 Object[][] headerArrayTemp = new Object[1][];114 headerArrayTemp[0] =headerArray;115 setTitleAndHeader(title, headerArrayTemp);116 }117 /**step_1:设置标题和表头数组(多行),并初始化参数*/ 118 public voidsetTitleAndHeader(String title, Object[][] headerArray) {119 this.title =title;120 this.headerArray =headerArray;121 parameterChecking(); //校验参数 122 }123 124 /**step_2:设置需要导出的内容列表*/ 125 public void setContentPagerDate(List<Object[]>contentList, Pager pager) {126 LogUtil.APP.info("开始将[" + title + "] - 第" + pager.getPageNumber() +"页数据写入Excle文件 - " 127 + DateUtil.getCurrentDateTime("yyyy-MM-dd HH:mm:ss"));128 if(null == contentList ||contentList.isEmpty()) {129 throw new IllegalArgumentException("查询不到需要导出的数据[contentList]");130 }131 //---------- 导出数据到Excle文件Sheet页开始 132 String sheetName = "第" + pager.getPageNumber() +"页 - 共" + pageCount + "页"; //sheet名称 133 sheet = workbook.createSheet(sheetName); //创建工作表 134 writeTitle(); //写入标题 135 writeHeader(); //写入表头数组 136 writeContent(contentList); //写入内容列表 137 autoColumnSize(); //自适应列宽,并冻结窗格138 //---------- 导出数据到Excle文件Sheet页结束 139 contentList.clear(); //清空列表 140 LogUtil.APP.info("将[" + title + "] - 第" + pager.getPageNumber() +"页数据写入Excle文件结束 - " 141 + DateUtil.getCurrentDateTime("yyyy-MM-dd HH:mm:ss"));142 }143 144 /**step_3:将文件写入输出流*/ 145 public voidexportWorkbook() {146 exportWorkbook("D:/"); //默认导出到D盘根目录 147 }148 /**step_3:将文件写入输出流*/ 149 public voidexportWorkbook(String path) {150 FileOutputStream fos = null;151 try{152 fos = new FileOutputStream(path + title + ".xlsx");153 workbook.write(fos);154 ((SXSSFWorkbook) workbook).dispose();155 } catch(IOException e) {156 e.printStackTrace();157 } finally{158 if (fos != null) {159 try{160 fos.close();161 } catch(IOException e) {162 e.printStackTrace();163 }164 }165 }166 }167 /**step_3:将文件写入输出流*/ 168 public voidexportWorkbook(HttpServletResponse response) {169 ByteArrayOutputStream baos = null;170 OutputStream os = null;171 try{172 baos = newByteArrayOutputStream();173 workbook.write(baos);174 ((SXSSFWorkbook) workbook).dispose();175 String fileName = new String(title.getBytes("gbk"), "ISO8859-1");176 response.reset(); //清空输出流 177 response.setHeader("Content-disposition", "attachment; filename=" + fileName + ".xlsx");178 response.setContentType("application/msexcel");179 response.setContentLength(baos.size());180 os =response.getOutputStream();181 baos.writeTo(os);182 os.flush();183 } catch(IOException e) {184 e.printStackTrace();185 } finally{186 if (baos != null) {187 try{188 baos.close();189 } catch(IOException e) {190 e.printStackTrace();191 }192 }193 if (os != null) {194 try{195 os.close();196 } catch(IOException e) {197 e.printStackTrace();198 }199 }200 }201 }202 203 204 //--------------------------------------------------调用的方法-------------------------------------------------- 205 206 207 /**校验参数*/ 208 private voidparameterChecking() {209 if(null ==title) {210 throw new IllegalArgumentException("标题未设置");211 }212 if(null == headerArray || headerArray.length == 0) {213 throw new IllegalArgumentException("表头数组未设置");214 } else{215 if(null != headerArray[0] && 0 < headerArray[0].length) {216 headerRows = headerArray.length; //设置表头行数 217 colCount = headerArray[0].length; //设置导出列数 218 intArray = new Integer[colCount]; //初始化列宽数组 219 } else{220 throw new IllegalArgumentException("无法确定导出列数");221 }222 }223 if(contentCount <= 0) {224 contentCount = PAGING_ROWS; //默认为单页导出 225 }226 setPagerList(); //设置分页信息 227 initStyleMap(); //初始化样式Map 228 }229 230 /**设置分页列表*/ 231 private voidsetPagerList() {232 if(contentCount >MAX_ROWS) {233 contentCount =MAX_ROWS;234 }235 //计算总页数 236 pageCount = contentCount % PAGING_ROWS > 0 ? contentCount / PAGING_ROWS + 1 : contentCount /PAGING_ROWS;237 //设置分页列表 238 for (int i = 1; i <= pageCount; i++) {239 //int paging = i == pageCount && contentCount % PAGING_ROWS > 0 ?240 //contentCount % PAGING_ROWS : PAGING_ROWS;//当前分页行数241 //pagingList.add(i, new Pager(i, paging)); 242 pagerList.add(newPager(i, PAGING_ROWS));243 }244 }245 /**获取分页列表*/ 246 public List<Pager>getPagerList() {247 returnpagerList;248 }249 250 251 //--------------------------------------------------Excle操作-------------------------------------------------- 252 253 254 /**写入表头标题*/ 255 private voidwriteTitle() {256 //创建行对象 257 Row row = sheet.createRow(0); //创建行对象 258 Cell cell = row.createCell(0); //创建单元格 259 cell.setCellValue(title); //写入内容 260 setRowStyle(0, styleMap.get("titleStyle")); //设置行样式 261 mergedRegion(0, 0, 0, colCount-1); //合并单元格 262 titleRows = 1; //记录标题行数 263 }264 265 /**写入表头数组headerArray[row][col]*/ 266 private voidwriteHeader() {267 for(int rowNum=0; rowNum < headerRows; rowNum++) {268 if(null == headerArray[rowNum] || 0 ==headerArray[rowNum].length) {269 continue; //行数据为空,跳出当次循环 270 }271 //创建行对象 272 Row row = sheet.createRow(rowNum +titleRows);273 for(int colNum=0; colNum < colCount; colNum++) {274 Cell cell = row.createCell(colNum); //创建单元格 275 cell.setCellStyle(styleMap.get("headerStyle")); //设置表头样式 276 if(null == headerArray[rowNum][colNum] || "*".equals(headerArray[rowNum][colNum])) {277 continue; //单元格数据为空,跳出当次循环 278 }279 setCellValue(cell, headerArray[rowNum][colNum], colNum); //写入内容值 280 }281 }282 }283 284 /**写入内容列表contentList*/ 285 private void writeContent(List<Object[]>contentList) {286 for(int rowNum = 0; rowNum < contentList.size(); rowNum++) {287 Object[] array =contentList.get(rowNum);288 if(null == array || 0 ==array.length) {289 continue; //数组为空,跳出当次循环 290 }291 //创建行对象 292 Row row = sheet.createRow(rowNum + titleRows + titleRows); //在表头之后 293 for(int colNum = 0; colNum < array.length; colNum++) {294 if(null ==array[colNum]) {295 continue; //跳出当次循环 296 }297 Cell cell = row.createCell(colNum); //创建单元格 298 cell.setCellStyle(styleMap.get("contentStyle")); //设置样式 299 setCellValue(cell, array[colNum], colNum); //写入内容值 300 }301 //每当行数达到设置的值就刷新数据到硬盘,以清理内存 302 if(rowNum % CACHE_ROWS == 0){303 try{304 ((SXSSFSheet) sheet).flushRows();305 } catch(IOException e) {306 e.printStackTrace();307 }308 }309 }310 autoMergedRegion(); //自动合并单元格 311 }312 313 /**自适应列宽*/ 314 private voidautoColumnSize() {315 /*//自适应列宽316 for(int colNum=0; colNum<headerColSize; colNum++) {317 sheet.autoSizeColumn(colNum, true); //自适应尺寸318 //默认最小列宽(取默认宽度值8)319 int minColumnWidth = (int)((sheet.getDefaultColumnWidth() + 0.72) * 256);320 if(sheet.getColumnWidth(colNum) < minColumnWidth) {321 sheet.setColumnWidth(colNum, minColumnWidth);322 }323 }*/ 324 //批量设置列宽 325 for(int i=0; i<intArray.length; i++) {326 if(null == intArray[i] || intArray[i] <sheet.getDefaultColumnWidth()) {327 //默认最小列宽(取默认宽度值8) 328 intArray[i] =sheet.getDefaultColumnWidth();329 }330 sheet.setColumnWidth(i, (int)((intArray[i] + 2 + 0.72) * 256)); //参数为列index,列宽(字符数) 331 }332 //冻结窗格 333 sheet.createFreezePane(0, titleRows + headerRows, 0, titleRows +headerRows);334 }335 336 337 338 /**设置单元格的值*/ 339 private void setCellValue(Cell cell, Object obj, intcolNum) {340 //格式化参数 341 if(obj instanceof BigDecimal || obj instanceofDouble) {342 Double decimal = Double.valueOf(obj.toString().replace(" ", ""));343 obj = new DecimalFormat("#0.00").format(decimal);344 }345 cell.setCellValue(obj.toString()); //写入内容 346 try{347 int length = obj.toString().getBytes("gbk").length;348 if(intArray[colNum] == null || intArray[colNum] <length) {349 intArray[colNum] =length;350 }351 } catch(UnsupportedEncodingException e) {352 e.printStackTrace();353 }354 }355 356 /**自动合并单元格*/ 357 private voidautoMergedRegion() {358 if(null == headerArray || 0 ==headerArray.length) {359 return; //表头数组为空,退出方法 360 }361 if(null == headerArray[0][0]) {362 headerArray[0][0] = ""; //初始项不能空 363 }364 //设置表头数值 365 for(int rowNum=0; rowNum < headerRows; rowNum++) {366 for(int colNum=0; colNum < colCount; colNum++) {367 if(null != headerArray[rowNum][colNum] && !"*".equals(headerArray[rowNum][colNum])) {368 autoMergedRegion(rowNum ,colNum); //执行合并操作 369 }370 }371 }372 }373 /**执行合并操作*/ 374 private void autoMergedRegion(int firstRow ,intfirstCol) {375 int lastRow = headerRows - 1; //最后一行 376 int lastCol = colCount - 1; //最后一列377 //如果不为最后一行 378 if(firstRow !=lastRow) {379 for(int row = firstRow+1; row < headerRows; row++) {380 if(null !=headerArray[row][firstCol]) {381 if("*".equals(headerArray[row][firstCol])) {382 lastRow = row; //定位最后一行,占位符不减1 383 } else{384 lastRow = row-1; //定位最后一行 385 }386 break;387 }388 }389 }390 //如果不为最后一列 391 if(firstCol !=lastCol) {392 for(int col=firstCol+1; col < colCount; col++) {393 if(null !=headerArray[firstRow][col]) {394 if("*".equals(headerArray[firstRow][col])) {395 lastCol = col; //定位最后一列,占位符不减1 396 } else{397 lastCol = col-1; //定位最后一列 398 }399 break;400 }401 }402 }403 if(firstRow == lastRow && firstCol ==lastCol) {404 return; //无操作,不执行方法 405 }406 mergedRegion(firstRow + titleRows, lastRow +titleRows, firstCol, lastCol);407 }408 /**合并单元格*/ 409 private void mergedRegion(int firstRow, int lastRow, int firstCol, intlastCol) {410 sheet.addMergedRegion(newCellRangeAddress(firstRow, lastRow, firstCol, lastCol));411 }412 413 /**设置行样式*/ 414 private void setRowStyle(introwNum, CellStyle style) {415 if(null ==style) {416 return; //样式为空,退出方法 417 }418 Row row =sheet.getRow(rowNum);419 if(row == null) {420 row = sheet.createRow(rowNum); //如果行对象为空,则创建 421 }422 for(int colNum = 0; colNum < colCount; colNum++) {423 Cell cell=row.getCell(colNum);424 if( cell == null){425 cell =row.createCell(colNum);426 cell.setCellValue("");427 }428 cell.setCellStyle(style); //设置样式 429 }430 }431 432 /**初始化样式Map*/ 433 private voidinitStyleMap() {434 CellStyle titleStyle =workbook.createCellStyle();435 titleStyle.setAlignment(HorizontalAlignment.CENTER);//水平对齐方式 436 titleStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直对齐方式437 //style.setFillForegroundColor(HSSFColor.AQUA.index);//前景色438 //style.setFillPattern(FillPatternType.SOLID_FOREGROUND);//模式(前景色)439 //style.setWrapText(true);//自动换行 440 Font font1 = workbook.createFont();//生成一个字体 441 font1.setColor(HSSFColor.RED.index);//字体颜色 442 font1.setFontHeightInPoints((short) 16);//字体大小443 //font.setBold(true);//字体加粗 444 font1.setFontName("Arial");//字体名称 445 titleStyle.setFont(font1);//设置字体 446 styleMap.put("titleStyle", titleStyle); //放入样式Map 447 448 CellStyle headerStyle =workbook.createCellStyle();449 headerStyle.setAlignment(HorizontalAlignment.CENTER);//水平对齐方式 450 headerStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直对齐方式451 //style.setBorderTop(BorderStyle.THIN);//上边框452 //style.setBorderBottom(BorderStyle.THIN);//下边框453 //style.setBorderLeft(BorderStyle.THIN);//左边框454 //style.setBorderRight(BorderStyle.THIN);//右边框 455 Font font2 = workbook.createFont();//生成一个字体 456 font2.setColor(HSSFColor.BLUE.index);//字体颜色 457 font2.setFontHeightInPoints((short) 10);//字体大小 458 font2.setFontName("Arial");//字体名称 459 headerStyle.setFont(font2);//设置字体 460 styleMap.put("headerStyle", headerStyle); //放入样式Map 461 462 CellStyle contentStyle =workbook.createCellStyle();463 contentStyle.setAlignment(HorizontalAlignment.CENTER);//水平对齐方式 464 contentStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直对齐方式 465 Font font3 = workbook.createFont();//生成一个字体 466 font3.setFontHeightInPoints((short) 10);//字体大小 467 font3.setFontName("Arial");//字体名称 468 contentStyle.setFont(font3);//设置字体 469 styleMap.put("contentStyle", contentStyle); //放入样式Map 470 }471 472 }
完!!!!
转载于:https://www.cnblogs.com/1987721594zy/p/10032073.html
根据接口文档书写接口,并在前端调用接口返回显示出数据(加下载)相关推荐
- java接口文档生成工具_【分享】接口文档生成工具apipost
一.为什么要写接口文档? 正规的团队合作或者是项目对接,接口文档是非常重要的,一般接口文档都是通过开发人员写的.一个工整的文档显得是非重要. 项目开发过程中前后端工程师有一个统一的文件进行沟通交流开发 ...
- 开发接口文档_产品经理必懂的接口文档撰写方式
做产品经理的难免会调研各式各样的第三方需求能力.以满足产品提供用户的市场价值,比如第三方登录.图像识别.风控算法,都有专注的服务厂商. 企业无需自己花时间和精力投入在具有较高技术壁垒或时间成本的需求上 ...
- 对接接口文档_产品经理所理解的接口
本文目标用户: 1.在产品设计中遇到有关于接口对接的经历,但是之前没有接触过类似对接. 2.想了解产品眼中的接口到底是什么东西? 3.对于已经明确了解并有相关对接的产品大佬们,欢迎你们指点. 一.AP ...
- api数据接口文档_接口文档示例(Taobao/jd/pinduoduo/开放接口调用)
api数据接口文档_接口文档示例 本文主要是提供了一个接口文档的范文,内容修订历史.目录.时序图.接口要素描述.接口说明.使用示例.字典.FAQ. 使用MD格式文档(makedown),选择原因,容 ...
- 高德地图api接口文档_在 R 语言里面调用高德地图接口:地理编码与路径规划
你知道从广州南站去珠江新城怎么走么?今天就让我们一起使用 R 语言调用高德地图的地理编码(地址转经纬度)接口和路径规划接口来回答这个问题. 准备工作 注册高德地图,创建应用添加 Key(注意申请 Ke ...
- 微信公众号开发之(文档02)微信公众号调用接口 全局返回码
公众号每次调用接口时,可能获得正确或错误的返回码, 开发者可以根据返回码信息调试接口,排查错误 全局返回码说明如下: 返回码 说明 -1 系统繁忙,此时请开发者稍候再试 0 请求成功 40001 获取 ...
- 接口文档神器Swagger(下篇)
本文来自网易云社区 作者:李哲 二.Swagger-springmvc原理解析 上面介绍了如何将springmvc和springboot与swagger结合,通过简单配置生成接口文档,以及介绍了swa ...
- 接口文档神器Swagger(上篇)
本文来自网易云社区 作者:李哲 接口文档管理一直是一个让人头疼的问题,伴随着各种接口文档管理平台涌现,如阿里开源的rap,ShowDoc,sosoapi,等等(网上能找到很多这种管理平台,包括我们自己 ...
- 基于 apidoc 生成在线接口文档 (实时更新)(linux系统)
基于 apidoc 生成在线接口文档 (实时更新)(linux系统) 动态加载,热部署 背景: 规范开发人员的接口文档 文档统一管理,防止本地文档版本不统一 远程部署,保证文档的统一性 主要还是解决, ...
最新文章
- 阿里云服务器上使用iptables设置安全策略
- 《2022博客之星拉票专用帖》
- Qt CMake命令参考
- Android解决ScrollView中的滑动效果导致GestureDetector中的OnFling不能正常工作问题
- LeetCode 60. 第k个排列(回溯 康托展开)
- mindi linux 使用教程,Linux使用入门教程之tuned
- 大家可以放心了!Redmi K20将配备双频GPS
- 在C#中将字符串转换为字节数组
- 仅需5道题轻松掌握Python命令行相关标准库 | Python技能树征题
- Java Swing线程之SwingUtilities.invokeLater解释
- 如何使用PDF阅读器将PDF转换成图片
- 服务器sas系统盘损坏,磁盘阵列中SCSI、SAS硬盘由于一块或者多块有坏道引起操作系统产生如下故障...
- 服务器审计资质证书,利用ACS服务器实现用户的认证、授权和审计
- 精密型工业级UHF超高频RFID读写器|读卡器JT7300的MODBUS协议说明
- 温故知新-什么是软件工程
- Excel | IF/IFS函数的使用 | 结合AND, OR, NOT多条件判断
- python白名单验证是什么意思_luminati python+selenium使用方式(白名单和账号密码验证方式)...
- C#中sender的用法
- clover写入efi_clover如何使用UEFI引导和EFI驱动选择
- Leetcode-D21-动态规划(二刷)-55. 跳跃游戏45. 跳跃游戏 II
热门文章
- Kettle环境中的参数传递
- 图像处理合集:图像基础操作(图像翻转、图像锐化、图像平滑等)、图像阈值分割(边缘检测、迭代法、OSTU、区域增长法等)、图像特征提取(图像分割、灰度共生矩阵、PCA图像压缩)
- 量化必读:Tick数据到底是什么为么难找到可靠交易数据?
- 计算三位数的水仙花数(个,十,百位数的立方和等于该数本身)
- this[xx] 与 this.xx 的区别
- 磺化酞菁铜(CuTsPc),CAS:147-14-8酮酞菁Copper(II)Phthalocyanine(α-form)
- 斐讯 PSG1208 K1 免拆机刷breed 不死uboot
- 操作系统/应用程序、操作中的“并发”、线程和进程的区别,线程
- 怎么检查计算机硬盘有没有供电,怎么检查电脑中硬盘中有没有坏道?
- 关于深度学习主机的一些选配问题