一,概述

好几个项目都需要与Excel打交道,每次都要特地去解析、导出,费时费力!所以参考了两位作者的文章,整理了一下POI导入导出的通用工具类。虽说是通用工具类,也只能对那些比较规则的Excel表进行操作,对于那些不规则的Excel表,还是要撸起袖子加油干!(下面这张图是POI的单元格数据类型)

二,实现

1,主要依赖

POI的一些依赖以及阿里的fastjson

 <!-- POI Excel表 --><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.poi</groupId><artifactId>poi-excelant</artifactId><version>3.17</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.51</version></dependency>

2,解析Excel表工具类

1)解析Excel表工具类,我参考了一位作者的博文(非常感谢!!!),并做了一些优化——POI读取excel文件通用代码(增强版--支持返回javaBean集合)---2003,2007

2)完整代码

package com.statement.utils.excel;import com.alibaba.fastjson.JSONObject;
import com.statement.pojo.YlswBranch;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.NumberToTextConverter;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;/*** Execel(2003->xls,2007以上->xlsx)解析工具类*/
public class ParseExcelUtil {//2003版本 最大支持65536 行private static final String EXCEL_XLS = "xls";//2007 版本以上 最大支持1048576行private static final String EXCEL_XLSX = "xlsx";private static List<String> columns;//要解析excel中的列名private static int sheetNum = 0;//要解析的sheet下标public static List<String> getColumns() {return ParseExcelUtil.columns;}public static void setColumns(List<String> columns) {ParseExcelUtil.columns = columns;}public static int getSheetNum() {return sheetNum;}public static void setSheetNum(int sheetNum) {ParseExcelUtil.sheetNum = sheetNum;}/*** 判断Excel的版本,获得对应的Workbook** @param file* @return* @throws Exception*/public static Workbook getWorkbook(File file) {Workbook wb = null;try {checkExcelValid(file);InputStream in = new FileInputStream(file);if (file.getName().endsWith(EXCEL_XLS)) {//Excel2003及以下wb = new HSSFWorkbook(in);} else if (file.getName().endsWith(EXCEL_XLSX)) {//Excel2007及以上wb = new XSSFWorkbook(in);}} catch (Exception e) {e.printStackTrace();wb = null;}return wb;}/*** 直接传入输入流和文件名(xxx.xls或xxx.xlsx)获取对应的Workbook** @param ins* @param fileName* @return*/public static Workbook getWorkbook(InputStream ins, String fileName) {Workbook wb = null;try {if (!fileName.endsWith(EXCEL_XLS) && !fileName.endsWith(EXCEL_XLSX)) {throw new Exception("不是标准的Excel文件");}if (fileName.endsWith(EXCEL_XLS)) {//Excel2003及以下wb = new HSSFWorkbook(ins);} else if (fileName.endsWith(EXCEL_XLSX)) {//Excel2007及以上wb = new XSSFWorkbook(ins);}} catch (Exception e) {e.printStackTrace();wb = null;}return wb;}/*** 判断Excel文件是否有效,无效时抛出异常** @param file* @throws Exception*/public static void checkExcelValid(File file) throws Exception {//System.out.println("filename:" + file.getName());if (!file.exists()) {//文件不存在throw new Exception("文件不存在");} else if (!(file.isFile() && (file.getName().endsWith(EXCEL_XLS) || file.getName().endsWith(EXCEL_XLSX)))) {throw new Exception("不是标准的Excel文件");}}/*** 获取Excel文件中,从startIndex到(总行数-endIndex)之间的数据,返回json数组** @param file* @param startIndex* @return*/public static String readExcel(File file, int startIndex, int endIndex) {StringBuilder retJson = new StringBuilder();Workbook workbook = getWorkbook(file);Sheet sheet = workbook.getSheetAt(sheetNum);int lastRowNum = sheet.getLastRowNum();//最后一行System.out.println("lastRowNum:" + lastRowNum);retJson.append("[");//for (int i = 0; i < lastRowNum; i++) {for (int i = startIndex; i < lastRowNum - endIndex; i++) {Row row = sheet.getRow(i);//获得行String rowJson = readExcelRow(row);retJson.append(rowJson);if (i < lastRowNum - 1)retJson.append(",");}retJson.append("]");try {//关闭资源workbook.close();} catch (IOException e) {e.printStackTrace();} finally {return retJson.toString();}}/*** 网页上传文件时,通过流的方式更为便捷,从startIndex到(总行数-endIndex)之间的数据,返回json数组** @param ins* @param fileName* @param startIndex* @param endIndex* @return*/public static String readExcel(InputStream ins, String fileName, int startIndex, int endIndex) {StringBuilder retJson = new StringBuilder();Workbook workbook = getWorkbook(ins, fileName);Sheet sheet = workbook.getSheetAt(sheetNum);int lastRowNum = sheet.getLastRowNum();//最后一行System.out.println("lastRowNum:" + lastRowNum);retJson.append("[");//for (int i = 0; i < lastRowNum; i++) {for (int i = startIndex; i < lastRowNum - endIndex; i++) {Row row = sheet.getRow(i);//获得行String rowJson = readExcelRow(row);retJson.append(rowJson);if (i < lastRowNum - 1)retJson.append(",");}retJson.append("]");try {//关闭资源workbook.close();} catch (IOException e) {e.printStackTrace();} finally {return retJson.toString();}}/*** 将json转换为集合,使用阿里的fastjson框架非常便捷** @param json* @param clazz* @param <E>* @return*/public static <E> Collection<E> readExcel(String json, Class<E> clazz) {return JSONObject.parseArray(json, clazz);}/*** 读取每行Row的数据,每行数据对应一个javabean** @param row* @return 返回一个json对象*/private static String readExcelRow(Row row) {StringBuilder rowJson = new StringBuilder();int lastCellNum = ParseExcelUtil.columns.size();//最后一个单元格rowJson.append("{");for (int i = 0; i < lastCellNum; i++) {Cell cell = row.getCell(i);String cellVal = readCellValue(cell);rowJson.append(toJsonItem(columns.get(i), cellVal));if (i < lastCellNum - 1)rowJson.append(",");}rowJson.append("}");return rowJson.toString();}/*** 读取每个单元格Cell的value,对NUMERIC类型的Cell需要做特别处理** @param cell* @return 返回Cell的value*/@SuppressWarnings("static-access")private static String readCellValue(Cell cell) {if (cell == null) {return null;}CellType type = cell.getCellTypeEnum();String cellValue;switch (type) {case BLANK:cellValue = "";break;case _NONE:cellValue = "";break;case ERROR:cellValue = "";break;case BOOLEAN:cellValue = String.valueOf(cell.getBooleanCellValue());break;case NUMERIC://cellValue = String.valueOf(cell.getNumericCellValue());//当Cell为日期类型(如2018-11-19)时,需要做特殊处理,否则解析出来的将会是一个距离1900年1月1日的天数(此时为43423)if (HSSFDateUtil.isCellDateFormatted(cell)) {//日期类型Date date = cell.getDateCellValue();DateFormat formater = new SimpleDateFormat("yyyy-MM-dd");cellValue = formater.format(date);} else {//货币类型 等等//如果Cell是科学计数法类型的数据或者货币类型时,获取不到想要的字符串,此时通过NumberToTextConverter工具类// 的toText(...)方法可以解决该问题,获取字符串cellValue = NumberToTextConverter.toText(cell.getNumericCellValue());}break;case STRING:cellValue = cell.getStringCellValue();break;case FORMULA:cellValue = cell.getCellFormula();break;default:cellValue = "";break;}return cellValue;}/*** 转换为json对** @return*/private static String toJsonItem(String name, String val) {return "\"" + name + "\":\"" + val + "\"";}public static void main(String[] args) {File file = new File("C:\\Users\\Administrator\\IdeaProjects\\statement\\src\\main\\resources\\10050003400000_20181120_1_test.xlsx");List<String> list = new ArrayList<>();list.add("mrchNo");list.add("transDate");list.add("transTime");list.add("terminalNo");list.add("transType");list.add("cardNo");list.add("transAmount");list.add("clearAmount");list.add("poundage");list.add("flowNo");list.add("sysTracking");list.add("cardType");list.add("transReferNo");list.add("bank");//  list.add("orderNo");ParseExcelUtil.setColumns(list);String json = ParseExcelUtil.readExcel(file, 3, 1);Collection<YlswBranch> ylswBranches = ParseExcelUtil.readExcel(json, YlswBranch.class);System.out.println("*************************");System.out.println("ylswBranches1.size():" + ylswBranches.size());for (YlswBranch yl : ylswBranches) {System.out.println(yl);}}}

主要做法就是通过readExcelRow(Row row)将Excel表中每行的数据做成json对象,在readExcel(File file, int startIndex, int endIndex)或readExcel(InputStream ins,String  fileName, int startIndex, int endIndex)方法中将全部的json对象组成一个json数组。有了一个json数组,通过阿里的fastjson框架,可轻松转换成一个集合,对应为readExcel(String json, Class<E> clazz)方法。

3)测试(测试代码在工具类的main方法中)

a)解析10050003400000_20181120_1_test.xlsx

b)对应实体属性如下

    private String mrchNo;private String transDate;private String transTime;private String terminalNo;private String transType;private String cardNo;private String transAmount;private String clearAmount;private String poundage;private String flowNo;private String sysTracking;private String cardType;private String transReferNo;private String bank;private String orderNo;

c)获取文件,ParseExcelUtil.setColumns(list)设置Excel文件中每一列对应的名称,执行解析方法ParseExcelUtil.readExcel(file, 3, 1)获得json数组,最后通过ParseExcelUtil.readExcel(json, YlswBranch.class)得到对应的集合。

        ParseExcelUtil.setColumns(list);//从第4行开始解析,直到最后一行前一行String json = ParseExcelUtil.readExcel(file, 3, 1);Collection<YlswBranch> ylswBranches = ParseExcelUtil.readExcel(json, YlswBranch.class);System.out.println("*************************");System.out.println("ylswBranches1.size():" + ylswBranches.size());for (YlswBranch yl : ylswBranches) {System.out.println(yl);}

集合打印如下:

3 ,导出Excel工具类

1)导出工具类参考了一位作者的博文,精简了一些代码,原文为Java之——导出Excel通用工具类

2)工具类有两个:ExportExcelUtil、ExportExcelWrapper,后者继承前者,后置主要提供网页点击按钮生成Excel文件的快捷操作。

3)ExportExcelUtil代码:

package com.statement.utils.excel;import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;public class ExportExcelUtil<T> {// 2007 版本以上 最大支持1048576行public final static String EXCEl_FILE_2007 = "2007";// 2003 版本 最大支持65536 行public final static String EXCEL_FILE_2003 = "2003";/*** 通过版本类判断是** @param sheetName 表格标题名* @param headers   表格头部标题集合* @param dataset   数据集合* @param out       输出流* @param version   指定生成Excel文件的版本*/public void exportExcel(String sheetName, String[] headers, Collection<T> dataset, OutputStream out, String version) {Workbook workbook = null;if (StringUtils.isBlank(version) || EXCEL_FILE_2003.equals(version.trim())) {workbook = new HSSFWorkbook();} else {workbook = new XSSFWorkbook();}exportExcel(workbook, sheetName, headers, dataset, out, "yyyy-MM-dd HH:mm:ss");}/*** 通用Excel导出方法,利用反射机制遍历对象的所有字段,将数据写入Excel文件中 <br>* 此版本生成2007以上版本的文件 (文件后缀:xlsx)** @param sheetName 表格标题名* @param headers   表格头部标题集合* @param dataset   需要显示的数据集合,集合中一定要放置符合JavaBean风格的类的对象。此方法支持的*                  JavaBean属性的数据类型有基本数据类型及String,Date* @param out       与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中* @param pattern   如果有时间数据,设定输出格式。默认为"yyyy-MM-dd hh:mm:ss"*/public void exportExcel(Workbook workbook, String sheetName, String[] headers, Collection<T> dataset, OutputStream out, String pattern) {// 生成一个表格Sheet sheet = workbook.createSheet(sheetName);// 设置表格默认列宽度为15个字节//设置宽度//sheet.setDefaultColumnWidth(20);sheet.setDefaultColumnWidth(18);//sheet.trackAllColumnsForAutoSizing();
//        sheet.autoSizeColumn(0);// 生成一个样式CellStyle style = workbook.createCellStyle();style.setAlignment(HorizontalAlignment.CENTER);//内容居中// 生成一个字体Font font = workbook.createFont();font.setFontName("宋体");font.setBold(true);//加粗font.setFontHeightInPoints((short) 11);// 把字体应用到当前的样式style.setFont(font);// 生成并设置另一个样式CellStyle style2 = workbook.createCellStyle();style2.setAlignment(HorizontalAlignment.CENTER);// 生成另一个字体Font font2 = workbook.createFont();// font2.setBold(true);//加粗// 把字体应用到当前的样式style2.setFont(font2);// 产生表格标题行Row row = sheet.createRow(0);Cell cellHeader;for (int i = 0; i < headers.length; i++) {cellHeader = row.createCell(i);cellHeader.setCellStyle(style);cellHeader.setCellValue(headers[i]);}// 遍历集合数据,产生数据行Iterator<T> it = dataset.iterator();int index = 0;T t;Field[] fields;Field field;//HSSFRichTextString richString;Pattern p = Pattern.compile("^//d+(//.//d+)?$");Matcher matcher;String fieldName;String getMethodName;Cell cell;Class tCls;Method getMethod;Object value;String textValue;SimpleDateFormat sdf = new SimpleDateFormat(pattern);while (it.hasNext()) {index++;row = sheet.createRow(index);t = (T) it.next();// 利用反射,根据JavaBean属性的先后顺序,动态调用getXxx()方法得到属性值fields = t.getClass().getDeclaredFields();for (int i = 0; i < fields.length; i++) {cell = row.createCell(i);cell.setCellStyle(style2);field = fields[i];fieldName = field.getName();getMethodName = "get" + fieldName.substring(0, 1).toUpperCase()+ fieldName.substring(1);try {tCls = t.getClass();getMethod = tCls.getMethod(getMethodName, new Class[]{});value = getMethod.invoke(t, new Object[]{});// 判断值的类型后进行强制类型转换textValue = null;if (value instanceof Integer) {cell.setCellValue((Integer) value);} else if (value instanceof Float) {textValue = String.valueOf((Float) value);cell.setCellValue(textValue);} else if (value instanceof Double) {textValue = String.valueOf((Double) value);cell.setCellValue(textValue);} else if (value instanceof Long) {cell.setCellValue((Long) value);}if (value instanceof Boolean) {textValue = "是";if (!(Boolean) value) {textValue = "否";}} else if (value instanceof Date) {textValue = sdf.format((Date) value);} else {// 其它数据类型都当作字符串简单处理if (value != null) {textValue = value.toString();}}if (textValue != null) {matcher = p.matcher(textValue);if (matcher.matches()) {// 是数字当作double处理cell.setCellValue(Double.parseDouble(textValue));} else {// richString = new HSSFRichTextString(textValue);cell.setCellValue(textValue);}}} catch (SecurityException e) {e.printStackTrace();} catch (NoSuchMethodException e) {e.printStackTrace();} catch (IllegalArgumentException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}}}try {workbook.write(out);} catch (IOException e) {e.printStackTrace();} finally {try {//关闭资源workbook.close();} catch (IOException e) {e.printStackTrace();}}}}

4)ExportExcelWrapper代码:

package com.statement.utils.excel;import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.Collection;import javax.servlet.http.HttpServletResponse;import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;/*** 供网页端点击按钮,自动生成并下载Excel表** @param <T>*/
public class ExportExcelWrapper<T> extends ExportExcelUtil {/*** 导出带有头部标题行的Excel* 时间格式默认:yyyy-MM-dd hh:mm:ss** @param fileName 生成的Excel文件名字(不要加后缀)* @param title    表格标题* @param headers  头部标题集合* @param dataset  数据集合* @param response* @param version  2003 或者 2007,不传时默认生成2003版本*/public void exportExcel(String fileName, String title, String[] headers, Collection<T> dataset, HttpServletResponse response, String version) {try {response.setContentType("application/vnd.ms-excel");String suffix = null;if (StringUtils.isBlank(version) || EXCEL_FILE_2003.equals(version.trim())) {suffix = ".xls";} else {suffix = ".xlsx";}response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + suffix);Workbook workbook = null;if (StringUtils.isBlank(version) || EXCEL_FILE_2003.equals(version.trim())) {workbook = new HSSFWorkbook();} else {workbook = new XSSFWorkbook();}exportExcel(workbook, title, headers, dataset, response.getOutputStream(), "yyyy-MM-dd HH:mm:ss");} catch (Exception e) {e.printStackTrace();}}}

思路:

a)在ExportExcelUtil工具类中,通过方法中传入的version来生成对应的Workbook,然后再调用生成Excel文件的核心方法生成目标文件,核心逻辑来自参考文章(再次感谢那位大佬!)。
exportExcel(Workbook workbook, String sheetName, String[] headers, Collection<T> dataset, OutputStream out, String pattern)
b)ExportExcelWrapper<T>继承ExportExcelUtil,重载了exportExcel方法,加入了一个response,主要实现逻辑也是调用父类的方法。
exportExcel(String fileName, String title, String[] headers, Collection<T> dataset, HttpServletResponse response, String version)

5)测试

a)解析和生成一起测试

 public static void main(String[] args) {File file = new File("C:\\Users\\Administrator\\IdeaProjects\\statement\\src\\main\\resources\\10050003400000_20181120_1_test.xlsx");List<String> list = new ArrayList<>();list.add("mrchNo");list.add("transDate");list.add("transTime");list.add("terminalNo");list.add("transType");list.add("cardNo");list.add("transAmount");list.add("clearAmount");list.add("poundage");list.add("flowNo");list.add("sysTracking");list.add("cardType");list.add("transReferNo");list.add("bank");//  list.add("orderNo");ParseExcelUtil.setColumns(list);String json = ParseExcelUtil.readExcel(file, 3, 1);Collection<YlswBranch> ylswBranches = ParseExcelUtil.readExcel(json, YlswBranch.class);System.out.println("*****************11111111111111111111111**************************");System.out.println("ylswBranches1.size():" + ylswBranches.size());for (YlswBranch yl : ylswBranches) {System.out.println(yl);}System.out.println("*****************11111111111111111111111**************************");ExportExcelUtil<YlswBranch> util = new ExportExcelUtil<YlswBranch>();// 准备数据String[] columnNames = {"mrchNo", "transDate", "transTime", "terminalNo","transType", "cardNo", "transAmount", "clearAmount","poundage", "flowNo", "sysTracking", "cardType","transReferNo", "bank", "orderNo"};try {// util.exportExcel("用户导出", columnNames, ylswBranches, new FileOutputStream("E:/testExcel.xlsx"), ExportExcelUtil.EXCEl_FILE_2007);util.exportExcel("用户导出", columnNames, ylswBranches, new FileOutputStream("E:/testExcel33.xls"), ExportExcelUtil.EXCEL_FILE_2003);} catch (FileNotFoundException e) {e.printStackTrace();}System.out.println("程序执行成功!!!!!!!!!!");}

b)测试ExportExcelWrapper

@Controller
@RequestMapping("/test")
public class TestController {@RequestMapping("/excel")public void getExcel(HttpServletRequest request, HttpServletResponse response) throws Exception {ExportExcelWrapper<AccountBill> util = new ExportExcelWrapper<AccountBill>();// 准备数据List<AccountBill> list = new ArrayList<>();for (int i = 0; i < 10; i++) {//没有给实体的所有属性赋值AccountBill accountBill = new AccountBill();accountBill.setClearDate("20180923");accountBill.setTransAmount("23424234234");accountBill.setTransDate("2018083209");accountBill.setTransType("支付宝");accountBill.setTransAmount("10000000");accountBill.setOriginalPayReferNo("dfsdfsdffasdfas");accountBill.setCardNo("234234*************324234");list.add(accountBill);}String[] columnNames = {"清算日期", "交易日期", "交易时间", "商户号","终端号", "交易类型", "卡号", "总交易金额","总清算金额", "总手续费", "参考号", "流水号","卡类型", "发卡行", "订单号", "原缴费参考号","备注"};String fileName = "testAccountBill";//网页导出Excel表util.exportExcel(fileName, "用户导出", columnNames, list, response, ExportExcelUtil.EXCEl_FILE_2007);//  util.exportExcel("用户导出", columnNames, list, new FileOutputStream("E:/testAccountBill111.xlsx"), ExportExcelUtil.EXCEl_FILE_2007);System.out.println("程序执行了!!!!!!!!!!!");}
}

在浏览器上输入:http://127.0.0.1:6225/test/get/excel ,浏览器就可直接下载文件了。部分效果图如下:

三,总结

1,在开发中,经常遇到解析Excel表获取数据和导出数据到Excel表中的需求,还是要准备工具类,提高开发效率!

2,本文中的工具类也只能对那些比较规则的导入导出起作用,对于那些比较复杂的Excel表,无论是解析还是导出,均需要作出特别处理,还是偷不了懒!

3,参考了两位作者的文章,再次感谢!

POI:Excel表解析与导出通用工具类相关推荐

  1. 还不会用Vue写出的excel表实现pdf导出吗?来,豪豪手把手教你

    关于这excel的pdf导出一问题,正常情况下都会伴随一个点击事件的按钮,为什么?因为你不去点他,让他自己导出吗,用户体验感能好?本内存就小,这倒好,打开一次自动下载并生成一个pdf,就连刷新也是,想 ...

  2. 基于 Vue 实现 Excel 的解析与导出

    前言 最近在整理日常开发中长涉及到的业务需求,正好想到了 excel 的解析与上传方面的事情,在开发中还是比较常见的,趁着周末做一下整理学习吧 基本介绍 主要基于 Vue+element 实现文件的解 ...

  3. Android 的Excel表的数据导出

    前言 用Android 把一些数据用Excel表导出 一.引入jxl库? 1.直接引用 implementation group: 'net.sourceforge.jexcelapi', name: ...

  4. java实现导出excel表_java实现导出网页中的表格为Excel

    将网页中的table数据,导出到excel表格,可以使用java POI实现. java poi是java中操作excel的工具,支持excel的导入与导出,一般有三种形式: 1.HSSFWorkbo ...

  5. Php生成货运交接单excel表,php 订单导出到excel表格及乱码问题

    public function outExcelRecharge() { $list = M('Order') ->table('__ORDER__ as o') ->join('__US ...

  6. Excel导出+解析通用工具类

    参照原文:http://blog.csdn.net/houxuehan/article/details/50960259 maven配置: <dependencies> <depen ...

  7. 通用Excel文件导出工具类

    1:Excel格式 2:ExcelUtil.java import java.io.ByteArrayOutputStream; import java.io.IOException; import ...

  8. 关于数据导出成excel表

    关于数据导出成excel表 咱们这里分享简单导出成excel表和筛选导出excel表,希望对各位有帮助,欢迎大家交流和点赞!!!! 我在这里使用的是一个导出工具类,如下: package cn.ms. ...

  9. 解决导出多个Excel表ZipOutputStream内存溢出问题——java heap space

    文章目录 easypoi--Excel表系列 问题 思路 修改工具类 easypoi--Excel表系列 easypoi的基本用法 easypoi自定义样式 多个Excel表生成目录导出压缩包 本篇文 ...

  10. JAVA导出Excel通用工具类——第一篇:详细介绍POI 导出excel的多种复杂情况,包括动态设置筛选、动态合并横向(纵向)单元格等多种复杂情况——保姆级别,真的不能再详细了,代码拿来即用)

    JAVA导出Excel通用工具--第一篇:详细介绍POI 导出excel的多种复杂情况,包括动态设置筛选.动态合并横向(纵向)单元格等多种复杂情况--保姆级别,真的不能再详细了,封装通用工具类,代码拿 ...

最新文章

  1. 面试官:为什么在系统中不推荐双写?
  2. ubuntu vscode_如何在Ubuntu-18.04下用VSCode编译LibTorch
  3. 什么时候需要用到RCC_APB2Periph_AFIO--复用IO时钟的使用
  4. 【C/C++多线程编程之六】pthread互斥量
  5. Android软键盘的显示与隐藏
  6. Android之adb jdwp获取debug版本app的进程Id
  7. 【数据湖加速篇】 —— 如何利用缓存加速服务来提升数据湖上机器学习训练速度
  8. [leetcode周赛]1346. 检查整数及其两倍数是否存在
  9. BZOJ4066 简单题(KD-Tree)
  10. sql2012下载,安装,
  11. FORCESPRO的使用教程
  12. java 崩溃监控,求大神分析drwtsn32 监控javaee程序崩溃日记
  13. python读取csv表格的数据并用matplotlib画曲线图
  14. Vue-cli 2.0使用淘宝镜像搭建总结
  15. 编程小TIPS:使用函数式风格Either来编程
  16. 怎么合并多个PDF文件?仅需三个步骤,轻松合成一个文档
  17. 人间清醒,内容为王 - 技术er究竟该如何写博客?1024上海嘉年华之敖丙演讲观后感。
  18. 一个机械专业小混混(gooogleman)学习嵌入式ARM的真实经历
  19. 十一小长假就快到了,忙忙碌碌大半年,消费黄金时期来啦
  20. ObjecARX实现对圆图极坐标展开获得方图

热门文章

  1. js实现上传文件实时显示缩略图
  2. css3实现浮动元素垂直水平居中
  3. Android软件测试的日志文件问题
  4. 安装Sublime Text 3插件的方法
  5. 自己写的一个 游标 实例
  6. xmlhttp资料(收集)
  7. 5. PHP APC APCu 安装使用
  8. 147. class_exists()
  9. 114. PHP command line getopt
  10. 19. jQuery 遍历