java使用poi实现excel表格生成
通过使用poi技术生成Excel,使用反射技术实现自动映射列表的数据。
ExportTableUtil.java
- public class ExportTableUtil {
- /**
- *
- * @Description: 获取csv格式的字符串
- * @param @param 表格头
- * @param @param fieldNameList 对应的属性名 按照先后与表头对应而且值与数据类型的属性名对应
- * @param @param params 数据
- * @param @return
- * @param @throws IllegalArgumentException
- * @param @throws IllegalAccessException
- * @param @throws NoSuchFieldException
- * @param @throws SecurityException 设定文件
- * @return String 返回类型
- */
- public static String csv(String[] headList, String[] fieldNameList, List<?> params) throws IllegalArgumentException, IllegalAccessException,
- NoSuchFieldException, SecurityException {
- StringBuilder stringBuilder = new StringBuilder();
- // add head on first
- for (int i = 0; null != headList && i < headList.length; i++) {
- stringBuilder.append(headList[i]);
- if (i < headList.length - 1) {
- stringBuilder.append(",");
- } else {
- stringBuilder.append("\r\n");
- }
- }
- // add data from second line to ---
- for (int i = 0; null != params && i < params.size(); i++) {
- Class<? extends Object> clazz = params.get(i).getClass();
- for (int j = 0; null != fieldNameList && j < fieldNameList.length; j++) {
- String fieldName = fieldNameList[j];
- if (!fieldName.contains(".")) {
- Field field = clazz.getDeclaredField(fieldName);
- if (null != field) {
- field.setAccessible(true);
- Object obj = field.get(params.get(i));
- if (null != obj) {
- stringBuilder.append(obj.toString());
- }
- } else {
- stringBuilder.append("");
- }
- if (j < fieldNameList.length - 1) {
- stringBuilder.append(",");
- }
- }else{
- Object param = params.get(i);
- Object valObj = vectorObj(clazz, fieldName, param);
- if(null!=valObj){
- stringBuilder.append(valObj.toString());
- }else {
- stringBuilder.append("");
- }
- if (j < fieldNameList.length - 1) {
- stringBuilder.append(",");
- }
- }
- }
- stringBuilder.append("\r\n");
- }
- return stringBuilder.toString();
- }
- /**
- *
- * @Description: 通过response下载文档
- * @param @param response
- * @param @param fileName
- * @param @param headList
- * @param @param fieldNameList
- * @param @param params 设定文件
- * @return void 返回类型
- */
- public static void httpExportCSV(HttpServletRequest request, HttpServletResponse response, String fileName, String[] headList,
- String[] fieldNameList, List<?> params) {
- Map<String, Object> map = new HashMap<String, Object>();
- try {
- response.setCharacterEncoding("UTF-8");
- response.setContentType("application/x-download");
- final String userAgent = request.getHeader("USER-AGENT");
- String csvContent = csv(headList, fieldNameList, params);
- String finalFileName = null;
- if (StringUtils.contains(userAgent, "MSIE")) {// IE浏览器
- finalFileName = URLEncoder.encode(fileName, "UTF8");
- } else if (StringUtils.contains(userAgent, "Mozilla")) {// google,火狐浏览器
- finalFileName = new String(fileName.getBytes(), "ISO8859-1");
- } else {
- finalFileName = URLEncoder.encode(fileName, "UTF8");// 其他浏览器
- }
- response.setHeader("Content-Disposition", "attachment; filename=\"" + finalFileName + "\"");
- response.getOutputStream().write(csvContent.getBytes());
- } catch (IllegalArgumentException | IllegalAccessException | NoSuchFieldException | SecurityException | IOException e) {
- e.printStackTrace();
- map.put("state", "202");
- map.put("message", "数据转换异常");
- try {
- response.getOutputStream().write(JSONUtils.toJSONString(map).getBytes());
- } catch (IOException e1) {
- // TODO Auto-generated catch block
- e1.printStackTrace();
- }
- }
- }
- /**
- *
- * @Description: 得到excel表的二进制流
- * @param @param headList 表头
- * @param @param fieldNameList 属性名按照表头先后顺序对应而且必须在数据类型中存在属性名与之对应
- * @param @param params
- * @param @return
- * @param @throws IllegalArgumentException
- * @param @throws IllegalAccessException
- * @param @throws NoSuchFieldException
- * @param @throws SecurityException
- * @param @throws IOException 设定文件
- * @return byte[] 返回类型
- */
- public static byte[] xls(String[] headList, String[] fieldNameList, List<?> params) throws IllegalArgumentException, IllegalAccessException,
- NoSuchFieldException, SecurityException, IOException {
- Workbook work = new HSSFWorkbook();
- Sheet sheet = work.createSheet();
- Row rowOne = sheet.createRow(0);
- for (int i = 0; null != headList && i < headList.length; i++) {// 表头
- Cell cellOne = rowOne.createCell(i);
- cellOne.setCellValue(headList[i]);// 填充值
- }
- // 数据填充
- for (int i = 0; null != params && i < params.size(); i++) {
- Class<? extends Object> clazz = params.get(i).getClass();
- Row dataRow = sheet.createRow(i + 1);
- for (int j = 0; null != fieldNameList && j < fieldNameList.length; j++) {
- String fieldName = fieldNameList[j];
- Cell cell = dataRow.createCell(j);
- if (!fieldName.contains(".")) {
- Field field = clazz.getDeclaredField(fieldName);
- field.setAccessible(true);
- Object obj = field.get(params.get(i));
- if (null != obj) {
- if (obj instanceof String) {
- cell.setCellValue(obj.toString());
- } else if (obj instanceof Double) {
- cell.setCellValue((double) obj);
- } else if (obj instanceof Boolean) {
- cell.setCellValue((boolean) obj);
- } else if (obj instanceof Date) {
- cell.setCellValue((Date) obj);
- } else {
- cell.setCellValue(obj.toString());
- }
- }
- } else if (fieldName.contains(".")) {
- Object param = params.get(i);
- Object valObj = vectorObj(clazz, fieldName, param);
- cell.setCellValue(null == valObj ? null : valObj.toString());
- }
- }
- }
- ByteOutputStream bos = new ByteOutputStream();
- work.write(bos);
- work.close();
- return bos.getBytes();
- }
- private static Object vectorObj(Class<? extends Object> clazz, String fieldName, Object obj) throws NoSuchFieldException, SecurityException,
- IllegalArgumentException, IllegalAccessException {
- if (!fieldName.contains(".")) {
- Field field = clazz.getDeclaredField(fieldName);
- field.setAccessible(true);
- return field.get(obj);
- } else {
- String fieldChildName = fieldName.substring(0, fieldName.indexOf("."));
- Object newObj = null;
- if (null != fieldChildName) {
- Field field = clazz.getDeclaredField(fieldChildName);
- field.setAccessible(true);
- newObj = field.get(obj);
- if (newObj == null) {
- return null;
- } else {
- Class<? extends Object> clazz2 = newObj.getClass();
- String fieldOtherChildName = fieldName.substring(fieldName.indexOf(".") + 1);
- return vectorObj(clazz2, fieldOtherChildName, newObj);
- }
- }
- return null;
- }
- }
- /**
- *
- * @Description: 导出xls表-------------从第一列开始
- * @param @param request
- * @param @param response
- * @param @param fileName 文件名
- * @param @param headList 表头
- * @param @param fieldNameList 属性名 和按照表头先后顺序对应,值和数据列表中对象类型的属性名相同
- * @param @param params 设定文件
- * @return void 返回类型
- */
- public static void httpExportXLS(HttpServletRequest request, HttpServletResponse response, String fileName, String[] headList,
- String[] fieldNameList, List<?> params) {
- Map<String, Object> map = new HashMap<String, Object>();
- try {
- response.setCharacterEncoding("UTF-8");
- response.setContentType("application/x-download");
- final String userAgent = request.getHeader("USER-AGENT");
- byte[] xlsContent = xls(headList, fieldNameList, params);
- String finalFileName = null;
- if (StringUtils.contains(userAgent, "MSIE")) {// IE浏览器
- finalFileName = URLEncoder.encode(fileName, "UTF8");
- } else if (StringUtils.contains(userAgent, "Mozilla")) {// google,火狐浏览器
- finalFileName = new String(fileName.getBytes(), "ISO8859-1");
- } else {
- finalFileName = URLEncoder.encode(fileName, "UTF8");// 其他浏览器
- }
- response.setHeader("Content-Disposition", "attachment; filename=\"" + finalFileName + "\"");
- response.getOutputStream().write(xlsContent);
- } catch (IllegalArgumentException | IllegalAccessException | NoSuchFieldException | SecurityException | IOException e) {
- e.printStackTrace();
- map.put("state", "202");
- map.put("message", "数据转换异常");
- try {
- response.getOutputStream().write(JSONUtils.toJSONString(map).getBytes());
- } catch (IOException e1) {
- // TODO Auto-generated catch block
- e1.printStackTrace();
- }
- }
- }
- /**
- *
- * @Description: 根据路径的后缀名导出对应的文件
- * @param @param request
- * @param @param response
- * @param @param fileName------------文件名(格式*.xls,*.csv)
- * @param @param headList--------------表格头部内容
- * @param @param fieldNameList----------属性名和数据列表中类型的属性名相同,通过先后循序和表头对应。
- * @param @param params--------------数据
- * @param @throws Exception ----文件名不合法
- * @return void 返回类型
- */
- public static void httpExport(HttpServletRequest request, HttpServletResponse response, String fileName, String[] headList,
- String[] fieldNameList, List<?> params) throws Exception {
- if (null == fileName || StringUtils.isEmpty(fileName)) {
- throw new NullPointerException("文件名不可以为空");
- } else {
- String suffix = fileName.substring(fileName.indexOf(".") + 1);
- if (null != suffix) {
- System.out.println(suffix);
- switch (suffix) {
- case "csv":
- httpExportCSV(request, response, fileName, headList, fieldNameList, params);
- break;
- case "xls":
- httpExportXLS(request, response, fileName, headList, fieldNameList, params);
- break;
- case "xlsx":
- httpExportXLS(request, response, fileName, headList, fieldNameList, params);
- break;
- case "doc":
- break;
- case "docx":
- break;
- case "pdf":
- break;
- }
- } else {
- throw new Exception("文件名的格式不合法");
- }
- }
- }
- }
java使用poi实现excel表格生成的更多相关文章
- java用poi读取Excel表格中的数据
Java读写Excel的包是Apache POI(项目地址:http://poi.apache.org/),因此需要先获取POI的jar包,本实验使用的是POI 3.9稳定版.Apache POI 代 ...
- Java使用POI解析Excel表格
概述 Excel表格是常用的数据存储工具,项目中经常会遇到导入Excel和导出Excel的功能. 常见的Excel格式有xls和xlsx.07版本以后主要以基于XML的压缩格式作为默认文件格式xlsx ...
- Java Struts2 POI创建Excel文件并实现文件下载
Java Struts2 POI创建Excel文件并实现文件下载2013-09-04 18:53 6059人阅读 评论(1) 收藏 举报 分类: Java EE(49) Struts(6) 版权声明: ...
- JAVA使用POI获取Excel的列数与行数
Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能. 下面这篇文章给大家介 ...
- Java之POI导出Excel(一):单sheet
相信在大部分的web项目中都会有导出导入Excel的需求,今天我们就来看看如何用Java代码去实现 用POI导出Excel表格. 一.pom引用 pom文件中,添加以下依赖 查看代码 <!-- ...
- JAVA使用POI读取EXCEL文件的简单model
一.JAVA使用POI读取EXCEL文件的简单model 1.所需要的jar commons-codec-1.10.jarcommons-logging-1.2.jarjunit-4.12.jarlo ...
- java通过poi编写excel文件
public String writeExcel(List<MedicalWhiteList> MedicalWhiteList) { if(MedicalWhiteList == nul ...
- java使用POI实现excel文件的读取,兼容后缀名xls和xlsx
需要用的jar包如下: 如果是maven管理的项目,添加依赖如下: <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --&g ...
- Java之POI读取Excel的Package should contain a content type part [M1.13]] with root cause异常问题解决
Java之POI读取Excel的Package should contain a content type part [M1.13]] with root cause异常问题解决 引言: 在Java中 ...
随机推荐
- 深入理解Flink核心技术(转载)
作者:李呈祥 Flink项目是大数据处理领域最近冉冉升起的一颗新星,其不同于其他大数据项目的诸多特性吸引了越来越多的人关注Flink项目.本文将深入分析Flink一些关键的技术与特性,希望能够帮助读者 ...
- mysql基础测试
mysql基础测试 测试原因 为什么需要做性能测试 模拟比当前系统更高的负载,找出性能瓶颈 重现线上异常 测试不同硬件软件配置 规划未来的业务增长 测试分类 性能测试的分类 设备层的测试 ...
- 8种主要排序算法的C#实现 (二)
归并排序 归并排序也是采用“分而治之”的方式.刚发现分治法是一种算法范式,我还一直以为是一种需要意会的思想呢. 不好意思了,孤陋寡闻了,哈哈! 原理:将两个有序的数列,通过比较,合并为一个有序数列. ...
- python全栈开发从入门到放弃之socket并发编程之协程
一.为什么会有协程 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情 ...
- SQL Server排名函数与排名开窗函数
什么是排名函数?说实话我也不甚清楚,我知道 order by 是排序用的,那么什么又是排名函数呢? 接下来看几个示例就明白了. 首先建立一个表,随便插入一些数据. ROW_NUMBER 函数:直接排序 ...
- java poi解析excel日期为数字的问题
这个数字是什么呢?是以1900年为原点,到2015年8月21日,之间经过的天数. 知道这个后,就很好处理了,我们拿到1900年的日期,在这个日期上加上42237天即可.如下: Calendar cal ...
- 干货!Jenkins下配置findbugs、pmd及checkstyle实现代码自动检测
配置前提: 对于maven项目来说,需要在pom.xml文件的<build><plugins>添加配置</plugins></build> 网上有些地方 ...
- 『NiFi 学习之路』自定义 —— 组件的自定义及使用
一.概述 许多业务仅仅使用官方提供的组件不能够满足性能上的需求,往往要通过高度可定制的组件来完成特定的业务需求. 而 NiFi 提供了自定义组件的这种方式. 二.自定义 Processor 占坑待续 ...
- Android系统机制
Android系统机制 本文主要介绍Android系统整体运行机制 Linux中的一些概念 uboot加载系统内核到内存,系统内核运行起来的后,会创建第一个用户进程叫init进程,该进程是所有用户进程 ...
- Selenium+Python常见定位方法
参见官网:http://selenium-python.readthedocs.io/locating-elements.html 有多种策略来定位页面中的元素.你可以使用最适合你的情况.Seleni ...