参考原文:

https://www.cnblogs.com/yizhang/p/7244917.html

我改:

package test;
import java.io.File;
import java.io.FileInputStream;
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.HSSFFont;
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.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//粗体显示
font.setFontHeight((short) 500);
} if (type == 2) {
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//粗体显示
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;
} public static boolean isExcel2003(String pathname) { return pathname.endsWith(".xls");
} public static void main(String[] args) throws Exception {
String pathName = "D:/a/e/2.xlsx";
File f = new File(pathName);
InputStream in = new FileInputStream(f);
String version = isExcel2003(pathName)?"2003":"2007";
ExcelUtil excelUtil = new ExcelUtil(in, version);
//读取第一个sheet
List<List<String>> read = excelUtil.read(0);
for (int i = 0; i < read.size(); i++) {
List<String> rowList = read.get(i);
for (String s : rowList) {
System.out.println(s);
}
System.out.println();
}
} }

java里poi操作Excel工具类【我改】的更多相关文章

  1. java里poi操作excel的工具类(兼容各版本)

    转: java里poi操作excel的工具类(兼容各版本) 下面是文件内具体内容,文件下载: import java.io.FileNotFoundException; import java.io. ...

  2. 自己封装的poi操作Excel工具类

    自己封装的poi操作Excel工具类 在上一篇文章<使用poi读写Excel>中分享了一下poi操作Excel的简单示例,这次要分享一下我封装的一个Excel操作的工具类. 该工具类主要完 ...

  3. Java 借助poi操作PDF工具类

    ​ 一直以来说写一个关于Java操作PDF的工具类,也没有时间去写,今天抽空写一个简单的工具类,拥有PDF中 换行,字体大小,字体设置,字体颜色,首行缩进,居中,居左,居右,增加新一页等功能,如果需要 ...

  4. java操作excel 工具类

    java操作excel 可参考https://blog.csdn.net/xunwei0303/article/details/53213130 直接上代码: 一.java生成excel文件: pac ...

  5. 自己的包poi操作Excel工具

    在前面的文章<使用poi读写Excel>中分享了一下poi操作Excel的简单演示样例.这次要分享一下我封装的一个Excel操作的工具类. 该工具类主要完毕的功能是:读取Excel.汇总E ...

  6. java使用POI操作excel文件,实现批量导出,和导入

    一.POI的定义 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Excel 95, 97, 2000也即以.xls为后缀的excel.而poi可以操作Exc ...

  7. Java使用POI操作Excel文件

    1.简介 Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式文件读和写的功能. 2.依赖的jar包 <!-- ex ...

  8. java中文件操作的工具类

    代码: package com.lky.pojo; import java.io.BufferedReader; import java.io.BufferedWriter; import java. ...

  9. Java POI操作Excel注意点

    excel的行索引和列索引都是从0开始,而行号和列号都是从1开始 POI·操作excel基本上都是使用索引 XSSFRow对象的 row.getLastCellNum() 方法返回的是当前行最后有效列 ...

随机推荐

  1. asyncio动态添加任务

    asyncio.run_forever()下动态添加任务 方法一.asyncio.run_coroutine_threadsafe(coroutine, loop) 方法二.asyncio.call_ ...

  2. cmd 创建并写入文件

    一.建立空文件的几种方法1.cd.>a.txtcd.表示改变当前目录为当前目录,即等于没改变:而且此命令不会有输出.>表示把命令输出写入到文件.后面跟着a.txt,就表示写入到a.txt. ...

  3. <现代C++实战30讲>笔记 01 | 堆、栈、RAII:C++里该如何管理资源?

    1.堆(heap),动态分配的内存区域,分配之后需手工释放(new, delete, malloc, free) 这种方式需要分配内存,释放内存,因此可能会造成内存泄露,或者内存碎片的问题. 2.栈( ...

  4. CodeForces - 1175E Minimal Segment Cover (倍增优化dp)

    题意:给你n条线段[l,r]以及m组询问,每组询问给出一组[l,r],问至少需要取多少个线段可以覆盖[l,r]区间中所有的点. 如果贪心地做的话,可以求出“从每个左端点l出发选一条线段可以到达的最右端 ...

  5. 原生js实现简单的下拉刷新功能

    前言: 我们在浏览移动端web页面的时候,经常会用到下拉刷新. 现在我们用原生的js实现这个非常简单的下拉刷新功能. (温馨提示:本文比较基础,功能也很简单.写的不好的地方,希望大神提点一二.) 一. ...

  6. ssm框架使用详解&配置两个数据源

    学习ssm框架已经快一年了,今天把这个框架总结一下. SSM 就是指 spring.SpringMVC和Mybatis.先说一下基本概念(百度上搜的) 1.基本概念 1.1.Spring Spring ...

  7. 基于TCP的客户端、服务器端socket编程

    一.实验目的 理解tcp传输客户端服务器端通信流程 二.实验平台 MAC OS 三.实验内容 编写TCP服务器套接字程序,程序运行时服务器等待客户的连接,一旦连接成功,则显示客户的IP地址.端口号,并 ...

  8. LOJ-6284-数列分块入门8

    链接: https://loj.ac/problem/6284 题意: 给出一个长为 的数列,以及 个操作,操作涉及区间询问等于一个数 的元素,并将这个区间的所有元素改为 . 思路: 维护一个分块是否 ...

  9. VS2015安装QT插件

    下载安装完后直接重新启动vs

  10. BZOJ 4154: [Ipsc2015]Generating Synergy KDtree+dfs序

    多组数据真tm恶心~ 把 $dfs$序和深度分别看作横纵坐标,然后用 $KDtree$ 数点就可以了~ #include <cstdio> #include <cstring> ...