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. Facebook人工智能实验室的前世今生

    Facebook人工智能实验室的前世今生 是时候停止把Facebook当作纯粹的社交媒体公司来看了.它用无人机提供互联网服务,为了发展虚拟现实而收购Oculus,不懈追求人工智能,Facebook已经 ...

  2. dedecms织梦让channelartlist标签支持currentstyle属性

    打开include\taglib\channelartlist.lib.php  大约93行 找到: $pv->Fields['typeurl'] = GetOneTypeUrlA($typei ...

  3. JavaScript 获取 flash 对象

    关于js获取flash对象,网上有非常多的例子,我也尝试了不少方法. 虽然都能用,但是没有我最想要的东西, 后来看了下百度的,虽然很规范,各种情况都考虑到了,但是代码量却不是不容乐观, 前前后后将近2 ...

  4. Flex 程序执行顺序!

    Flex 执行加载过程会有几个概念:preloader, SystemManager, Flex Application! flex 界面初始化时,看到的 Loading 加载条,那是 flex 自动 ...

  5. 【NOI】2017 蚯蚓排队(BZOJ 4943,LOJ 2303) 模拟+hash

    [题目]#2303. 「NOI2017」蚯蚓排队 [题意]给定n条长度不超过6的蚯蚓,初始各自在一个队伍.m次操作:1.将i号蚯蚓和j号蚯蚓的队伍合并(保证i为队尾,j为队首).2.将i号蚯蚓和它后面 ...

  6. 编写安全的API接口

    HTTPS接口参数加密签名设计思路 数名 类型 必选 描述 _appid string 是 调用方身份ID,接口提供方用此来识别调不同的调用者,该参数是API基本规范的一部分,请详见API公共规范. ...

  7. 第8月第19天 django rest

    1. def retrieve(self, request, pk=None): try: book = Book.objects.get(book_id=pk) except Book.DoesNo ...

  8. Tesseract-OCR 3.05 多过语言文字识别(运行程序+中英日韩语言包)

    最新版本 静态编译 tesseract 3.05.00dev leptonica-1.73 libgif 5.1.3 : libjpeg 8c : libpng 1.6.16 : libtiff 3. ...

  9. centos:SSH登录时间很慢

      vi /etc/ssh/sshd_config   GSSAPIAuthentication 改为 no 开启UseDNS,值改为 no   service sshd restart

  10. SqlServer 中查询子节对应的上级自定义函数

    CREATE FUNCTION [dbo].[FN_TopGetOrgByUserName] ( @UserName NVARCHAR(128) ) RETURNS @showOrg TABLE(id ...