java 导入excel工具类_java Excel工具类,导入导出Excel数据
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数据相关推荐
- java导出excel带图片_JAVA的poi实现模版导出excel(带图片).doc
JAVA的poi实现模版导出excel(带图片) 下面是本人使用java的poi实现使用模板到处excel,内容包含图片,使用两种不同的方式实现其到处excel.但是使用jxl实现到处excel只能到 ...
- java swing 导出文件_java swing (一) 导出excel文件并打开
点击XXX管理系统中的"导出Excel"按钮,然后弹出如上图,点击"保存"以后,该Excel就保存到指定路径,并且打开. 上述的动作,其实不难,主要是打开该文件 ...
- java删除word中批注_Java 添加、读取和删除 Excel 批注的操作代码
批注是一种富文本注释,常用于为指定的Excel单元格添加提示或附加信息. Free Spire.XLS for Java为开发人员免费提供了在Java应用程序中对Excel文件添加和操作批注的功能. ...
- vb/java/c# 生成code128 条码/QR Code二维码 导出excel
java/c#生成条形码/二维码图片,导出excel 会用到POI/NPOI,BarcodeLib.ZXing插件. code128 如果不使用插件,也可使用下面vb/c#代码生成含有校验的条码文本, ...
- Java利用注解实现配置动态公式并结合POI导出Excel
利用注解实现动态配置公式并结合POI导出Excel 实现思想 创建导出对象 创建使用注解类 创建封装导出对象属性类 创建测试类 创建ExcelUtil类 实现效果 实现思想 实施顾问提出导出Excel ...
- java常用的集合对象_java常用实体类、集合类
java常用实体类.集合类 [转自51cto博客jichangwei的BLOG] 1:String类,字符串是常量,他们的值在创建之后不能更改,可以共享. equals()用来比较两个字符串的值,== ...
- java简单通讯录的实现02person类_Java中Math类的简单介绍
我想对于Math类大家一定很熟悉了,是Java提供的一个用来进行简单数学运算的工具类.对于Math类来说,常用的方法有: 加法 public static int addExact(int x, in ...
- java date 操作类_JAVA时间操作类常用方法汇总
1.JAVA中日期的获取.设置和格式化 (1)JAVA提供了3个日期类:Date.Calendar和DateFormat. Date()方法主要用于创建日期对象并获取日期: Calendar()方法主 ...
- java中类的修饰符_Java中的类修饰符
之前每次写小测试程序的时候,总是把一个类放在一个Java文件中,按理说这样比较规范,可主要原因是我是在不知道怎么在一个文件里放多个类,可见java基础有多差了...只要把类的属性改成默认的就可以了,也 ...
- java class对象创建时机_Java面向对象编程-类的声明周期
第十章 类的生命周期 10.1 Java虚拟机及程序的生命周期 当通过java命令运行一个Java程序时,就启动了一个Java虚拟机进程.Java虚拟机进程从启动到终止的过程,称为Java虚拟机的生命 ...
最新文章
- Java学习笔记28
- Sublime Text 2/3 Package Control 安装方法(Install Package)
- ubuntu 20上安装gdbgui
- html radio 默认图片替换_html,css_如何更改radio、checkbox选项框背景图?,html,css - phpStudy...
- 部署和调优 1.5 vsftp部署和优化-1
- DOMContentLoaded与interactive
- C#中 out、ref、params 修饰符使用方法
- php服务模块在nginx中的安装失败,在已安装的nginx中添加模块
- Unity3D-Rigidbody
- 重置密码解决MySQL for Linux错误 ERROR 1045 (28000):
- Facebook开源了两个无监督翻译模型,只用单语就能训练双语
- 樊登高效休息法读书心得_读书时间丨高效休息法:让身体和大脑彻底放松的七个方法...
- 洛谷P1141 01迷宫
- JavaScript-RegExp及String的正则表达式处理方法
- linux virbr0是什么意思
- Linux基础操作篇
- 有哪些好用的渲染软件?12个业内顶级渲染软件推荐
- Mac系统go版本升级
- WM_CHAR,WM_UNICHAR,WM_IME_CHAR
- 页码数字统计问题(数字统计问题)
热门文章
- 培训班出来的人后来都怎么样了?(五)
- oracle dbms advisor,通过shell定制dbms_advisor.quick_tune
- 末代帝王微软:戴着PC枷锁跳“移动Style”
- 腾讯财付通漏洞遭黑客利用
- 用matplotlib作图时,如何将坐标轴设置成对数坐标?
- PHP+MySQL 制作留言板
- oracle数据文件离线,oracle数据库的文件在哪里
- 阿里放弃SpringCloud、Dubbo,选择的这个神仙框架!牛逼
- W5500在单片机中的测试及长字节的发送和接收
- 使用两次Hash的Hash表——Twice_Hash_Map