1,引入所用的包

 <dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.5-FINAL</version>
</dependency>

2,创建列名List,此处将显示到单元格每列名称,根据自己的业务需求更改列名

List<String> columnList = new ArrayList();
columnList.add("申请人账号");
columnList.add("申请人");
columnList.add("提现金额");
columnList.add("开户行");
columnList.add("持卡人");
columnList.add("卡号");
columnList.add("银行名称");
columnList.add("申请时间");

3,创建将要导出的参数(实体类),此处必须和创建的列名List一一对应,否则会错行显示

package com.sanmi.active.fission.management.balance.dto;

import lombok.Data;

import java.math.BigDecimal;
import java.sql.Timestamp; /**
* @author:Ziggo Xu <br/>
* <p>提现管理导出参数</p>
* ===============================
* Date:2018/12/12
* Time:16:55
* ================================
*/
@Data
public class UserBalanceCashExcelDTO {
/**
* 申请人账户
*/
private String account;
/**
* 申请人
*/
private String nickName;
/**
* 提现金额
*/
private BigDecimal bcCashMoney;/**
* 开户行名称
*/
private String ubiOpenBank;
/**
* 持卡人姓名
*/
private String ubiRealName;
/**
* 银行卡卡号
*/
private String ubiCardNo;
/**
* 银行卡名称
*/
private String ubiBankName;
/**
* 提现时间
*/
private Timestamp bcCreateTime; }

4,创建导出Excel的工具类

package com.sanmi.active.fission.base.util;

import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook; import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Field;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.*; public class Tool {
/**
* 导出excel操作
* @param response
* @param columnList 列名
* @param list 内容
* @param title
* @param titlePostion 标题位置
* @throws IllegalAccessException
* @throws IOException
*/
public static void export(HttpServletResponse response, List<String> columnList, List<?> list, String title, Integer titlePostion) throws IllegalAccessException, IOException { response.reset();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmss");
String dateStr = sdf.format(new Date());
Map<String,Object> map=new HashMap<String,Object>();
// 指定下载的文件名
response.setHeader("Content-Disposition", "attachment;filename=" +dateStr+".xlsx");
// response.setContentType("application/vnd.ms-excel;charset=UTF-8"); XSSFWorkbook workBook = new XSSFWorkbook();
// 在workbook中添加一个sheet,对应Excel文件中的sheet
XSSFSheet sheet = workBook.createSheet(); //列号
int colNum = 0;
//行号
int rowNum = 0;
XSSFRow rowtitle = sheet.createRow(rowNum++);
rowtitle.createCell(titlePostion).setCellValue(title);
XSSFRow rowheader = sheet.createRow(rowNum++);
for(String string:columnList){
rowheader.createCell(colNum++).setCellValue(string);
}
Iterator iterator = list.iterator();
while (iterator.hasNext()){
Object object = iterator.next();
XSSFRow row = sheet.createRow(rowNum++);
colNum=0;
for (Field field : object.getClass().getDeclaredFields()){
field.setAccessible(true);
if (field.getType().isInstance(Timestamp.class)){
row.createCell(colNum++).setCellValue(field.get(object).toString()
.substring(0,field.get(object).toString().indexOf(".")));
}else {
if(field.get(object) == null){
row.createCell(colNum++).setCellValue("");
}else {
row.createCell(colNum++).setCellValue(field.get(object).toString());
}
}
}
}
workBook.write(response.getOutputStream());
}
}

5,业务逻辑处理,使用第三部创建的UserBalanceCashExcelDTO  接收集合参数 

 List<UserBalanceCashExcelDTO> list = balanceCashApplyService.exportApplyList(param);

6,设置文档的标题

   SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String title = "提现申请导出" + "(" + df.format(new Date()) + ")";

7,调用工具类,导出文档

  Tool.export(response, columnList, list, title, 1);

参考代码如下

  /**
* 导出提现信息
*
* @param param
* @throws Exception
* @throws IllegalAccessException
*/
@RequestMapping("/exportApplyList")
public void exportApplyList(UserBalanceCashParam param) throws Exception {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
List<UserBalanceCashExcelDTO> list = balanceCashApplyService.exportApplyList(param);
String title = "提现申请导出" + "(" + df.format(new Date()) + ")";
List<String> columnList = new ArrayList();
columnList.add("申请人账号");
columnList.add("申请人");
columnList.add("提现金额");
columnList.add("开户行");
columnList.add("持卡人");
columnList.add("卡号");
columnList.add("银行名称");
columnList.add("申请时间");
//导出
Tool.export(response, columnList, list, title, 1);
}

导出效果图示

8,补充读取excel逻辑实现,新建存储实体

package com.sanmi.active.fission.management.balance.dto;

import lombok.Data;

import java.sql.Timestamp;

/**
* @author:Ziggo Xu <br/>
* <p>导出excel 实体类,与 excel列名对应</p>
* ===============================
* Date:2019/04/12
* Time:16:55
* ================================
*/
@Data
public class ExcelEntity{
//患者id
private String id;
//患者名称
private String name;
//患者检查类型标识 CT MR US 病理
private String flag;
//患者报告内容
private String content;
//分析结果
private String result; }

9,补充读取excel逻辑实现,读取方法

    public static void begin(HttpServletResponse response) throws Exception {
Workbook wb =null;
Sheet sheet = null;
Row row = null;
List<Map<String,String>> list = null;
List<ExcelEntity> entitys = new ArrayList<ExcelEntity>();
String cellData = null;
//这里设置要读取的原始数据
String filePath = "D:\\潍坊二院数据.xls";
//此处的数据是没有意义的,只是为了读取原始数据的列数(5列),设置失误会导致缺失数据
String columns[] = {"id","name","flag","flagName","content"};
wb = readExcel(filePath);
if(wb != null){
//用来存放表中数据
list = new ArrayList<Map<String,String>>();
//获取第三个sheet
sheet = wb.getSheetAt(2);
//获取最大行数
int rownum = sheet.getPhysicalNumberOfRows();
//获取第一行
row = sheet.getRow(0);
//获取最大列数
// int colnum = row.getPhysicalNumberOfCells();
int colnum = 5;//暂定数据,最大五行,其他空白行无意义 ExcelEntity entity = new ExcelEntity();
for (int i = 1; i<rownum; i++) {
Map<String,String> map = new LinkedHashMap<String,String>();
row = sheet.getRow(i);
if(row !=null){
for (int j=0;j<colnum;j++){
cellData = (String) getCellFormatValue(row.getCell(j));
map.put(columns[j], cellData);
}
}else{
break;
}
list.add(map);
//entitys.add(entity);
}
}
//遍历解析出来的list
for (Map<String,String> map : list) {
String flag = null;
String content;
JSONArray jsonArry = null;
String id = null;
ExcelEntity entity = new ExcelEntity();
for (Entry<String,String> entry : map.entrySet()) {
// System.out.print(entry.getKey()+":"+entry.getValue()+",");
//检查类型
if(entry.getKey().equals("flag")) {
flag = entry.getValue();
entity.setFlag(entry.getValue());
}
//检查的内容
if(entry.getKey().equals("content")) {
content = entry.getValue();
content = "[{'content':'"+content+"','pat_in_hos_id':'"+id+"','study_bodypart':'test','time':'2019-03-01 12:05:00'}]";
if(!EmptyUtil.isEmpty(content)) {
jsonArry =JSONArray.fromObject(content);
}
entity.setContent(content);
}
//检查患者的Id
if(entry.getKey().equals("id")) {
id = entry.getValue();
entity.setId(id);
}
//检查患者的名称
if(entry.getKey().equals("name")) {
entity.setName(entry.getValue());
}
}
entity.setResult("测试结果");
entitys.add(entity);
}
//读取方法完成,已封装为list实体!!!!!!
System.out.println(entitys.size());
}

Java 使用Apache POI读取和写入Excel表格的更多相关文章

  1. Java使用POI读取和写入Excel指南

    Java使用POI读取和写入Excel指南 做项目时经常有通过程序读取Excel数据,或是创建新的Excel并写入数据的需求: 网上很多经验教程里使用的POI版本都比较老了,一些API在新版里已经废弃 ...

  2. Java使用POI读取和写入Excel指南(转)

    做项目时经常有通过程序读取Excel数据,或是创建新的Excel并写入数据的需求: 网上很多经验教程里使用的POI版本都比较老了,一些API在新版里已经废弃,这里基于最新的Apache POI 4.0 ...

  3. JAVA读取、写入Excel表格(含03版)

    引言 工作中可能会遇到对Excel读取和写入,如果我们自己手动写的话,会很麻烦,但是Apache中有poi工具类.poi工具类封装好了对于Excel读取和写入,我们需要用的时候,直接调用该方法就好了. ...

  4. java使用org.apache.poi读取与保存EXCEL文件

    一.读EXCEL文件 package com.ruijie.wis.cloud.utils; import java.io.FileInputStream; import java.io.FileNo ...

  5. Java中使用POI读取大的Excel文件或者输入流时发生out of memory异常参考解决方案

    注意:此参考解决方案只是针对xlsx格式的excel文件! 背景 前一段时间遇到一种情况,服务器经常宕机,而且没有规律性,查看GC日志发生了out of memory,是堆溢出导致的,分析了一下堆的d ...

  6. 利用Apache POI 实现简单的Excel表格导出

    1.利用POI API实现简单的Excel表格导出 首先假设一个学生实体类: package com.sun.poi.domain; import java.io.Serializable; impo ...

  7. 《程序实现》从xml、txt文件里读取数据写入excel表格

    直接上码 import java.io.BufferedReader; import java.io.DataInputStream; import java.io.File; import java ...

  8. JXL读取写入excel表格数据

    问题描述: 使用java的jxl包创建.写入excel表格数据 问题解决: (1)说明 (2)写入execel数据 注: 以上是写入数据需要调用的函数接口 注: 具体接口调用过程,如上所示 (3)读取 ...

  9. Java开发小技巧(六):使用Apache POI读取Excel

    前言 在数据仓库中,ETL最基础的步骤就是从数据源抽取所需的数据,这里所说的数据源并非仅仅是指数据库,还包括excel.csv.xml等各种类型的数据接口文件,而这些文件中的数据不一定是结构化存储的, ...

随机推荐

  1. .NET开源工作流RoadFlow-表单设计-复选按钮组

    复选按钮组的设置与单选按钮组的设置相同,只是表现形式为:<input type="checkbox"/>

  2. Java NIO(六) Selector

    Selector(选择器)是Java NIO中能够检测一到多个NIO通道,并能够知晓通道是否为诸如读写事件做好准备的组件.这样,一个单独的线程可以管理多个channel,从而管理多个网络连接. 下面是 ...

  3. android,Exoplayer实现视频播放器

    bundle配置: implementation 'com.google.android.exoplayer:exoplayer-core:2.8.1'implementation 'com.goog ...

  4. PHP json数据的运用

    今天这里总结一下json数据的使用实例,从5.2版本开始,PHP原生提供json_encode()和json_decode()函数,前者用于编码,后者用于解码. 一.json_encode() 1 2 ...

  5. Network Request Failed

    在react native项目中,有时候调用接口会出现这样的错误提示:“Network Request Failed”. 一.模拟器上报“Network Request Failed”解决办法,也是官 ...

  6. Mantis修改“严重性”字段内容

    尝试修改Mantis提交bug时“严重性”字段的内容,将原来的内容修改为A,B,C...等级: 在mantis/config_defaults_inc.php文件中查找$g_severity_enum ...

  7. 一、选择与安装——Linux学习笔记

    A)为什么要用Linux做服务器? 网络理由: 1.linux本身是网络操作系统,支持所有TCP/IP协议,网络功能是内核中六大模块之一 2.linux和unix兼容,unix是早期的服务器霸主,现在 ...

  8. May 21st 2017 Week 21st Sunday

    The smallest deed is better than the greatest intention. 最微小的行动胜过最伟大的打算. Several years ago, just aft ...

  9. Jmeter入门19 保存测试结果(或从文件读取结果)

    以聚合报告为例,其他监听器有write results to file的类似. 首先 为了避免每次保存的测试报告被覆盖,我们在testplan下添加两个参数:项目名和当前时间(毫秒级) 其次 添加聚合 ...

  10. 小故事学设计模式之Observer : (三) 老婆帮忙订机票

    (IT的事就是过场多,过场多了就容易忘,所以我们不妨看一个记一个,这也是一个办法,顺便还能跟同行们交流一下)  要和老婆一起回老家了, 成都离我们安徽太远, 两个人飞一下过去就要花掉近三千块, 于是我 ...