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. CSS如何设置换行文字自动对齐

    CSS如何设置换行文字自动对齐 如图所示: 代码实现如下: <ul class='warn-page-content'>                <li>         ...

  2. Android 环信(Android)设置头像和昵称的方法

    最近,经常有朋友问到,如何集成环信头像,怎么才能快速显示头像,因时间紧急,很多朋友都没有时间慢慢的研究代码,这里大家稍微花10分钟看一下文章,看完后再花5分钟改一下代码,即可达到你们所要的效果. 当然 ...

  3. 【Eclipse】在Eclipse上安装Spket

     转自:https://www.cnblogs.com/HDK2016/p/7099383.html 1,Spket是什么? Spket是一种编辑javaScript和XML代码的工具,可以用他自己的 ...

  4. JsonConvert序列化问题

    返回的Json数据如下: [[1400025600,9633460,9667535,2698.09,2734.73,2749,2698.08,25333.3057,11784.9,13548.4,69 ...

  5. laravel + haproxy + https 后生成分页 url 非 https 解决办法

    更合适的解决办法:在 AppServiceProvider boot 方法中使用 \URL::forceScheme('https'); 即可. 背景 近日对所有的客户都上线了 https ,本来在 ...

  6. Struts2学习-拦截器2

    1.做一个登陆页面(loginView.jsp,才用Action来访问),2.登陆成功后,可以跳转到系统的首页(index.jsp),3.首页有一个链接(testOtherAction访问其它的功能模 ...

  7. day6-基础 装饰器,生成器,迭代器

    1.装饰器 定义:给其他函数装饰(添加附加功能)的函数 原则:1.不能修改被装饰的函数的源代码.    2.不能修改北庄施的函数的调用方式 实现所需要求:1.函数即便量    2.高阶函数 3.嵌套函 ...

  8. March 11 2017 Week 10 Saturday

    Wisdom outweighs any wealth. 智慧比财富更有价值. Wisdom can create wealth if used in proper ways, it can help ...

  9. mysqlbinlog用法总结

    通过binlog日志统计dml语句,找出操作频繁的表 mysqlbinlog --no-defaults --base64-output=decode-rows -v -v   mysql-bin.0 ...

  10. 计算次数,POJ(1207)

    题目链接:http://poj.org/problem?id=1207 #include <stdio.h> #include <algorithm> using namesp ...