我是用的java类反射方式生成的excel

1. pom依赖

<!-- <artifactId>poi</artifactId> //适用于低版本,也就是xls结尾的Excel表格-->
<!-- <artifactId>poi-ooxml</artifactId>//适用于高版本,也就是xlsx结尾的Excel表格-->
<!-- pom文件中只能导入上面两个jar包其中一个,否则会导致jar包版本冲突-->
<!--或者可以去官网下载jar包 --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.0</version></dependency>

2. 创建一个单元格格式工具类 CustomStyle ,这个只实现了默认格式,可以自定义相关格式

package excelTool.style;import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
/*** 自定义单元格样式* 单元格样式(cellStyle) HSSFCellStyle cellStyle = wb.createCellStyle();* 单元格内容样式(dataFormat)  HSSFDataFormat format = wb.createDataFormat();*/
public class CustomStyle {/*** 默认的单元格样式**  常用单元格数据样式*  "General", "0", "0.00", "#,##0", "#,##0.00","\"$\"#,##0_);(\"$\"#,##0)", "\"$\"#,##0_);[Red](\"$\"#,##0)", "\"$\"#,##0.00_);(\"$\"#,##0.00)",*  "\"$\"#,##0.00_);[Red](\"$\"#,##0.00)","0%", "0.00%", "0.00E+00", "# ?/?", "# ??/??", "m/d/yy", "d-mmm-yy", "d-mmm", "mmm-yy", "h:mm AM/PM",*  "h:mm:ss AM/PM", "h:mm", "h:mm:ss", "m/d/yy h:mm", "reserved-0x17","reserved-0x18", "reserved-0x19", "reserved-0x1A", "reserved-0x1B",*  "reserved-0x1C", "reserved-0x1D", "reserved-0x1E", "reserved-0x1F","reserved-0x20", "reserved-0x21", "reserved-0x22","reserved-0x23",*  "reserved-0x24", "#,##0_);(#,##0)", "#,##0_);[Red](#,##0)", "#,##0.00_);(#,##0.00)", "#,##0.00_);[Red](#,##0.00)",*  "_(* #,##0_);_(* (#,##0);_(* \"-\"_);_(@_)","_(\"$\"* #,##0_);_(\"$\"* (#,##0);_(\"$\"* \"-\"_);_(@_)",*  "_(* #,##0.00_);_(* (#,##0.00);_(* \"-\"??_);_(@_)", "_(\"$\"* #,##0.00_);_(\"$\"* (#,##0.00);_(\"$\"* \"-\"??_);_(@_)",*  "mm:ss", "[h]:mm:ss", "mm:ss.0", "##0.0E+0", "@", "TEXT"*/public static XSSFCellStyle defaultCellStyle(XSSFWorkbook workbook,String fieldType) {XSSFCellStyle cellStyle = workbook.createCellStyle();short format = 164;if ("Date".equals(fieldType)){format = workbook.createDataFormat().getFormat("m/d/yy");}else if ("BigDecimal".equals(fieldType)){format = workbook.createDataFormat().getFormat("#,##0.00");}else {format = workbook.createDataFormat().getFormat("TEXT");}cellStyle.setDataFormat(format);return cellStyle;}
}

3.导出工具类ExcelExport,里面有一个main方法可以导出相应数据 其中 dataList 参数就是你从数据库中查询出来实体类集合,tableHeaders 是你自己定义的汉字和实体类字段的映射表头,定义好这些就可以了

import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import static excelTool.pojo.StaticVar.arrayList;
import static excelTool.style.CustomStyle.defaultCellStyle;
/*** HSSF提供读写XLS格式档案的功能。* XSSF提供读写XLSX格式档案的功能。* HWPF提供读写DOC格式档案的功能。* XWPF提供读写DOCX格式档案的功能。* <!-- POI支持 -->* <artifactId>poi</artifactId> //适用于低版本,也就是xls结尾的Excel表格* <artifactId>poi-ooxml</artifactId>//适用于高版本,也就是xlsx结尾的Excel表格* //pom文件中只能导入上面两个jar包其中一个,否则会导致jar包版本冲突* //或者可以去官网下载jar包* <p>* //一个excel表格* HSSFWorkbook wb = new HSSFWorkbook();* //一个工作表格(sheet)* HSSFSheet sheet = wb.createSheet("sheet1");* //一行(row)* HSSFRow row = sheet.createRow(0);* //一个单元格(cell)* HSSFCell cell = row.createCell(0);*/public class ExcelExport {//    使用方法public static void main(String[] args) {//        导出地址String exportPath = "./poi_tool/src/main/java/excelTool/test.xlsx";
//        生成拼装的数据集合List<List<ValuePojo>> dataList = assemblyDataList(tableHeaders, arrayList);
//        简单excel导出simpleExport(dataList,exportPath,"sheet1");}/*** excel导出通用类*/static class ValuePojo {//        字段值private Object fieldValue;//        字段类型(JAVA类型)private String fieldType;//        所在行列private int row;private int col;public Object getFieldValue() {return fieldValue;}public void setFieldValue(Object fieldValue) {this.fieldValue = fieldValue;}public String getFieldType() {return fieldType;}public void setFieldType(String fieldType) {this.fieldType = fieldType;}public int getRow() {return row;}public void setRow(int row) {this.row = row;}public int getCol() {return col;}public void setCol(int col) {this.col = col;}}/*** 汉字名称和字段映射关系,需要自定义* 格式需要按照 tableHeaders.put("表头汉字名称","需要导出的实体类的字段名");* 顺序就是向map中添加的顺序,使用的LinkedHashMap,有序集合*/public static final LinkedHashMap<String, String> tableHeaders = new LinkedHashMap();static {tableHeaders.put("序号", "id");tableHeaders.put("名称", "name");tableHeaders.put("年龄", "age");tableHeaders.put("地址", "address");tableHeaders.put("信息", "infomation");tableHeaders.put("创建时间", "createTime");}/*=========================================================以下是可以调用的导出相关方法=========================================================================*//*** 实体类数据拼装成通用导出数据集合** @param tableHeaders excel表头集合* @param dataList     数据实体类集合*/public static List<List<ValuePojo>> assemblyDataList(LinkedHashMap<String, String> tableHeaders, List<Object> dataList) {//        所有数据行集合List<List<ValuePojo>> allRowList = new ArrayList<>();
//        组装需要导出的表头数据,指定为第一行row=0List<ValuePojo> firstRowList = new ArrayList<>();String[] headerKeys = tableHeaders.keySet().toArray(new String[tableHeaders.size()]);for (int col = 0; col < headerKeys.length; col++) {ValuePojo dataValuePojo = new ValuePojo();dataValuePojo.setFieldValue(headerKeys[col]);dataValuePojo.setRow(0);dataValuePojo.setCol(col);firstRowList.add(dataValuePojo);}
//        添加表头数据到集合allRowList.add(firstRowList);try {//        组装需要导出的数据for (int row = 0; row < dataList.size(); row++) {List<ValuePojo> rowList = new ArrayList<>();Object dataObj = dataList.get(row);for (int col = 0; col < headerKeys.length; col++) {//                使用反射获取字段的值.并且设置允许访问私有变量Field field = dataObj.getClass().getDeclaredField(tableHeaders.get(headerKeys[col]));field.trySetAccessible();String typeName = field.getType().getName();ValuePojo valuePojo = new ValuePojo();
//                    设置字段值valuePojo.setFieldValue(field.get(dataObj));
//                    设置字段类型valuePojo.setFieldType(typeName.substring(typeName.lastIndexOf(".") + 1));
//                    设置单元格数据行列(在合并的时候才需要)valuePojo.setRow(row + 1);valuePojo.setCol(col);rowList.add(valuePojo);}
//            添加数据到全部集合allRowList.add(rowList);}} catch (NoSuchFieldException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}return allRowList;}/*** 简单excel导出** @param allRowList* @param exportPath* @param sheetName*/public static void simpleExport(List<List<ValuePojo>> allRowList, String exportPath, String sheetName) {//           导出,生成文档try {XSSFWorkbook workbook = new XSSFWorkbook();XSSFSheet sheet = workbook.createSheet(sheetName);for (int row = 0; row < allRowList.size(); row++) {XSSFRow sheetRow = sheet.createRow(row);for (int col = 0; col < allRowList.get(row).size(); col++) {XSSFCell cell = sheetRow.createCell(col);
//                    设置单元格格式和单元格数据格式String fieldType = allRowList.get(row).get(col).getFieldType();Object fieldValue = allRowList.get(row).get(col).getFieldValue();cell.setCellStyle(defaultCellStyle(workbook,fieldType));
//                    设置单元格数值if ("Date".equals(fieldType)){cell.setCellValue((Date) fieldValue);}else if ("BigDecimal".equals(fieldType)){cell.setCellValue((Double) fieldValue);}else {cell.setCellValue(fieldValue.toString());}}}OutputStream outputStream = new FileOutputStream(exportPath);workbook.write(outputStream);workbook.close();outputStream.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
}

附: 下面是样例数据代码, 实际使用的时候不需要!!!

import java.util.Date;
/*** Excel导出示例数据* 实际使用的时候不需要这个类!!!* */
public class SampleDataE {private Long id;private String name;private Integer age;private String address;private String infomation;private Date createTime;public SampleDataE(Long id, String name, Integer age, String address, String infomation, Date createTime) {this.id = id;this.name = name;this.age = age;this.address = address;this.infomation = infomation;this.createTime = createTime;}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getInfomation() {return infomation;}public void setInfomation(String infomation) {this.infomation = infomation;}public Date getCreateTime() {return createTime;}public void setCreateTime(Date createTime) {this.createTime = createTime;}
}
import java.util.*;
public class StaticVar {/*** 这段是手动创建的样例数据,实际使用时没用* */public static final List<Object> arrayList = new ArrayList<>();static {arrayList.add(new SampleDataE(10000L,"古拉加斯",30,"弗雷尔卓德","对古拉加斯而言,喝酒,是唯一一件比战斗还要重要的事。他对酒劲更强的麦酒有着难以抑制的渴求。在这种渴求的驱使下,他不断寻找着酒劲最强、最不寻常的原料来进行蒸馏。这个行事冲动、难以预测的吵闹酒徒,最喜欢的活动就是砸酒桶和砸脑袋。",new Date()));arrayList.add(new SampleDataE(20000L,"卡萨丁",400,"虚空裂隙","卡萨丁最初只是一名被遗弃的婴儿,在沙漠上受雇于商队,并且保护着他们的货物,自己充当幼儿,将掠食者引开,他很多次都侥幸的活下来,并且在市场上成为招牌,他不再是诱饵,而是商队的向导了,直到有一天他爱上了一名来自沙漠的女人,并且带着妻子和女儿,前往南方的一个小村子,他经常在外奔波,并且总是能带着故事回来,终于有一天,噩耗传来,他的家园受到了大灾,就像是从地底张开了一个大口子,吃掉了村子里的所有人。",new Date()));arrayList.add(new SampleDataE(30000L,"崔斯特",20,"蟒河流域","崔斯特·菲特是一名声名狼藉的纸牌高手和诈骗惯犯,世界上任何有人烟的地方都有他施展魅力和赌艺的足迹,让那些富人和痴人既羡慕又嫉恨。他很少会认真起来干一件事,总是用一抹轻蔑的微笑和一副漫不经心的随性面对每一天。无论做任何事情,崔斯特永远都会在袖子里藏一张王牌。",new Date()));}
}

导出结果如下

代码还在优化,后续更新表格样式,导入等功能!!

java 通用工具 POI XSSF导出.xls或者.xlsx相关推荐

  1. java 使用poi HSSFWorkbook导出xls文件 office打不开,提示文件损坏,wps能打开。

    先上我的xls结构图.每个sheet中的数据是结构是相同,是循环生成. 测试过程: 1.每个sheet单独生成xls文件,在office中是可以打开,两个合在同一个xls中就office无法打开,猜测 ...

  2. java使用poi.xssf 写入内容到excel表格中 和 读取 表格里面的数据

    一.java使用poi.xssf 写入内容到excel表格中 public class TestExcel {//创建一个excel工作簿public static String outputFile ...

  3. java poi对excel xls和xlsx格式文件导入导出

    一)poi简介 Apache POI项目是用于基于Microsoft的OLE 2复合文档格式开发文件格式的纯Java端口的主项目. 官网POI API地址:https://poi.apache.org ...

  4. HSSF,XSSF方式导出.xls和.xlsx的Excel文件

    使用Java操作excel的几种方法 需要导入一下jar包,少一个都不行. 版本要统一,比如都用4.1.2,否则报错 poi-4.1.2.jar poi-ooxml-4.1.2.jar poi-oox ...

  5. JAVA使用POI如何导出百万级别数据

    用过POI的人都知道,在POI以前的版本中并不支持大数据量的处理,如果数据量过多还会常报OOM错误,这时候调整JVM的配置参数也不是一个好对策(注:jdk在32位系统中支持的内存不能超过2个G,而在6 ...

  6. Java使用POI实现导出Word文档

    POI官网链接:http://deepoove.com/poi-tl/(方便各位博友后期深入学习) 1.首先导入POM依赖包 <dependency><groupId>com. ...

  7. Java使用Poi实现导出Word段落以及表格,XWPFParagraph和XWPFRun详解,生成目录,生成折线图、柱状图、饼状图

    导出段落 public void exportSummarizeWord(HttpServletResponse response, Integer id) {Summarize summarize ...

  8. java使用poi实现导出表格模板

    产品经理新需求!要求导出类似检查记录的模板表格下面是已经做好的表格 下面讲一讲如何实现 1,依赖导入 <!-- excel工具 --><dependency><group ...

  9. qq群 消息导出 html,【更新】QQ群成员提取工具(可导出xls、xlsx、txt文件)(csv文件)...

    本帖最后由 何人与我立黄昏 于 2019-12-5 08:47 编辑 说明一下:因为是二次开发,贴上原帖地址,感谢作者提供开源的核心算法 https://www.52pojie.cn/thread-8 ...

最新文章

  1. php会话的销毁和退出,销毁PHP会话
  2. 《2018中国大数据发展指数报告》发布:广东、上海、贵州、北京、重庆领先
  3. maven构建SSM工程[应用]1
  4. Cakephp事件机制尝鲜
  5. netstat命令总结
  6. 我是如何自学 Python 的,分享一下经验
  7. wamp+多版本mysql_WampServer下安装多个版本的PHP、mysql、apache图文教程,_PHP教程
  8. 重磅!李沐在斯坦福开新课了!
  9. ECShop 安装问题 谁能帮帮我
  10. 数据平面开发套件(DPDK)中的Vhost / Virtio的配置和性能
  11. JS中的柯里化(currying) 转载自张鑫旭-鑫空间-鑫生活[http://www.zhangxinxu.com]
  12. python必背入门代码-学 Python 必背的42个常见单词,看看你记住了几个?
  13. java DataInput接口
  14. 【bzoj4940】这是我自己的发明
  15. MyEclipse中用Maven创建Web项目(亲测有效)
  16. centos 7安装java 8
  17. 火狐扩展下载失败_Firefox中扩展程序和主题安装失败的解决方法
  18. 熊猫猪新系统测试之四:Ubuntu 14.04
  19. 选择一个网络托管业务域名代备案提供全面的解决方案
  20. 华为机试HJ102:字符统计

热门文章

  1. Linux守护进程设计规范及python实现
  2. 文献解读:纵向数据的测量不变性和交叉滞后模型(一)
  3. spring boot 整合 ip2region(ip地址库)
  4. [PyTorch]手动实现logistic回归(只借助Tensor和Numpy相关的库)
  5. android 创建多个闹钟,Android设置多个闹钟
  6. C# 无损压缩图片
  7. 驭势“AI司机”融入城市生活,服贸会抢“鲜”体验
  8. RabbitMQ入门中篇
  9. 唯品会web前端实习生一面二面经
  10. phpMyadmin /scripts/setup.php Execute Arbitrary PHP Code Via A Crafted POST Request CVE-2010-3055