import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.DataFormat;
import org.apache.poi.ss.usermodel.Font;
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.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
/**
*
* Excel 工具类
*
* @author zhangyi
* @version 1.0 2016/01/27
*
*/
public class ExcelUtil {
private Workbook workbook;
private OutputStream os;
private String pattern; // 日期格式
public void setPattern(String pattern) {
this.pattern = pattern;
}
public ExcelUtil(Workbook workboook) {
this.workbook = workboook;
}
public ExcelUtil(InputStream is, String version) throws FileNotFoundException, IOException {
if ("2003".equals(version)) {
workbook = new HSSFWorkbook(is);
} else {
workbook = new XSSFWorkbook(is);
}
}
public String toString() {
return "共有 " + getSheetCount() + "个sheet 页!";
}
public String toString(int sheetIx) throws IOException {
return "第 " + (sheetIx + 1)
+ "个sheet 页,名称: "
+ getSheetName(sheetIx)
+ ",共 " + getRowCount(sheetIx) + "行!";
}
/**
*
* 根据后缀判断是否为 Excel 文件,后缀匹配xls和xlsx
*
* @param pathname
* @return
*
*/
public static boolean isExcel(String pathname) {
if (pathname == null) {
return false;
}
return pathname.endsWith(".xls") || pathname.endsWith(".xlsx");
}
/**
*
* 读取 Excel 第一页所有数据
*
* @return
* @throws Exception
*
*/
public List < List < String >> read() throws Exception {
return read(0, 0, getRowCount(0) - 1);
}
/**
*
* 读取指定sheet 页所有数据
*
* @param sheetIx
* 指定 sheet 页,从 0 开始
* @return
* @throws Exception
*/
public List < List < String >> read(int sheetIx) throws Exception {
return read(sheetIx, 0, getRowCount(sheetIx) - 1);
}
/**
*
* 读取指定sheet 页指定行数据
*
* @param sheetIx
* 指定 sheet 页,从 0 开始
* @param start
* 指定开始行,从 0 开始
* @param end
* 指定结束行,从 0 开始
* @return
* @throws Exception
*/
public List < List < String >> read(int sheetIx, int start, int end) throws Exception {
Sheet sheet = workbook.getSheetAt(sheetIx);
List < List < String >> list = new ArrayList < List < String >> ();
if (end > getRowCount(sheetIx)) {
end = getRowCount(sheetIx);
}
int cols = sheet.getRow(0).getLastCellNum(); // 第一行总列数
for (int i = start; i <= end; i++) {
List < String > rowList = new ArrayList < String > ();
Row row = sheet.getRow(i);
for (int j = 0; j < cols; j++) {
if (row == null) {
rowList.add(null);
continue;
}
rowList.add(getCellValueToString(row.getCell(j)));
}
list.add(rowList);
}
return list;
}
/**
*
* 将数据写入到 Excel 默认第一页中,从第1行开始写入
*
* @param rowData
* 数据
* @return
* @throws IOException
*
*/
public boolean write(List < List < String >> rowData) throws IOException {
return write(0, rowData, 0);
}
/**
*
* 将数据写入到 Excel 新创建的 Sheet 页
*
* @param rowData
* 数据
* @param sheetName
* 长度为1-31,不能包含后面任一字符: :\ / ? * [ ]
* @return
* @throws IOException
*/
public boolean write(List < List < String >> rowData, String sheetName, boolean isNewSheet) throws IOException {
Sheet sheet = null;
if (isNewSheet) {
sheet = workbook.createSheet(sheetName);
} else {
sheet = workbook.createSheet();
}
int sheetIx = workbook.getSheetIndex(sheet);
return write(sheetIx, rowData, 0);
}
/**
*
* 将数据追加到sheet页最后
*
* @param rowData
* 数据
* @param sheetIx
* 指定 Sheet 页,从 0 开始
* @param isAppend
* 是否追加,true 追加,false 重置sheet再添加
* @return
* @throws IOException
*/
public boolean write(int sheetIx, List < List < String >> rowData, boolean isAppend) throws IOException {
if (isAppend) {
return write(sheetIx, rowData, getRowCount(sheetIx));
} else { // 清空再添加
clearSheet(sheetIx);
return write(sheetIx, rowData, 0);
}
}
/**
*
* 将数据写入到 Excel 指定 Sheet 页指定开始行中,指定行后面数据向后移动
*
* @param rowData
* 数据
* @param sheetIx
* 指定 Sheet 页,从 0 开始
* @param startRow
* 指定开始行,从 0 开始
* @return
* @throws IOException
*/
public boolean write(int sheetIx, List < List < String >> rowData, int startRow) throws IOException {
Sheet sheet = workbook.getSheetAt(sheetIx);
int dataSize = rowData.size();
if (getRowCount(sheetIx) > 0) { // 如果小于等于0,则一行都不存在
sheet.shiftRows(startRow, getRowCount(sheetIx), dataSize);
}
for (int i = 0; i < dataSize; i++) {
Row row = sheet.createRow(i + startRow);
for (int j = 0; j < rowData.get(i).size(); j++) {
Cell cell = row.createCell(j);
cell.setCellValue(rowData.get(i).get(j) + "");
}
}
return true;
}
/**
*
* 设置cell 样式
*
* @param sheetIx
* 指定 Sheet 页,从 0 开始
* @param colIndex
* 指定列,从 0 开始
* @return
* @throws IOException
*/
public boolean setStyle(int sheetIx, int rowIndex, int colIndex, CellStyle style) throws IOException {
Sheet sheet = workbook.getSheetAt(sheetIx);
// sheet.autoSizeColumn(colIndex, true);// 设置列宽度自适应
sheet.setColumnWidth(colIndex, 4000);
Cell cell = sheet.getRow(rowIndex).getCell(colIndex);
cell.setCellStyle(style);
return true;
}
/**
*
* 设置样式
*
* @param type
* 1:标题 2:第一行
* @return
*/
public CellStyle makeStyle(int type) {
CellStyle style = workbook.createCellStyle();
DataFormat format = workbook.createDataFormat();
style.setDataFormat(format.getFormat("@")); // // 内容样式 设置单元格内容格式是文本
style.setAlignment(CellStyle.ALIGN_CENTER); // 内容居中
// style.setBorderTop(CellStyle.BORDER_THIN);// 边框样式
// style.setBorderRight(CellStyle.BORDER_THIN);
// style.setBorderBottom(CellStyle.BORDER_THIN);
// style.setBorderLeft(CellStyle.BORDER_THIN);
Font font = workbook.createFont(); // 文字样式
if (type == 1) {
// style.setFillForegroundColor(HSSFColor.LIGHT_BLUE.index);//颜色样式
// 前景颜色
// style.setFillBackgroundColor(HSSFColor.LIGHT_BLUE.index);//背景色
// style.setFillPattern(CellStyle.ALIGN_FILL);// 填充方式
font.setBold(true);
font.setFontHeight((short) 500);
}
if (type == 2) {
font.setBold(true);
font.setFontHeight((short) 300);
}
style.setFont(font);
return style;
}
/**
*
* 合并单元格
*
* @param sheetIx
* 指定 Sheet 页,从 0 开始
* @param firstRow
* 开始行
* @param lastRow
* 结束行
* @param firstCol
* 开始列
* @param lastCol
* 结束列
*/
public void region(int sheetIx, int firstRow, int lastRow, int firstCol, int lastCol) {
Sheet sheet = workbook.getSheetAt(sheetIx);
sheet.addMergedRegion(new CellRangeAddress(firstRow, lastRow, firstCol, lastCol));
}
/**
*
* 指定行是否为空
*
* @param sheetIx
* 指定 Sheet 页,从 0 开始
* @param rowIndex
* 指定开始行,从 0 开始
* @return true 不为空,false 不行为空
* @throws IOException
*/
public boolean isRowNull(int sheetIx, int rowIndex) throws IOException {
Sheet sheet = workbook.getSheetAt(sheetIx);
return sheet.getRow(rowIndex) == null;
}
/**
*
* 创建行,若行存在,则清空
*
* @param sheetIx
* 指定 sheet 页,从 0 开始
* @param rownum
* 指定创建行,从 0 开始
* @return
* @throws IOException
*/
public boolean createRow(int sheetIx, int rowIndex) throws IOException {
Sheet sheet = workbook.getSheetAt(sheetIx);
sheet.createRow(rowIndex);
return true;
}
/**
*
* 指定单元格是否为空
*
* @param sheetIx
* 指定 Sheet 页,从 0 开始
* @param rowIndex
* 指定开始行,从 0 开始
* @param colIndex
* 指定开始列,从 0 开始
* @return true 行不为空,false 行为空
* @throws IOException
*/
public boolean isCellNull(int sheetIx, int rowIndex, int colIndex) throws IOException {
Sheet sheet = workbook.getSheetAt(sheetIx);
if (!isRowNull(sheetIx, rowIndex)) {
return false;
}
Row row = sheet.getRow(rowIndex);
return row.getCell(colIndex) == null;
}
/**
*
* 创建单元格
*
* @param sheetIx
* 指定 sheet 页,从 0 开始
* @param rowIndex
* 指定行,从 0 开始
* @param colIndex
* 指定创建列,从 0 开始
* @return true 列为空,false 行不为空
* @throws IOException
*/
public boolean createCell(int sheetIx, int rowIndex, int colIndex) throws IOException {
Sheet sheet = workbook.getSheetAt(sheetIx);
Row row = sheet.getRow(rowIndex);
row.createCell(colIndex);
return true;
}
/**
* 返回sheet 中的行数
*
*
* @param sheetIx
* 指定 Sheet 页,从 0 开始
* @return
*/
public int getRowCount(int sheetIx) {
Sheet sheet = workbook.getSheetAt(sheetIx);
if (sheet.getPhysicalNumberOfRows() == 0) {
return 0;
}
return sheet.getLastRowNum() + 1;
}
/**
*
* 返回所在行的列数
*
* @param sheetIx
* 指定 Sheet 页,从 0 开始
* @param rowIndex
* 指定行,从0开始
* @return 返回-1 表示所在行为空
*/
public int getColumnCount(int sheetIx, int rowIndex) {
Sheet sheet = workbook.getSheetAt(sheetIx);
Row row = sheet.getRow(rowIndex);
return row == null ? -1 : row.getLastCellNum();
}
/**
*
* 设置row 和 column 位置的单元格值
*
* @param sheetIx
* 指定 Sheet 页,从 0 开始
* @param rowIndex
* 指定行,从0开始
* @param colIndex
* 指定列,从0开始
* @param value
* 值
* @return
* @throws IOException
*/
public boolean setValueAt(int sheetIx, int rowIndex, int colIndex, String value) throws IOException {
Sheet sheet = workbook.getSheetAt(sheetIx);
sheet.getRow(rowIndex).getCell(colIndex).setCellValue(value);
return true;
}
/**
*
* 返回 row 和 column 位置的单元格值
*
* @param sheetIx
* 指定 Sheet 页,从 0 开始
* @param rowIndex
* 指定行,从0开始
* @param colIndex
* 指定列,从0开始
* @return
*
*/
public String getValueAt(int sheetIx, int rowIndex, int colIndex) {
Sheet sheet = workbook.getSheetAt(sheetIx);
return getCellValueToString(sheet.getRow(rowIndex).getCell(colIndex));
}
/**
*
* 重置指定行的值
*
* @param rowData
* 数据
* @param sheetIx
* 指定 Sheet 页,从 0 开始
* @param rowIndex
* 指定行,从0开始
* @return
* @throws IOException
*/
public boolean setRowValue(int sheetIx, List < String > rowData, int rowIndex) throws IOException {
Sheet sheet = workbook.getSheetAt(sheetIx);
Row row = sheet.getRow(rowIndex);
for (int i = 0; i < rowData.size(); i++) {
row.getCell(i).setCellValue(rowData.get(i));
}
return true;
}
/**
*
* 返回指定行的值的集合
*
* @param sheetIx
* 指定 Sheet 页,从 0 开始
* @param rowIndex
* 指定行,从0开始
* @return
*/
public List < String > getRowValue(int sheetIx, int rowIndex) {
Sheet sheet = workbook.getSheetAt(sheetIx);
Row row = sheet.getRow(rowIndex);
List < String > list = new ArrayList < String > ();
if (row == null) {
list.add(null);
} else {
for (int i = 0; i < row.getLastCellNum(); i++) {
list.add(getCellValueToString(row.getCell(i)));
}
}
return list;
}
/**
*
* 返回列的值的集合
*
* @param sheetIx
* 指定 Sheet 页,从 0 开始
* @param rowIndex
* 指定行,从0开始
* @param colIndex
* 指定列,从0开始
* @return
*/
public List < String > getColumnValue(int sheetIx, int rowIndex, int colIndex) {
Sheet sheet = workbook.getSheetAt(sheetIx);
List < String > list = new ArrayList < String > ();
for (int i = rowIndex; i < getRowCount(sheetIx); i++) {
Row row = sheet.getRow(i);
if (row == null) {
list.add(null);
continue;
}
list.add(getCellValueToString(sheet.getRow(i).getCell(colIndex)));
}
return list;
}
/**
*
* 获取excel 中sheet 总页数
*
* @return
*/
public int getSheetCount() {
return workbook.getNumberOfSheets();
}
public void createSheet() {
workbook.createSheet();
}
/**
*
* 设置sheet名称,长度为1-31,不能包含后面任一字符: :\ / ? * [ ]
*
* @param sheetIx
* 指定 Sheet 页,从 0 开始,//
* @param name
* @return
* @throws IOException
*/
public boolean setSheetName(int sheetIx, String name) throws IOException {
workbook.setSheetName(sheetIx, name);
return true;
}
/**
*
* 获取 sheet名称
*
* @param sheetIx
* 指定 Sheet 页,从 0 开始
* @return
* @throws IOException
*/
public String getSheetName(int sheetIx) throws IOException {
Sheet sheet = workbook.getSheetAt(sheetIx);
return sheet.getSheetName();
}
/**
* 获取sheet的索引,从0开始
*
* @param name
* sheet 名称
* @return -1表示该未找到名称对应的sheet
*/
public int getSheetIndex(String name) {
return workbook.getSheetIndex(name);
}
/**
*
* 删除指定sheet
*
* @param sheetIx
* 指定 Sheet 页,从 0 开始
* @return
* @throws IOException
*/
public boolean removeSheetAt(int sheetIx) throws IOException {
workbook.removeSheetAt(sheetIx);
return true;
}
/**
*
* 删除指定sheet中行,改变该行之后行的索引
*
* @param sheetIx
* 指定 Sheet 页,从 0 开始
* @param rowIndex
* 指定行,从0开始
* @return
* @throws IOException
*/
public boolean removeRow(int sheetIx, int rowIndex) throws IOException {
Sheet sheet = workbook.getSheetAt(sheetIx);
sheet.shiftRows(rowIndex + 1, getRowCount(sheetIx), -1);
Row row = sheet.getRow(getRowCount(sheetIx) - 1);
sheet.removeRow(row);
return true;
}
/**
*
* 设置sheet 页的索引
*
* @param sheetname
* Sheet 名称
* @param pos
* Sheet 索引,从0开始
*/
public void setSheetOrder(String sheetname, int sheetIx) {
workbook.setSheetOrder(sheetname, sheetIx);
}
/**
*
* 清空指定sheet页(先删除后添加并指定sheetIx)
*
* @param sheetIx
* 指定 Sheet 页,从 0 开始
* @return
* @throws IOException
*/
public boolean clearSheet(int sheetIx) throws IOException {
String sheetname = getSheetName(sheetIx);
removeSheetAt(sheetIx);
workbook.createSheet(sheetname);
setSheetOrder(sheetname, sheetIx);
return true;
}
public Workbook getWorkbook() {
return workbook;
}
/**
*
* 关闭流
*
* @throws IOException
*/
public void close() throws IOException {
if (os != null) {
os.close();
}
workbook.close();
}
/**
*
* 转换单元格的类型为String 默认的 <br>
* 默认的数据类型:CELL_TYPE_BLANK(3), CELL_TYPE_BOOLEAN(4),
* CELL_TYPE_ERROR(5),CELL_TYPE_FORMULA(2), CELL_TYPE_NUMERIC(0),
* CELL_TYPE_STRING(1)
*
* @param cell
* @return
*
*/
private String getCellValueToString(Cell cell) {
String strCell = "";
if (cell == null) {
return null;
}
switch (cell.getCellType()) {
case Cell.CELL_TYPE_BOOLEAN:
strCell = String.valueOf(cell.getBooleanCellValue());
break;
case Cell.CELL_TYPE_NUMERIC:
if (HSSFDateUtil.isCellDateFormatted(cell)) {
Date date = cell.getDateCellValue();
if (pattern != null) {
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
strCell = sdf.format(date);
} else {
strCell = date.toString();
}
break;
}
// 不是日期格式,则防止当数字过长时以科学计数法显示
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
strCell = cell.toString();
break;
case Cell.CELL_TYPE_STRING:
strCell = cell.getStringCellValue();
break;
default:
break;
}
return strCell;
}
}

转载自:https://blog.csdn.net/qq_23994787/article/details/78735661

关于Excel导入导出POI工具类的更多相关文章

  1. JAVA Excel导入导出

    --------------------------------------------方式一(新)-------------------------------------------------- ...

  2. 一个基于POI的通用excel导入导出工具类的简单实现及使用方法

    前言: 最近PM来了一个需求,简单来说就是在录入数据时一条一条插入到系统显得非常麻烦,让我实现一个直接通过excel导入的方法一次性录入所有数据.网上关于excel导入导出的例子很多,但大多相互借鉴. ...

  3. java简易excel导入导出工具(封装POI)

    Octopus 如何导入excel 如何导出excel github项目地址 Octopus Octopus 是一个简单的java excel导入导出工具. 如何导入excel 下面是一个excel文 ...

  4. Java基础学习总结(49)——Excel导入导出工具类

    在项目的pom文件中引入 <dependency> <groupId>net.sourceforge.jexcelapi</groupId> <artifac ...

  5. Octopus——excel导入导出工具

    Octopus Octopus是一个简易的Excel导入导出工具.目前主要就两个功能: 导入:将excel中一行数据转换为指定的java对象,并通过指定的正则表达式检查合法性. 导出:按照给定的xml ...

  6. poi excel导入导出

    pom <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artif ...

  7. Java之POI的excel导入导出

    一.Apache POI是一种流行的API,它允许程序员使用Java程序创建,修改和显示MS Office文件.这由Apache软件基金会开发使用Java分布式设计或修改Microsoft Offic ...

  8. Excel导入导出工具(简单、好用且轻量级的海量Excel文件导入导出解决方案.)

    Excel导入导出工具(简单.好用且轻量级的海量Excel文件导入导出解决方案.) 置顶 2019-09-07 16:47:10 $9420 阅读数 261更多 分类专栏: java   版权声明:本 ...

  9. 基于 POI 封装 ExcelUtil 精简的 Excel 导入导出

    注 本文是使用 org.apache.poi 进行一次简单的封装,适用于大部分 excel 导入导出功能.过程中可能会用到反射,如若有对于性能有极致强迫症的同学,看看就好. 序 由于 poi 本身只是 ...

随机推荐

  1. poj2342 Anniversary party (树形dp)

    poj2342 Anniversary party (树形dp) Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9128   ...

  2. hdoj Radar Installation

    Problem Description Assume the coasting is an infinite straight line. Land is in one side of coastin ...

  3. bzoj 3209 花神的数论题 —— 数位DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3209 算是挺简单的数位DP吧,但还是花了好久才弄明白... 又参考了博客:https://b ...

  4. 杂项-人物:Alan cooper

    ylbtech-杂项-人物:Alan cooper Alan Cooper ,“VB之父”“交互设计之父”,荣获视窗先锋奖(Microsoft Windows Pioneer)和软件梦幻奖(Softw ...

  5. XML案例(使用DOM4J解析XML文档)

    1.Demo1.java package cn.itcast.dom4j; import java.io.File;import java.io.FileOutputStream;import jav ...

  6. E20170907-ts

    flash  vt. 使闪光,使闪烁; 拍出,发出(电报等); 〈口〉炫耀;          adj. 闪光的,闪耀的,一闪而过的; 浮华的; 庞大的;           n. 闪光; 闪光灯下摄 ...

  7. 【钓起来的tips系列】

    一.求n的阶乘: #include<bits/stdc++.h> using namespace std; int n; int jc(int k) { ); )*k; } /*int j ...

  8. js数据管理的思考

    最近要做一个农场项目,涉及到很多js数据管理的需求,这里也做下总结,不断的总结,再修正内容,也是快速进步的方法. 数据管理几个方面考虑: * 设置(更新)字段值 * 检索,根据id, index, 属 ...

  9. 全局设置border-box

    全局设置 border-box 很好,更符合我们通常对一个「盒子」尺寸的认知.,其次它可以省去一次又一次的加加减减,它还有一个关键作用——让有边框的盒子正常使用百分比宽度.但是使用了 border-b ...

  10. servlet-后台获取form表单传的参数

    前台代码: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> & ...