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. centos安装lrzsz

    yum -y install lrzsz 使用rz打开上传框

  2. 第6月第10天 svn checkout sqlite3

    1. http://www.cnblogs.com/xuling/p/5602036.html 2. http://blog.csdn.net/qq_26819733/article/details/ ...

  3. Python 入门基础8 --函数基础1 定义、分类与嵌套使用

    目录 零.了解函数 一.函数的组成 二.函数的定义 三.函数的使用 四.函数的分类 五.函数的嵌套使用 零.了解函数 1.什么是函数 在程序中函数就是具备某一功能的工具 2.为何用函数 为了解决以下问 ...

  4. 一个完整的Installshield安装程序实例-转

    一个完整的Installshield安装程序实例—艾泽拉斯之海洋女神出品(一)---基本设置一 前言 Installshield可以说是最好的做安装程序的商业软件之一,不过因为功能的太过于强大,以至于 ...

  5. 【题解】BZOJ 1901: Zju2112 Dynamic Rankings

    题目传送门(权限题) 一道类似的非权限题 题意 N个数的序列,每次修改一个数或者询问区间里的第K小.可以离线. 简要做法 假如要求在线,可以树状数组套个线段树~ 但是这题是可以离线的,就可以乱搞整体二 ...

  6. ASP .Net Core系统部署到SUSE Linux Enterprise Server 12 SP3 64 具体方案

    .Net Core 部署到 SUSE Linux Enterprise Server 12 SP3 64 位中的步骤 1.安装工具 1.apache 2..Net Core(dotnet-sdk-2. ...

  7. Windows下安装Python requests模块

    在使用自己写的或者别人的python小工具时可能会出现类似ImportError: No module named Requests的问题: D:\tool\python\fuzz>Fuzz.p ...

  8. 【论文阅读】MEAL: Multi-Model Ensemble via Adversarial Learning

    转载请注明出处:https://www.cnblogs.com/White-xzx/ 原文地址:https://arxiv.org/abs/1812.02425 Github: https://git ...

  9. k8s中新建一个namespace和harborsecret的yaml文件

    注意哟, 不同的harborsecret,在不同的namespace中,是不共用的. 也就是说,如果在default名字空间中,创建了一个docker login secret, 在其它名字空间中,是 ...

  10. Vue2服务端渲染

    Vue2 服务端渲染 花费了一个月时间,终于在新养车之家项目中成功部署了vue2服务端渲染(SSR),并且使用上了Vuex 负责状态管理,首屏加载时间从之前4G网络下的1000ms,提升到了现在500 ...