当前位置:首页 > 科技

【poi怎么设置excel】POI导出Excel

前言

数据报告是许多项目中的模块,通常导出Excel或PDF。这里有从项目中将Excel导出到POI的记录。在项目中,必须根据页面jqgrid的机架查询条件导出相应的机架数据。jqgrid是分页的,但所有导出都必须导出。

福伊

Apache poi-the Java API for Microsoft documents,官方主页:

编写代码

Maven引入了POI

Dependency

GroupIdorg.a/groupId

工件idpoi/工件id

/dependency或

Dependency!- Excel工具类(Easy POI) -

GroupIdcn.afterturn/groupId

artifactideasypoi-base/artifact id

版本3.2.0/版本

/dependency

Dependency!- Excel工具类(Easy POI) -

GroupIdcn.afterturn/groupId

artifactideasypoi-web/artifact id

版本3.2.0/版本

/dependency

Dependency!- Excel工具类(Easy POI) -

GroupIdcn.afterturn/groupId

artifactideasypoi-annotation/artifact id

版本3.2.0/版本

/dependencyhtml,调用js

Dependency!- Excel工具类(Easy POI) -

GroupIdcn.afterturn/groupId

artifactideasypoi-base/artifact id

版本3.2.0/版本

/dependency

Dependency!- Excel工具类(Easy POI) -

GroupIdcn.afterturn/groupId

artifactideasypoi-web/artifact id

版本3.2.0/版本

/dependency

Dependency!- Excel工具类(Easy POI) -

GroupIdcn.afterturn/groupId

artifactideasypoi-annotation/artifact id

版本3.2.0/版本

/dependency//excel导出

Function exportRackExcel() {

//获取当前jqGrid分页参数

Var postdata=$ ('# rack ')。jqgrid ('getgridparam ',' post data ');

=1;

=99999999;//每页设置9亿条记录(无限,全部查询)

//ajax不支持Excel类型。请使用loca或表单提交

//window.loca,get提交,数据暴露在URL中,相对不安全

//创建临时隐藏表单、提交表单、请求正文中的数据、相对安全性

Var $ form=$ ('form ')。CSS ({显示器3360' none'})。attr ('method ',' post ')

For (var key in postData) {

Var $ input=$ ('input ')。attr ('name ',key)。val(post data[k]

ey]); $($input); } $("body").append($form); $(); //过河拆桥,提交完成后remove掉 $(); }

  纯js写法

//其他操作,同上 let $form = document.createElement('form'); $;none"; $;POST"; $ + "/excel"; for (let key in postData) { if(postData[key]){ let $input = document.createElement('input'); $in; $in[key]; $Child($input); } } document.body.appendChild($form); $(); //过河拆桥,提交完成后remove掉 $();

  controller

/** * 根据当前jqGrid分页情况,创建并导出Excel文件 * * @param entity 机架实体,用来接收查询条件 * @return ResponseEntity */ @PostMapping("/excel") public ResponseEntity createExcel(RackVo entity) { //Excel对应的columnNames列名集合 { key,label } String[][] excelMap = { {"no", "Rack Code"}, {"rackName", "Rack Name"}, {"roomName", "Room"}, {"idc", "IDC Center"}, {"clientName", "Customer"}, {"rackTypeName", "Type"}, {"existentialMode", "Existential Mode"}, {"maxPower", "Maximum Power(KVA)"}, {"status", "Status"}, {"administrate", "Administrate"}, }; return DownloadU("Rack Management", excelMap, rackService.createExcel(entity).getData()).getData(), "机架数据报表"); }

  两个工具类:导出Excel工具类 ExportExcelUtil,下载工具类 DownloadUtil

/** * java POI 导出Excel表工具类 */ public class ExportExcelUtil { //禁止实例化 private ExportExcelUtil() { } /** * 只支持一级表头 * * @param titleName 表标题 * @param columnNames 列名集合,key是用来设置填充数据时对应单元格的值,label就是对应的列名,生成Excel表时, * 第一维数组下标0对应值为Excel表最左边的列的列名 例:{ { key,label },{ key,label } } * @param dataLists 数据集合,key对应的是列名集合的key,value是要填充到单元格的值 例:ArrayList<HashMap<String key, String vaule>> * @return ResultModel<Workbook> */ public static ResultModel<Workbook> createExcel(String titleName, String[][] columnNames, ArrayList<HashMap<String, String>> dataLists) { //创建HSSFWorkbook对象(excel的文档对象) HSSFWorkbook wb = new HSSFWorkbook(); //建立新的sheet对象(excel的表单) HSSFSheet sheet = wb.createSheet(titleName);//设置表单名 //1、标题名 //创建标题行,参数为行索引(excel的行),可以是0~65535之间的任何一个 HSSFRow row1 = (0); //标题的字体 HSSFFont font1 = wb.createFont(); ((short) 12); ("黑体"); //标题的样式 HSSFCellStyle style1 = wb.createCellStyle(); );//水平居中 );//垂直居中 // 把字体 应用到当前样式 (font1); //自动换行 (true); //自定义填充颜色(天空蓝) ); ()); // 设置边框 ); ); ); ); createCell(row1, 0, style1, titleName); //合并单元格CellRangeAddress构造参数依次表示起始行,截至行,起始列, 截至列 (new CellRangeAddress(0, 0, 0, columnNames.length - 1)); //2、列名 //创建列名行 //列名的字体 HSSFFont font2 = wb.createFont(); ((short) 12); ("新宋体"); //列名的样式 HSSFCellStyle style2 = wb.createCellStyle(); );//水平居中 );//垂直居中 // 把字体 应用到当前样式 (font2); //自动换行 (true); //自定义填充颜色(浅蓝色) ); ()); // 设置边框 ); ); ); ); HSSFRow row2 = (1); for (int i = 0; i < columnNames.length; i++) { //单元格宽度 (i, 20 * 256); createCell(row2, i, style2, columnNames[i][1]);//例:[[key,label],[key,label]] 取label } //3、填充数据 //内容的字体 HSSFFont font3 = wb.createFont(); ((short) 12); ("新宋体"); //内容的样式 HSSFCellStyle style3 = wb.createCellStyle(); );//水平居中 );//垂直居中 // 把字体 应用到当前样式 (font3); //自动换行 (true); //默认无填充 ); ()); // 设置边框 ); ); ); ); int index = 2;//标题行、列名行,所以数据行默认从第三行开始 for (HashMap<String, String> map : dataLists) { //创建内容行 HSSFRow row3 = (index); for (int i = 0; i < columnNames.length; i++) { String val = map.get(columnNames[i][0]); createCell(row3, i, style3, val == null ? "" : val);//例:[[key,label],[key,label]] 取key } index++; } return Re(wb); } /** * 创建一个单元格 * * @param row 行 * @param column 列 * @param cellStyle 单元格样式 * @param text 值 */ private static void createCell(Row row, int column, CellStyle cellStyle, String text) { Cell cell = row.createCell(column); // 创建单元格 cell.setCellValue(text); // 设置值 cell.setCellStyle(cellStyle); // 设置单元格样式 } }import org.a; import org.; import org.; import org.; import org.; import org.; import java.io.*; import java.nio.c; import java.; import java.u; /** * 文件下载工具类 */ public class DownloadUtil{ /** * 快速下载 */ public static ResponseEntity download(byte[] fileBytes, String fileName) { //设置文件 HttpHeaders headers = new HttpHeaders(); ); ("attachment", new String),S)); //下载文件 return new ResponseEntity<>(fileBytes, headers, H); } /** * 快速下载 */ public static ResponseEntity download(File file) { return download(getByteArray(file), ()); } /** * 快速下载 */ public static ResponseEntity download(Workbook workbook, String fileName) { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); try { fileName = fileName + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + ".xls"; workbook.write(outputStream); } catch (IOException e) { throw new RuntimeException(e); } return download(), fileName); } //获取文件的字节数组 private static byte[] getByteArray(File file) { if (!()) { throw new RuntimeException("File Not Found:" + ()); } ByteArrayOutputStream bos = new ByteArrayOutputStream((int) ()); BufferedInputStream in = null; try { in = new BufferedInputStream(new FileInputStream(file)); int buf_size = 1024; byte[] buffer = new byte[buf_size]; int len; while (-1 != (len = in.read(buffer, 0, buf_size))) { bos.write(buffer, 0, len); } return bos.toByteArray(); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException(e); } finally { try { assert in != null; in.close(); bos.close(); } catch (IOException e) { e.printStackTrace(); } } } //获取文件名后缀 private static String getSuffix(String fileName) { int lastPointIndex = ("."); if (fileName) || lastPointIndex == -1) { return null; } return (lastPointIndex + 1); } }

  获取封装数据的service层 createExcel,直接到取page分页方法,遍历机架数据集合,设置Map<key,value>,add到list<Map>中,最后将封装好的数据return回controller,传入工具类,最后下载。

/** * 根据当前jqGrid分页情况,创建并导出Excel文件 * * @param entity 查询条件 * @return 封装好的数据集合 */ @Override public ResultModel<ArrayList<HashMap<String, String>>> createExcel(RackVo entity) { ArrayList<HashMap<String, String>> dataLists = new ArrayList<HashMap<String, String>>(); //直接调page分页方法,获取当前jqGrid分页条件对应的数据集合, ResultModel<PageInfo<RackVo>> rm = page(entity); if ()) { List<RackVo> rackVoList = rm.getData().getRows(); for (RackVo rackVo : rackVoList) { HashMap<String, String> map = new HashMap<String, String>(16); map.put("no", rackVo.getNo() != null ? rackVo.getNo() : ""); map.put("rackName", rackVo.getName() != null ? rackVo.getName() : ""); map.put("roomName", rackVo.getRoom() != null ? rackVo.getRoom().getRoomname() : ""); map.put("idc", rackVo.getOrg() != null ? rackVo.getOrg().getOrgName() : ""); map.put("clientName", rackVo.getCustomer() != null ? rackVo.getCustomer().getClientname() : ""); map.put("rackTypeName", rackVo.getRacktype() != null ? rackVo.getRacktype().getName() : ""); map.put("existentialMode", "1".equal()) ? "Physical" : "Virtual"); map.put("maxPower", rackVo.getMaxpower() != null ? rackVo.getMaxpower() : ""); String status = rackVo.getServiceStatus(); switch (status != null ? status : "") { case "1": status = "Idle"; break; case "2": status = "Reserved"; break; case "3": status = "Occupied"; break; default: status = ""; break; } map.put("status", status); String administrate = rackVo.getAdministrate(); switch (administrate != null ? administrate : "") { case "R": administrate = "Cust Own"; break; case "U": administrate = "CTG Own"; break; default: administrate = ""; break; } map.put("administrate", administrate); da(map); } } return Re(dataLists); }

  效果

  从开发阶段到测试阶段,导了无数次,没毛病

  小升级

  excelMap,Excel对应的columnNames列名集合 { key,label },可以不用再controller设置了,直接从页面jqgrid抓取,传入controller就行(滑稽脸~)

//获取jqgrid头部标题tr,有多少个tr就有多少级标题 var thead_tr = $(".ui-jqgrid-htable").find(";); //遍历thead_tr找出每一个标题,并保存到对象中 var titles = []; (function(index_tr,element_tr){ ([]); $(element_tr).find("th").each(function(index_th,element_th){ //内容 var label = $(element_th).text(); //所占行 rowspan 默认1 var rowspan = $(element_th).attr("rowspan") || 1; //所占列 colspan 默认1 var colspan = $(element_th).attr("colspan") || 1; //键 var key = $(element_th).attr("id"); key = key.substring("_")+1,key.length); if(label){ titles[index_tr].push({ label:label, key:key, rowspan:rowspan, colspan:colspan, }); } }); }); (titles) con(titles);

  更新

  2020-10-20更新

  直接构造form表单提交,我们不能设置请求头信息,有些需求不能满足(例如在前后端分离的项目中,需要在请求头传递token令牌),当我们导出Excel功能需要设置请求头信息时应该如何操作呢?封装原生Ajax,利用responseType: 'blob'属性,接收二进制数据,构建Blob对象,将二进制数据转成文件,利用a标签下载文件

//封装原生Ajax var Ajax={ get: function(options) { let xhr = new XMLHttpRequest(); x('GET', o, true); //设置请求头 x("Authorization", 'Bearer ' + ); x = function() { let response = null; // responseType="" / "text"时,响应的结果从x获取 i === "" || x === "text"){ response = x; } //200 请求成功 if === 200) { o(response); } //其他情况,请求失败 i){ o); } }; x(); }, post: function (options) { let xhr = new XMLHttpRequest(); x("POST", o, true); //设置请求头 x("Content-Type", "application/json"); x("Authorization", 'Bearer ' + ); //设置响应内容类型、超时时间 o ? x = o : x = "text"; o ? x = o : x = 30000; x = function() { let response = null; // responseType="" / "text"时,响应的结果从x获取 i === "" || x === "text"){ response = x; } //200 请求成功 if === 200) { o(response); } // responseType = "blob"时,响应的是Blob二进制数据,直接调用下载 if === 201){ download(xhr,o) } //其他情况,请求失败 i){ o); } }; x)); } }; //Blob响应,转成文件下载 function download(response,callback) { //创建一个隐藏的下载a标签 let url = window.URL.createObjectURL(new Blob([re])); let link = document.createElement("a"); link. = "none"; link.href = url; //设置文件名,文件名从响应头中获取(PS:可能会存在中文乱码、文件后缀多个下划线等问题) let fileName = re().split("\n")[4].split(":")[1].split(";")[2].split("=")[1].replace(/"/g,""); fileName = decodeURIComponent(escape(fileName)); con("文件名:" + fileName); link.setAttribute("download", fileName); document.body.appendChild(link); link.click(); //过河拆桥 link.remove(); if(callback){ callback(); } }

  使用

//获取当前分页参数 let postData = vue.getPageParameter(); = 1; Size = 999999999;//设置每页9亿条记录(相当于无穷大,查询所有) con("开始导出..."); Ajax.post({ url:vue.excelUrl, data:postData, timeout: 30000, responseType: 'blob', success:function () { con("导出完成,请您注意浏览器的下载管理器!"); } });

  效果

  后缀多了个下划线,很奇怪...,删除下划线文件能正常打开,数据、单元格背景等正常

版权声明

作者:huanzi-qch

出处:

若标题中有“转载”字样,则本文版权归原作者所有。若无转载字样,本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利.

1.《【poi怎么设置excel】POI导出Excel》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。

2.《【poi怎么设置excel】POI导出Excel》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。

3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/keji/2500633.html

上一篇

【EXcel怎么链接CAD】python使用Win32com将excel和CAD连接起来,执行自动绘图

【poi怎么设置excel】Java使用poi导入导出Excel

【poi怎么设置excel】Java使用poi导入导出Excel

poi怎么设置excel相关介绍,前言 1、将用户信息导出到excel表(导出数据……。)。 2、将Excel表中的信息输入网站数据库(上传练习)。……。)。 设计为excel的开发过程,例如Excel导出、Excel导入数据库! E...

【poi怎么设置excel】从Java、POI、样板导出Excel文件(xls和xlsx)、设置图纸样式

【poi怎么设置excel】从Java、POI、样板导出Excel文件(xls和xlsx)、设置图纸样式

poi怎么设置excel相关介绍,阿帕奇poi POI是[Poor Obfuscation Implementation]的首字母缩写,意思是[可怜的模糊实现]。Java进程读取和写入Microsoft Office格式文件的能力。 ...