1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > Poi excel 导出 工具类参考

Poi excel 导出 工具类参考

时间:2020-07-30 16:35:03

相关推荐

Poi excel 导出 工具类参考

public void poiCreateExcel(HttpServletResponse response, Map<String, Object> map) {// 下载文件信息String fileName = (String) map.get("fileName");if (StringUtils.isBlank(fileName)) {throw new RuntimeException("导出参数fileName常");}//表数据信息List dataRows = (List) map.get("rows");if (dataRows == null || dataRows.size() == 0) {throw new RuntimeException("导出参数rows异常");}// 所需显示的字段List<String> titles = (List<String>) map.get("titles");//数据排序String order = (String) map.get("order");if (order == null || order.isEmpty()) {throw new RuntimeException("导出参数order异常");}if (titles == null || titles.isEmpty()) {throw new RuntimeException("导出参数titles异常");}//获取数据排序String[] orderDataString = order.toString().split(",");//创建Excel工作薄XSSFWorkbook workbook = new XSSFWorkbook();XSSFCellStyle cellStyle = workbook.createCellStyle();cellStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);//创建一个工作表sheetSheet sheet = workbook.createSheet();// 标记行int flagRow = -1;for (int i = 0; i < titles.size(); i++) {String[] tNames = titles.get(i).split(",");//创建行Row row = sheet.createRow(i);Cell cell = null;// 插入行for (int j = 0; j < tNames.length; j++) {//创建单元格cell = row.createCell(j);//插入数据cell.setCellValue(tNames[j]);// 插入样式cell.setCellStyle(cellStyle);}}//合并列for (int i = 0; i < titles.size(); i++) {String[] tNames = titles.get(i).split(",");List<String> tList = Arrays.asList(tNames);//合并列for (int frequency, f = 0; f < tNames.length; f++) {frequency = Collections.frequency(tList, tNames[f]);//判断重复字段是否连续if (frequency > 1) {// 标记结束合并行int endRos = i;// 防止数组越界(数组末位为重复且无需合并字段) 判断字段是否连续 非连续不合列if (f == (tNames.length - 1) || !tNames[f].equals(tNames[f + 1])) {continue;}// 保留开始列坐标int cos = f;//下标校验while ((f != tNames.length - 1) && tNames[f].equals(tNames[f + 1])) {// 查重处理下标if (tNames[f].equals(tNames[f + 1])) {++f;}}// 判断是否存在前一行if (i - 1 >= 0) {String[] preNames = titles.get(i - 1).split(",");// 与前一行字段匹配 不予处理if (tNames[f].equals(preNames[f])) {continue;}}for (int j = i; j < titles.size(); j++) {if (j + 1 < titles.size()) {String[] nextNames = titles.get(j + 1).split(",");//判断是否下一行是否存在数据if (tNames[f].equals(nextNames[f])) {endRos = j;}// 重复行终止if (!tNames[f].equals(nextNames[f])) {sheet.addMergedRegion(new CellRangeAddress(i, j, cos, f));flagRow = endRos;break;}if (endRos == titles.size() - 1 && endRos > flagRow) {sheet.addMergedRegion(new CellRangeAddress(i, endRos, cos, f));}// 不存在下一行且连续重复} else {sheet.addMergedRegion(new CellRangeAddress(i, j, cos, f));}}}}}// 合并行for (int frequency, i = 0; i < titles.size(); i++) {// 标记合并行int eRow = i;String[] tNames = titles.get(i).split(",");for (int j = 0; j < tNames.length; j++) {// 向上寻找if (i > 0) {String[] preNames = titles.get(i - 1).split(",");// 前一列有相同不予处理if (tNames[j].equals(preNames[j])) {continue;}}//判断字段是否连续重复if (j < (tNames.length - 1) && tNames[j].equals(tNames[j + 1])) {continue;}// 向下寻找for (int k = i + 1; k < titles.size(); k++) {String[] nextNames = titles.get(k).split(",");if (!tNames[j].equals(nextNames[j])) {break;}eRow = k;}// 如果 eRow 与i不一致if (eRow > i) {sheet.addMergedRegion(new CellRangeAddress(i, eRow, j, j));eRow = i;}}}// 追加数据for (int i = 0; i < dataRows.size(); i++) {// 数据行为表头行的顺延一行Row dataRow = sheet.createRow(i + titles.size());// 格式化表中数据Map<String, String> data = (Map) dataRows.get(i);for (int j = 0; j < orderDataString.length; j++) {Cell dataCell = dataRow.createCell(j);dataCell.setCellValue(data.get(orderDataString[j]));}}try {String encodedFileName = new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1);String formattedAttachHeader = String.format("attachment;filename=%s", encodedFileName);response.setContentType(MediaType.MULTIPART_FORM_DATA_VALUE);response.addHeader(HttpHeaders.CONTENT_DISPOSITION, formattedAttachHeader);response.setCharacterEncoding(StandardCharsets.UTF_8.toString());ServletOutputStream outputStream = response.getOutputStream();workbook.write(outputStream);outputStream.flush();} catch (Exception e) {e.printStackTrace();}}

如何使用以及效果图

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。