对 Excel 进行读写操作是生产环境下常见的业务,网上搜索的实现方式都是基于POI和JXL第三方框架,但都不是很全面。小编由于这两天刚好需要用到,于是就参考手写了一个封装操作工具,基本涵盖了Excel表(分有表头和无表头)的创建,并对它们进行读写操作。为方便大家,有需要者可以点击文后点解下载直接使用哦,当然也可以根据自己需求举一反三自己定制,相信对于聪明的你也不是什么难事。话不多说,直接贴源码

pom.xml 文件:

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties> <dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.8.0-beta2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.8.0-beta2</version>
</dependency>
</dependencies>

建表工具类:ExcelBuider.java

 /**
* 建表工具类
* @author Sherman
* email:1253950375@qq.com
* created in 2018/8/24
*/
@Slf4j
public class ExcelBuilder { private static HSSFSheet sheet;
private static HSSFWorkbook wb;
private static boolean hasHeader; /**
* 初始化
* @param excellName 表名
*/
public ExcelBuilder(String excellName) {
wb = new HSSFWorkbook();
sheet = wb.createSheet(excellName);
} /**
* 设置表头,装配表头数据
* @param value 字符串数组,用来作为表头的值
*
*/
public ExcelBuilder header(String... value) {
if (value != null && value.length != 0) {
//设置表头样式
HSSFCellStyle cellStyle = wb.createCellStyle();
cellStyle.setFont(font("黑体", true, 12));
HSSFRow row = sheet.createRow(0);
for (int i = 0; i < value.length; i++) {
HSSFCell cell = row.createCell(i);
cell.setCellValue(value[i]);
cell.setCellStyle(cellStyle);
}
hasHeader = true;
}
return this;
} /**
* excel 表内容装配
* @param content 待装配表格内容的二维数组
* @return
*/
public ExcelBuilder content(List<List<Object>> content) {
if (content != null && !content.isEmpty()) {
int index;
for (int i = 0; i < content.size(); i++) {
index = hasHeader == false ? i : i + 1;
HSSFRow row = sheet.createRow(index);
for (int j = 0; j < content.get(i).size(); j++) {
String r = "";
Object value = content.get(i).get(j);
//根据数据类型装配
if (value instanceof String) {
r = (String) value;
} else if (value instanceof Number) {
r = String.valueOf(value);
} else if (value instanceof BigDecimal) {
r = String.valueOf(value);
} else {
if (!(value instanceof Date) && !(value instanceof Timestamp)) {
if (!(value instanceof ZonedDateTime) && !(value instanceof LocalDateTime)) {
if (value instanceof Enum) {
r = ((Enum) value).name();
} else if (value != null) { log.info("Error of create row, Unknow field type: " + value.getClass().getName());
}
} else {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
r = formatter.format((TemporalAccessor) value);
}
} else {
DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
r = sdf.format(value);
}
} row.createCell(j).setCellValue(r);
}
}
}
return this;
} /**
* 自动调整列宽大小
*/
public ExcelBuilder autoColumnWidth() {
for (int j = 0; j < sheet.getRow(0).getLastCellNum(); j++) {
int maxLength = 0;
for (int i = 0; i <= sheet.getLastRowNum(); i++) {
String value = sheet.getRow(i).getCell(j).getStringCellValue();
int length = 0;
if (value != null) {
length = value.getBytes().length;
}
if (length > maxLength) {
maxLength = length;
}
}
sheet.setColumnWidth(j, maxLength > 30 ? (30 * 256 + 186) : (maxLength * 256 + 186));
}
return this;
} /**
* 实例化
* @param hasHeader 是否有表头
* @return Excel表格
*/
public AbstractExcel build(Boolean hasHeader) {
return hasHeader ? new HeaderExcel(sheet) : new NoHeaderExcel(sheet);
} /**
*
* @param fontName 字体名字
* @param isBold 是否粗体
* @param fontSize 字体大小
* @return 字体
*/
private HSSFFont font(String fontName, boolean isBold, int fontSize) {
HSSFFont font = wb.createFont();
if (fontName != null) font.setFontName(fontName);
else font.setFontName("黑体");
font.setBold(isBold);
font.setFontHeightInPoints((short) fontSize);
return font;
} }

excel的抽象父类:

/**
* @author Sherman
* created in 2018/8/24
*/ public abstract class AbstractExcel {
private final HSSFSheet sheet; public AbstractExcel() {
HSSFWorkbook wb = new HSSFWorkbook();
sheet = wb.createSheet();
} public AbstractExcel(String sheetName){
HSSFWorkbook wb = new HSSFWorkbook();
sheet = wb.createSheet(sheetName);
} public AbstractExcel(HSSFSheet sheet) {
this.sheet = sheet;
} public abstract List<Map<String, String>> getPayload(); public void write(OutputStream op) throws IOException {
sheet.getWorkbook().write(op);
sheet.getWorkbook().close();
} public String getStringFormatCellValue(HSSFCell cell) {
String cellVal = "";
DecimalFormat df = new DecimalFormat("#");
switch (cell.getCellTypeEnum()) {
case STRING:
cellVal = cell.getStringCellValue();
break;
case NUMERIC:
String dataFormat = cell.getCellStyle().getDataFormatString();
if (DateUtil.isCellDateFormatted(cell)) {
cellVal = df.format(cell.getDateCellValue());
} else if ("@".equals(dataFormat)) {
cellVal = df.format(cell.getNumericCellValue());
} else {
cellVal = String.valueOf(cell.getNumericCellValue());
df = new DecimalFormat("#.#########");
cellVal = df.format(Double.valueOf(cellVal));
}
break;
case BOOLEAN:
cellVal = String.valueOf(cell.getBooleanCellValue());
break;
case FORMULA:
cellVal = String.valueOf(cell.getCellFormula());
break;
default:
cellVal = "";
}
return cellVal;
} }

有表头实现类

/**
* @author Sherman
* created in 2018/8/24
*/ public class HeaderExcel extends AbstractExcel {
private final static boolean hasHeader = true;
private final HSSFSheet sheet; public HeaderExcel(HSSFSheet sheet) {
super(sheet);
this.sheet = sheet;
} public HeaderExcel(String sheetName, String excelPath) {
HSSFWorkbook wb = null;
try {
wb = new HSSFWorkbook(new POIFSFileSystem(new FileInputStream(excelPath)));
} catch (IOException e) {
e.printStackTrace();
}
sheet = sheetName == null || sheetName.isEmpty() ? wb.getSheetAt(0) : wb.getSheet(sheetName);
} @Override
public List<Map<String, String>> getPayload() {
List<Map<String, String>> payLoad = new ArrayList<>();
HSSFRow headRow = sheet.getRow(0);
for (int i = 1; i <= sheet.getLastRowNum(); i++) {
HSSFRow currentRow = sheet.getRow(i);
Map<String, String> map = new HashMap<>();
for (int j = 0; j < sheet.getRow(i).getLastCellNum(); j++) {
map.put(getStringFormatCellValue(headRow.getCell(j)), getStringFormatCellValue(currentRow.getCell(j)));
}
payLoad.add(map);
}
return payLoad;
} }

无表头实现类

/**
* @author Sherman
* created in 2018/8/24
*/ public class NoHeaderExcel extends AbstractExcel {
private final static boolean hasHeader = false;
private HSSFSheet sheet; public NoHeaderExcel(HSSFSheet sheet) {
super(sheet);
this.sheet = sheet;
} public NoHeaderExcel(String sheetName, String excelPath) {
HSSFWorkbook wb = null;
try {
wb = new HSSFWorkbook(new POIFSFileSystem(new FileInputStream(excelPath)));
} catch (IOException e) {
e.printStackTrace();
}
sheet = sheetName == null || sheetName.isEmpty() ? wb.getSheetAt(0) : wb.getSheet(sheetName);
} @Override
public List<Map<String, String>> getPayload() {
List<Map<String, String>> payLoad = new ArrayList<>();
for (int i = 0; i < sheet.getLastRowNum(); i++) {
HSSFRow currentRow = sheet.getRow(i);
Map<String, String> map = new HashMap<>();
for (int j = 0; j <= sheet.getRow(i).getLastCellNum(); j++) {
map.put(String.valueOf(j), getStringFormatCellValue(currentRow.getCell(j)));
}
payLoad.add(map);
}
return payLoad;
} }

测试工具类:

/**
* Unit test for simple App.
*/
public class AppTest
{
/**
* 测试建表,写表操作
*/
@Test
public void testExportExcel()
{
//测试数据
String[] headers = new String[]{"A","B","C","D","E"};
List<List<Object>> valueList = new LinkedList<>();
for (char i = 'A'; i <= 'E' ; i++) {
List<Object> rowList = new LinkedList<>();
for (int j = 0; j <= 4; j++) {
rowList.add(i+String.valueOf(j));
}
valueList.add(rowList);
} AbstractExcel excel = new ExcelBuilder("报名表")
.header(headers)
.content(valueList)
.autoColumnWidth()
.build(true); try {
File file = new File("E:\\excel\\test.xls");
FileOutputStream op = new FileOutputStream(file);
excel.write(op);
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 测试读取表数据操作
*/
@Test
public void testImportExcel(){
AbstractExcel excel = new HeaderExcel(null,"E:/excel/test.xls");
List<Map<String,String>> values = excel.getPayload();
values.forEach(stringStringMap -> {
stringStringMap.entrySet().forEach(stringStringEntry -> {
System.out.println(stringStringEntry.getKey()+"---->"+stringStringEntry.getValue());
}); });
} }

附图:

测试1

测试二:

看起来效果还不错,当然还有很多不完善的地方,有需要的朋友可以在此基础上扩展定制,例如读取表数据结构方式,实现行数增删改查据或者创建表标题等等。

或者有朋友有更好的实现方案,欢迎前来交流!

最后的最后,当然忘不了附上笨工具的源码啦!

https://github.com/yumiaoxia/excel-commom-demo.git

java封装实现Excel建表读写操作的更多相关文章

  1. excel数据表透视操作

    虽然作为开发人员,很少用到office,但是在工作的时候,特别是做财务模块,或多或少都会用到excel处理数据,对比数据.比如说vlookup函数,数据透视表这些.vlookup函数我用得很熟练,但数 ...

  2. poi对excel的基本读写操作

    最近简单的弄了下poi对excel的应用,为方便自己以后的使用就把一些基本操作记录下来,其他更复杂的操作可以等以后有需求的时候再来深入了解一番! 写操作: /** * * 层次结构就是workbook ...

  3. Python Excel文件的读写操作(xlwt xlrd xlsxwriter)

    转:https://www.cnblogs.com/ultimateWorld/p/8309197.html Python语法简洁清晰,作为工作中常用的开发语言还是很强大的(废话). python关于 ...

  4. 关于ddl(新增字段)对数据库锁表|读写操作的影响_资料

    1.对一个表执行ddl(新增字段)会不会阻塞表,影响读写? 在一次项目升级之前需要执行一个新增字段的脚本(alter table...),表的数据量是260多万,执行时间是72秒,感觉略长,不知道会不 ...

  5. [python]使用xlrd对Excel表格进行读写操作

    2.1 导入模块 import xlrd 2.2 打开Excel文件读取数据 data = xlrd.open_workbook("excelFile.xls") 2.3 使用技巧 ...

  6. pandas对Excel文件的读写操作

    1.将Excel数据读为dataframe 1.1 直接读取 df = pd.read_excel('data.xlsx') 1.2 根据sheet索引 xls = pd.ExcelFile('dat ...

  7. mysql数据库建表授权操作

    1.create schema [数据库名称] default character set utf8 collate utf8_general_ci;--创建数据库 采用create schema和c ...

  8. python对excel文件的读写操作

    import xlrd,xlwt data = xlrd.open_workbook('a.xlsx') #读 table = data.sheets()[0] data_list = [] data ...

  9. java对excel文件内容读写修改操作

    Read.java package domain; import java.io.FileInputStream; import java.io.InputStream; import jxl.Cel ...

随机推荐

  1. C# System.Collections.SortedList

    using System; using System.Collections; public class SamplesSortedList { public static void Main() { ...

  2. 多线程本地图片载入演示样例【OpenCV】【Pthread】

    Pthread barrier的简单使用演示样例: C++代码例如以下: // ThreadingLoadImages.cpp : 定义控制台应用程序的入口点. // #include "s ...

  3. oracle数据库将一列的值拼接成一行,并且各个值之间用逗号隔开

    使用场景:把某一列值转换为逗号分隔的字符串 例子:比如查询所有的的表空间如下,现在要获得所有的表空间用逗号分隔的字符串(比如rman duplicate的时候skip表空间) SQL> sele ...

  4. Duplicate复制数据库并创建物理StandBy(spfile+不同实例名)

    过程和Duplicate复制数据库并创建物理StandBy类似,只是不需要重启数据库. 目的:创建standby,不重启源数据库 1设定环境如下: Primary数据库 IP 172.17.22.16 ...

  5. 最新整合maven+SSM+Tomcat 实现注册登录

    mybatis学习 http://www.mybatis.org/mybatis-3/zh/index.html Spring学习:http://blog.csdn.net/king1425/arti ...

  6. Docker linux安装

    Ubuntu下安装 sudo wget -qO- https://get.docker.com/  | shsudo usermod -aG docker imooc Centos7下安装 CentO ...

  7. 【CLR】详解CLR中的程序集

    目录结构: contents structure [+] 程序集的简介 为程序集分配强名称 如何指定程序集的版本资源信息 如何对程序集签名 全局程序集缓存 如何查看程序集的信息 强命名程序集防串改 1 ...

  8. opencv-android笔记1:android studio 2.3 + opencv-android-sdk 实现 camera预览

    Android studio环境配置不再赘述,可以参照我的其他博客. Android应用程序开发环境搭建:http://blog.csdn.net/ja33son/article/details/61 ...

  9. OpenCV 学习笔记 05 人脸检测和识别 AttributeError: module 'cv2' has no attribute 'face'

    1 环境设置: win10 python 3.6.8 opencv 4.0.1 2 尝试的方法 在学习人脸识别中,遇到了没有 cv2 中没有 face 属性.在网上找了几个方法,均没有成功解决掉该问题 ...

  10. SNF快速开发平台MVC-自由排序组件

    1.    自由排序功能使用 在一些需要排序优先级的数据进行调整处理,如民族数据,在北方实施的时候汉族比较多,希望把汉族放在第一位.在蒙古实施项目时,蒙古族人最多把蒙古族放在第一选择位. 1.1.   ...