pom.xml 添加引用:

        <!--poi-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.14</version>
</dependency>
<!--ooxml -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.14</version>
</dependency>

Java没有datatable,创建一个数据保存帮助类

import java.util.ArrayList;

public class ExcelDO {
public ExcelDO() { } public ExcelDO(String name) {
this.name = name;
} /*
* sheet名
* */
private String name; public String getName() {
return this.name;
} public void setName(String name) {
this.name = name;
} /*
* 二维集合,保存excel中的数据
* */
private ArrayList<ArrayList<String>> list; public ArrayList<ArrayList<String>> getList() {
return this.list;
} public void setList(ArrayList<ArrayList<String>> list) {
this.list = list;
}
}

poi帮助类

package me.loveshare.springboot1.Common.Helper;

import me.loveshare.springboot1.Entity.DO.ExcelDO;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.formula.eval.ErrorEval;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.concurrent.atomic.AtomicReference; public class POIHelper {
/**
* 根据excel路径返回集合
*/
public static ArrayList<ExcelDO> ReadExcel(String filePath) throws IOException {
ArrayList<ExcelDO> list = new ArrayList<>(); Workbook workbook = GetWorkbook(filePath);
// sheet总数
Integer sheetTotal = workbook.getNumberOfSheets();
for (Integer num = ; num < sheetTotal; num++) {
if (workbook.isSheetHidden(num)) continue;
Sheet sheet = workbook.getSheetAt(num); ExcelDO excelDO = new ExcelDO(sheet.getSheetName());
ArrayList<ArrayList<String>> itemList = new ArrayList<ArrayList<String>>(); // 设置最大列,默认为1
Integer maxColumnNum = ;
// 不是有效列集合,连续超过三行不读取后续所有列
ArrayList<Integer> noValidColumnList = new ArrayList<>();
// 列:按照列把数据填充到datatable中,防止无限列出现
for (Integer columnIndex = ; columnIndex <= maxColumnNum; columnIndex++) {
noValidColumnList.add(columnIndex);
// 列中所有数据都是null为true
Boolean isAllEmpty = true;
// 行
for (Integer rowIndex = ; rowIndex <= sheet.getLastRowNum(); rowIndex++) {
if (columnIndex == )
itemList.add(new ArrayList<String>());
Row itemRow = sheet.getRow(rowIndex);
if (itemRow == null) continue;
maxColumnNum = maxColumnNum < itemRow.getLastCellNum() ? itemRow.getLastCellNum() : maxColumnNum;
// 把格式转换为utf-8
String itemCellValue = StringHelper.FormatUtf8String(GetValue(itemRow, columnIndex));
if (!StringHelper.IsNullOrWhiteSpace(itemCellValue)) isAllEmpty = false;
itemList.get(rowIndex).add(columnIndex, itemCellValue);
} // 当前列有值
if (!isAllEmpty)
noValidColumnList.clear();
// 连续空白列超过三行 或 有空白行且当前行为最后一行
else if (noValidColumnList.size() > || (noValidColumnList.size() > && columnIndex == maxColumnNum - )) {
for (Integer i = noValidColumnList.size() - ; i >= ; i--)
itemList.remove(i);
break;
}
} // 得到一个sheet中有多少个合并单元格
Integer sheetMergeCount = sheet.getNumMergedRegions();
for (Integer i = ; i < sheetMergeCount; i++) {
// 获取合并后的单元格
CellRangeAddress range = sheet.getMergedRegion(i);
String cellValue = itemList.get(range.getFirstRow()).get(range.getFirstColumn());
for (Integer mRowIndex = range.getFirstRow(); mRowIndex <= range.getLastRow(); mRowIndex++) {
for (Integer mColumnIndex = range.getFirstColumn(); mColumnIndex <= range.getLastColumn(); mColumnIndex++) {
itemList.get(mRowIndex).set(mColumnIndex, cellValue);
}
}
}
excelDO.setList(itemList);
list.add(excelDO);
} return list;
} /*
* 把集合中的数据保存为excel文件
* */
public static void SaveExcel(ArrayList<ExcelDO> doList, String fileDirectoryPath) {
doList.forEach(item -> {
Workbook workbook = new HSSFWorkbook();
Sheet sheet = workbook.createSheet(item.getName());
ArrayList<ArrayList<String>> itemList = item.getList();
if (itemList != null || !itemList.isEmpty()) {
for (Integer rowNum = ; rowNum < itemList.size(); rowNum++) {
ArrayList<String> rowList = itemList.get(rowNum);
Row row = sheet.createRow(rowNum);
for (Integer columnNum = ; columnNum < rowList.size(); columnNum++) {
Cell codeCell = row.createCell(columnNum);
codeCell.setCellValue(rowList.get(columnNum));
}
}
}
String filePath = fileDirectoryPath + item.getName() + ".xls";
try {
OutputStream stream = new FileOutputStream(filePath);// 将workbook写到输出流中
workbook.write(stream);
stream.flush();
stream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
});
} // 根据文件路径,返回文档对象
public static Workbook GetWorkbook(String filePath) throws IOException {
String extension = FileHelper.GetExtension(filePath);
InputStream stream = new FileInputStream(filePath);
//HSSF提供读写Microsoft Excel XLS格式档案的功能。(97-03)
//XSSF提供读写Microsoft Excel OOXML XLSX格式档案的功能。
//HWPF提供读写Microsoft Word DOC格式档案的功能。
//HSLF提供读写Microsoft PowerPoint格式档案的功能。
//HDGF提供读Microsoft Visio格式档案的功能。
//HPBF提供读Microsoft Publisher格式档案的功能。
//HSMF提供读Microsoft Outlook格式档案的功能。
switch (extension) {
case "xls":
return new HSSFWorkbook(stream);
case "xlsx":
case "xlsm":
return new XSSFWorkbook(stream);
}
//抛出自定的业务异常
throw new Error("excel格式文件错误");
} /*
* poi特殊日期格式:数字格式化成-yyyy年MM月dd日,格式
* */
private static ArrayList<String> PoiDateList = new ArrayList<String>() {
{
add("年");
add("月");
add("日");
}
}; /// <summary>
/// 获取XSSFRow的值(全部统一转成字符串)
/// </summary>
/// <param name="row"></param>
/// <param name="index"></param>
/// <returns></returns>
public static String GetValue(Row row, int index) {
Cell rowCell = row.getCell(index);
return rowCell == null ? "" : GetValueByCellStyle(rowCell, rowCell.getCellType());
} /// <summary>
/// 根据单元格的类型获取单元格的值
/// </summary>
/// <param name="rowCell"></param>
/// <param name="type"></param>
/// <returns></returns>
public static String GetValueByCellStyle(Cell rowCell, int rowCellType) {
String value = "";
switch (rowCellType) {
case Cell.CELL_TYPE_STRING:
value = rowCell.getStringCellValue();
break;
case Cell.CELL_TYPE_NUMERIC:
// 获取单元格值的格式化信息
String dataFormat = rowCell.getCellStyle().getDataFormatString();
// 判断格式化信息中是否存在:年月日
AtomicReference<Boolean> isDate = new AtomicReference<>(false);
if (!StringHelper.IsNullOrWhiteSpace(dataFormat))
PoiDateList.forEach(x -> isDate.set(isDate.get() || dataFormat.contains(x))); if (DateUtil.isCellDateFormatted(rowCell)) {
value = new SimpleDateFormat("yyyy-MM-dd").format(DateUtil.getJavaDate(rowCell.getNumericCellValue()));
} else if (DateUtil.isCellInternalDateFormatted(rowCell)) {
value = new SimpleDateFormat("yyyy-MM-dd").format(DateUtil.getJavaDate(rowCell.getNumericCellValue()));
}
//有些情况,时间搓?数字格式化显示为时间,不属于上面两种时间格式
else if (isDate.get()) {
value = new SimpleDateFormat("yyyy-MM-dd").format(rowCell.getDateCellValue());
}
//有些情况,时间搓?数字格式化显示为时间,不属于上面两种时间格式
else if (dataFormat == null) {
value = new SimpleDateFormat("yyyy-MM-dd").format(DateUtil.getJavaDate(rowCell.getNumericCellValue()));
} else {
if (StringHelper.IsNullOrWhiteSpace(dataFormat)) {
value = String.valueOf(rowCell.getNumericCellValue());
} else {
if (rowCell.getCellStyle().getDataFormatString().contains("$")) {
value = "$" + rowCell.getNumericCellValue();
} else if (rowCell.getCellStyle().getDataFormatString().contains("¥")) {
value = "¥" + rowCell.getNumericCellValue();
} else if (rowCell.getCellStyle().getDataFormatString().contains("¥")) {
value = "¥" + rowCell.getNumericCellValue();
} else if (rowCell.getCellStyle().getDataFormatString().contains("€")) {
value = "€" + String.valueOf(rowCell.getNumericCellValue());
} else {
value = String.valueOf(rowCell.getNumericCellValue());
}
}
}
break;
case Cell.CELL_TYPE_BOOLEAN:
value = String.valueOf(rowCell.getBooleanCellValue());
break;
case Cell.CELL_TYPE_ERROR:
value = ErrorEval.getText(rowCell.getErrorCellValue());
break;
case Cell.CELL_TYPE_FORMULA:
// TODO: 是否存在 嵌套 公式类型
value = GetValueByCellStyle(rowCell, rowCell.getCachedFormulaResultType());
String cellvalue = String.valueOf(rowCell.getCellFormula());
break;
default:
System.out.println(rowCell);
break;
}
return value;
}
}

StringHelper

import java.io.UnsupportedEncodingException;

public class StringHelper {
/*
把特殊字符转换为utf-8格式
*/
public static String FormatUtf8String(String str) throws UnsupportedEncodingException {
if (IsNullOrWhiteSpace(str)) return "";
String newStr = changeCharset(str, "utf-8").trim();
return newStr;
} /**
* 字符串编码转换的实现方法
*
* @param str 待转换编码的字符串
* @param newCharset 目标编码
* @return
* @throws UnsupportedEncodingException
*/
public static String changeCharset(String str, String newCharset) throws UnsupportedEncodingException {
if (IsNullOrWhiteSpace(str)) return "";
//用默认字符编码解码字符串。
byte[] bs = str.getBytes();
//用新的字符编码生成字符串
return new String(bs, newCharset);
} /*
判断字符是否为空,为空返回true
*/
public static boolean IsNullOrWhiteSpace(String str) {
return str == null || str.isEmpty() ? true : false;
}
}
FileHelper
import java.io.File;

public class FileHelper {
// 返回指定的路径字符串的扩展名,不包含“。”,转小写
public static String GetExtension(String filePath) {
File file = new File(filePath);
String fileName = file.getName();
return fileName.substring(fileName.lastIndexOf(".") + , fileName.length()).toLowerCase();
}
}

JAVA poi 帮助类的更多相关文章

  1. java poi 获取单元格值时间

    完整帮助类:JAVA poi 帮助类 /* * poi特殊日期格式:数字格式化成-yyyy年MM月dd日,格式 * */ private static ArrayList<String> ...

  2. 在java poi导入Excel通用工具类示例详解

    转: 在java poi导入Excel通用工具类示例详解 更新时间:2017年09月10日 14:21:36   作者:daochuwenziyao   我要评论   这篇文章主要给大家介绍了关于在j ...

  3. java poi操作excel 添加 锁定单元格保护

    Excel的book保护是很常用的,主要是不想让别人修改Excel的时候用.这样能够避免恶意随便修改数据,提高数据的可信度. 下面介绍JAVA POI来实现设置book保护: 使用HSSFSheet类 ...

  4. 重构:以Java POI 导出EXCEL为例

    重构 开头先抛出几个问题吧,这几个问题也是<重构:改善既有代码的设计>这本书第2章的问题. 什么是重构? 为什么要重构? 什么时候要重构? 接下来就从这几个问题出发,通过这几个问题来系统的 ...

  5. java poi 操作ppt

    java poi 操作ppt 可以参考: https://www.w3cschool.cn/apache_poi_ppt/apache_poi_ppt_installation.html http:/ ...

  6. 【Java POI】1、Java POI的使用

    很多时候,一个软件应用程序需要生成Microsoft Excel文件格式的报告.有时,一个应用程序甚至希望将Excel文件作为输入数据.例如,一个公司开发的应用程序将财务部门需要所有输出生成自己的Ex ...

  7. JAVA POI的使用

    最近开发遇到了要通过Java处理Excel文件的场景,于是乎在网上了解了一番,最后自己做了个demo,已上传gitee:https://gitee.com/github-26930945/JavaCo ...

  8. java自定义注解类

    一.前言 今天阅读帆哥代码的时候,看到了之前没有见过的新东西, 比如java自定义注解类,如何获取注解,如何反射内部类,this$0是什么意思? 于是乎,学习并整理了一下. 二.代码示例 import ...

  9. 基础知识(05) -- Java中的类

    Java中的类 1.类的概念 2.类中的封装 3.对象的三大特征 4.对象状态 5.类与类之间的关系 ------------------------------------------------- ...

随机推荐

  1. 并查集:POJ 1182 食物链 复习

    #include <iostream> #include <algorithm> #include <cstring> #include <cstdlib&g ...

  2. Flex 笔记整理 三

    1. Panel, TitleWindow PopUpManager 透明 用一个类,这个类里引用一个组件, P如 Panel, TitleWindow等, 利用PopUpManager来弹出显示.  ...

  3. A*算法改进——Any-Angle Path Planning的Theta*算法与Lazy Theta*算法

    本文是该篇文章的归纳http://aigamedev.com/open/tutorial/lazy-theta-star/#Nash:07 . 传统的A*算法中,寻找出来的路径只能是沿着给出的模型(比 ...

  4. Anaconda+django写出第一个web app(九)

    今天来学习外键的使用,用外键来连接数据库中的两个表. 当我们的tutorials非常多的时候,目前的显示方式就会使得页面非常凌乱.我们可以考虑把这些教程分为不同的系列,页面只显示标题以及概要等信息,进 ...

  5. Spark笔记之DataFrameNaFunctions

    DataFrameNaFunctions用来对DataFrame中值为null或NaN的列做处理,处理分为三种类型: drop:根据条件丢弃含有null或NaN的行 fill:根据条件使用指定值填充值 ...

  6. ssh-copy-id 复制公钥到远程server

    ssh-copy-id -i ~/.ssh/mykey.pub user@host 复制完成后可以测试: ssh -i ~/.ssh/mykey user@host

  7. mysql区间范围查询问题

    一,日期区间查询,表里有一个时间字段 最常见的就是某时间段查询,比如xxxx时间---xxxx时间有多少条数据.例如数据库里的字段是 income_period, 该字段类型可以是字符串(varcha ...

  8. Linux常见问题总结【转】

    作为一名合格的 Linux 运维工程师,一定要有一套清晰.明确的解决故障思路,当问题出现时,才能迅速定位.解决问题,这里给出一个处理问题的一般思路: 重视报错提示信息:每个错误的出现,都是给出错误提示 ...

  9. lvs+keepalived+nginx实现高性能负载均衡集群【转】

    转自 lvs+keepalived+nginx实现高性能负载均衡集群 - 青衫lys - 博客园http://www.cnblogs.com/liuyisai/p/5990645.html 一.为什么 ...

  10. 2012 Dhaka

    2012 Dhaka B - Wedding of Sultan 题目描述:给出一棵树的\(dfs\)序(只要经过就会记录),求每个点的度 solution 按\(dfs\)序的规则还原这棵树就好了. ...