java Excel工具类,导入导出Excel数据,导入数据对合并表格有判断获取数据;

导出数据到Excel,Excel文件不存在会创建。

使用的是poi处理,兼容Excel。

对反射不够理解,目前先用map处理,后续想好了,再处理。

代码:

package com.gx.excel;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.lang.reflect.InvocationTargetException;

import java.text.SimpleDateFormat;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.Iterator;

import java.util.List;

import java.util.Map;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import org.apache.poi.ss.usermodel.Cell;

import org.apache.poi.ss.usermodel.DateUtil;

import org.apache.poi.ss.usermodel.Row;

import org.apache.poi.ss.usermodel.Sheet;

import org.apache.poi.ss.usermodel.Workbook;

import org.apache.poi.ss.usermodel.WorkbookFactory;

import org.apache.poi.ss.util.CellRangeAddress;

import org.apache.poi.xssf.usermodel.XSSFWorkbook;

/**

* @ClassName: ExcelUtilDeal

* @Description: Excel工具类,导入导出Excel数据

* @author zhoujie

* @date 2018年7月21日 上午11:08:13

* @version V1.0

*/

public class ExcelUtilDeal {

public static void main(String[] args) {

//获取Excel文件数据

/*List> list = getExcelData("用户表1.xls", "用户表");

System.out.println("listsize:"+list.size());

for(Map map : list){

for (Object key : map.keySet()) {

System.out.println(key + " :" + map.get(key));

}

} */

//数据导出到Excel

List> list = new ArrayList<>();

String[] headers = {"用户名","密码","邮箱","性别","年龄"};

for (int i = 0; i < 2; i++) {

Map map = new HashMap<>();

for (int j = 0; j < headers.length; j++) {

map.put(headers[j], i+""+j+"");

}

list.add(map);

}

fillExcelData(list, "用户表1.xls", "用户表", headers);

}

/**

* 数据导出到Excel,单个Excel

* @param list 数据

* @param excelFile Excel文件:用户表.xlsx

* @param headers 行头标题字符串数组

* @param sheetname Excel的sheet名称

* @return int 导出数量

* @throws Exception

*/

public static int fillExcelData(List> list, String excelFile, String sheetname, String[] headers) {

// 无Excel文件先创建Excel文件,再读取Excel文件

String cpath = ExcelUtilDeal.class.getClassLoader().getResource("").getPath();

String rootPath = cpath.substring(0, cpath.indexOf("/WEB-INF/"));

File dirfile = new File(rootPath+"\\excel\\"); //判断文件夹是否存在

if(!dirfile.exists()){

dirfile.mkdirs(); //创建文件夹

}

String path = rootPath+"\\excel\\"+excelFile;

File file = new File(path);

FileOutputStream out = null;

FileInputStream fileinp = null;

Workbook wb = null;

try {

if(!file.exists()){ //判断文件是否存在

createExcel(path, sheetname, headers); //创建Excel文件

}

fileinp = new FileInputStream(file);

wb = WorkbookFactory.create(fileinp); //兼容模式打开Excel

Sheet sheet = wb.getSheet(sheetname); //获取sheet

Row row = null; //行

if(sheet == null){

sheet = wb.createSheet(sheetname); //创建sheet

row = sheet.createRow(0); //首行

// 先填充行头

for (int i = 0; i < headers.length; i++) {

row.createCell(i).setCellValue(headers[i]);

}

}

// 再填充数据

int rowIndex = 1;

Iterator> iterator = list.iterator();

while (iterator.hasNext()) {

row = sheet.createRow(rowIndex++);

Map map = iterator.next(); //获取对象

setRowCellValue(map, headers, row); //设置值

}

out = new FileOutputStream(path);

wb.write(out);

System.out.println("数据导出到Excel文件");

return rowIndex;

} catch (Exception e) {

e.printStackTrace();

} finally {

try {

wb.close();

fileinp.close();

out.close();

} catch (IOException e) {

e.printStackTrace();

}

}

return 0;

}

/**

* 设置Excel一行数据

* @param map 数据集合

* @param row Excel行

* @throws NoSuchMethodException

* @throws IllegalAccessException

* @throws IllegalArgumentException

* @throws InvocationTargetException

*/

public static void setRowCellValue(Map map, String[] headers, Row row) throws NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {

Object value = null;

for (int i = 0; i < headers.length; i++) {

value = map.get(headers[i]);

if(value instanceof Double){

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

value = sdf.format(value).toString();

}else if(value instanceof Boolean){

if((boolean) value){

value = "是";

}else{

value = "否";

}

}

row.createCell(i).setCellValue(value.toString()); //单元格值设置

}

}

/**

* 获取Excel文件数据

* 填充数据到excel文件

* @param excelFile Excel文件名称

* @return int 导入数量

* @throws Exception

*/

public static List> getExcelData(String excelFile, String sheetname) {

List> list = new ArrayList<>();

// 本地磁盘读取excel文件,然后读取sheet,再读取所有数据,循环sheet

FileInputStream fileinp = null;

Workbook wb = null;

try {

String cpath = ExcelUtilDeal.class.getClassLoader().getResource("").getPath();

String rootPath = cpath.substring(0, cpath.indexOf("/WEB-INF/"));

String path = rootPath+"\\excel\\"+excelFile;

File file = new File(path);

if(!file.exists()){

file.mkdirs();

}

fileinp = new FileInputStream(file);

wb = WorkbookFactory.create(fileinp); //兼容模式打开Excel

Sheet sheet = wb.getSheet(sheetname); //获取对应sheet

Row firstrow = sheet.getRow(0); //获取首行数据即标题;

int rows = sheet.getPhysicalNumberOfRows(); //获取sheet表格数据行数

int cells = firstrow.getPhysicalNumberOfCells();//获取表头单元格个数

String[] headers = new String[cells]; //行头

for (int i = 0; i < cells; i++) {

Cell firstrowCell = firstrow.getCell(i);

headers[i] = firstrowCell.getStringCellValue();

}

Row row; //初始化行

Cell cell; //初始化单元格

for (int i = 1; i < rows; i++) {

row = sheet.getRow(i); //从第二行开始读数据

Map map = new HashMap<>();

for (int j = 0; j < cells; j++) {

if(isMergedRegion(sheet, i, j)){ //判断是否是合并单元格

System.out.println("发现合并单元格");

cell = getMergedCell(sheet, row, j); //获取合并单元格

}else{

cell = row.getCell(j);

}

Object value = formatCellData(cell); //获取格式化单元格值

map.put(headers[j], value);

}

list.add(map);

}

System.out.println("获取Excel文件数据");

} catch (Exception e) {

e.printStackTrace();

} finally {

try {

wb.close();

fileinp.close();

} catch (Exception e) {

e.printStackTrace();

}

}

return list;

}

/**

* 创建新excel.

* @param fileDir excel的路径

* @param sheetName 要创建的表格索引

* @param headers excel的第一行即表格头

*/

public static void createExcel(String fileDir,String sheetName,String headers[]) {

//创建workbook

Workbook workbook = null;

try{

workbook = new HSSFWorkbook();

}catch(Exception e){

workbook = new XSSFWorkbook();

}

//添加Worksheet(不添加sheet时生成的xlsx文件打开时会报错)

workbook.createSheet(sheetName);

//输出流

FileOutputStream out = null;

try {

//添加表头

Row row = workbook.getSheet(sheetName).createRow(0); //sheet创建第一行

for(short i = 0;i < headers.length;i++){

row.createCell(i).setCellValue(headers[i]);

}

out = new FileOutputStream(fileDir); //创建文件

workbook.write(out); //写入sheet

System.out.println("创建Excel");

} catch (Exception e) {

e.printStackTrace();

} finally {

try {

workbook.close();

out.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

/**

* 返回格式化各类型单元格值

* @param cell 单元格

* @return Object 返回值

*/

@SuppressWarnings("deprecation")

public static Object formatCellData(Cell cell) {

if (cell == null) {

return "";

}

switch (cell.getCellType()) {

case Cell.CELL_TYPE_NUMERIC:

if (DateUtil.isCellDateFormatted(cell)) { // 日期

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

return sdf.format(DateUtil.getJavaDate(cell.getNumericCellValue())).toString();

}

return cell.getNumericCellValue(); // 数字

case Cell.CELL_TYPE_STRING: // 字符串

return cell.getStringCellValue();

case Cell.CELL_TYPE_FORMULA: // 公式

return cell.getCellFormula();

case Cell.CELL_TYPE_BLANK: // 空白

return "";

case Cell.CELL_TYPE_BOOLEAN: // 布尔取值

return cell.getBooleanCellValue();

case Cell.CELL_TYPE_ERROR: // 错误类型

return cell.getErrorCellValue();

}

return "";

}

/**

* 判断是否合并单元格

* 先获取所有合并单元格,通过传入行列索引判断是否在合并单元格内

* @param sheet

* @param row

* @param column

* @return

*/

public static boolean isMergedRegion(Sheet sheet, int row, int column) {

int sheetMergeCount = sheet.getNumMergedRegions();

for (int i = 0; i < sheetMergeCount; i++) {

CellRangeAddress range = sheet.getMergedRegion(i); //循环获取所有合并单元格

int firstColumn = range.getFirstColumn();

int lastColumn = range.getLastColumn();

int firstRow = range.getFirstRow();

int lastRow = range.getLastRow();

if (row >= firstRow && row <= lastRow) { //判断是否在合并单元格中

if (column >= firstColumn && column <= lastColumn) {

return true;

}

}

}

return false;

}

/**

* 获取合并单元格有值单元格

* 合并单元格值保存在第一个合并单元格内

* @param sheet

* @param row

* @param column

* @return

*/

public static Cell getMergedCell(Sheet sheet, Row row, int column) {

int sheetMergeCount = sheet.getNumMergedRegions();

Cell fCell = null;

int rowIndex = row.getRowNum();

for (int i = 0; i < sheetMergeCount; i++) {

CellRangeAddress ca = sheet.getMergedRegion(i);

int firstColumn = ca.getFirstColumn();

int lastColumn = ca.getLastColumn();

int firstRow = ca.getFirstRow();

int lastRow = ca.getLastRow();

if (rowIndex >= firstRow && rowIndex <= lastRow) {

if (column >= firstColumn && column <= lastColumn) {

Row fRow = sheet.getRow(firstRow);

fCell = fRow.getCell(firstColumn);

}

}

}

if (fCell == null) {

fCell = row.getCell(column);

}

return fCell;

}

/**

* 截取文件后缀

* @param path

* @return String 返回类型

*/

public static String getSuffix(String path) {

String substring = path.substring(path.lastIndexOf(".") + 1);

return substring;

}

}

说明:Excel文件导出在根目录下的excel目录。

java 导入excel工具类_java Excel工具类,导入导出Excel数据相关推荐

  1. java导出excel带图片_JAVA的poi实现模版导出excel(带图片).doc

    JAVA的poi实现模版导出excel(带图片) 下面是本人使用java的poi实现使用模板到处excel,内容包含图片,使用两种不同的方式实现其到处excel.但是使用jxl实现到处excel只能到 ...

  2. java swing 导出文件_java swing (一) 导出excel文件并打开

    点击XXX管理系统中的"导出Excel"按钮,然后弹出如上图,点击"保存"以后,该Excel就保存到指定路径,并且打开. 上述的动作,其实不难,主要是打开该文件 ...

  3. java删除word中批注_Java 添加、读取和删除 Excel 批注的操作代码

    批注是一种富文本注释,常用于为指定的Excel单元格添加提示或附加信息. Free Spire.XLS for Java为开发人员免费提供了在Java应用程序中对Excel文件添加和操作批注的功能. ...

  4. vb/java/c# 生成code128 条码/QR Code二维码 导出excel

    java/c#生成条形码/二维码图片,导出excel 会用到POI/NPOI,BarcodeLib.ZXing插件. code128 如果不使用插件,也可使用下面vb/c#代码生成含有校验的条码文本, ...

  5. Java利用注解实现配置动态公式并结合POI导出Excel

    利用注解实现动态配置公式并结合POI导出Excel 实现思想 创建导出对象 创建使用注解类 创建封装导出对象属性类 创建测试类 创建ExcelUtil类 实现效果 实现思想 实施顾问提出导出Excel ...

  6. java常用的集合对象_java常用实体类、集合类

    java常用实体类.集合类 [转自51cto博客jichangwei的BLOG] 1:String类,字符串是常量,他们的值在创建之后不能更改,可以共享. equals()用来比较两个字符串的值,== ...

  7. java简单通讯录的实现02person类_Java中Math类的简单介绍

    我想对于Math类大家一定很熟悉了,是Java提供的一个用来进行简单数学运算的工具类.对于Math类来说,常用的方法有: 加法 public static int addExact(int x, in ...

  8. java date 操作类_JAVA时间操作类常用方法汇总

    1.JAVA中日期的获取.设置和格式化 (1)JAVA提供了3个日期类:Date.Calendar和DateFormat. Date()方法主要用于创建日期对象并获取日期: Calendar()方法主 ...

  9. java中类的修饰符_Java中的类修饰符

    之前每次写小测试程序的时候,总是把一个类放在一个Java文件中,按理说这样比较规范,可主要原因是我是在不知道怎么在一个文件里放多个类,可见java基础有多差了...只要把类的属性改成默认的就可以了,也 ...

  10. java class对象创建时机_Java面向对象编程-类的声明周期

    第十章 类的生命周期 10.1 Java虚拟机及程序的生命周期 当通过java命令运行一个Java程序时,就启动了一个Java虚拟机进程.Java虚拟机进程从启动到终止的过程,称为Java虚拟机的生命 ...

最新文章

  1. Java学习笔记28
  2. Sublime Text 2/3 Package Control 安装方法(Install Package)
  3. ubuntu 20上安装gdbgui
  4. html radio 默认图片替换_html,css_如何更改radio、checkbox选项框背景图?,html,css - phpStudy...
  5. 部署和调优 1.5 vsftp部署和优化-1
  6. DOMContentLoaded与interactive
  7. C#中 out、ref、params 修饰符使用方法
  8. php服务模块在nginx中的安装失败,在已安装的nginx中添加模块
  9. Unity3D-Rigidbody
  10. 重置密码解决MySQL for Linux错误 ERROR 1045 (28000):
  11. Facebook开源了两个无监督翻译模型,只用单语就能训练双语
  12. 樊登高效休息法读书心得_读书时间丨高效休息法:让身体和大脑彻底放松的七个方法...
  13. 洛谷P1141 01迷宫
  14. JavaScript-RegExp及String的正则表达式处理方法
  15. linux virbr0是什么意思
  16. Linux基础操作篇
  17. 有哪些好用的渲染软件?12个业内顶级渲染软件推荐
  18. Mac系统go版本升级
  19. WM_CHAR,WM_UNICHAR,WM_IME_CHAR
  20. 页码数字统计问题(数字统计问题)

热门文章

  1. 培训班出来的人后来都怎么样了?(五)
  2. oracle dbms advisor,通过shell定制dbms_advisor.quick_tune
  3. 末代帝王微软:戴着PC枷锁跳“移动Style”
  4. 腾讯财付通漏洞遭黑客利用
  5. 用matplotlib作图时,如何将坐标轴设置成对数坐标?
  6. PHP+MySQL 制作留言板
  7. oracle数据文件离线,oracle数据库的文件在哪里
  8. 阿里放弃SpringCloud、Dubbo,选择的这个神仙框架!牛逼
  9. W5500在单片机中的测试及长字节的发送和接收
  10. 使用两次Hash的Hash表——Twice_Hash_Map