POI导入导出demo
开发环境
1.使用 eclipse 集成开发工具
2.基于 JDK8 开发
备注:文件内容保存到数据库和数据库表的内容读取到文件没有做.思路很简单,就是基本的CRUD操作.本demo源码没有写.
文章底部有源码链接
工具类
package cn.icanci.poi.util;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.DecimalFormat;
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.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
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.xssf.usermodel.XSSFWorkbook;
public class POIUtil {
/**
* 文件导出方法
*
* @param resources 集合类型,要导出的具体数据集合
* @param outputStream 输出流,输出的excel文件的具体位置
* @throws IOException
*/
public static void exportExcel(List resources, OutputStream outputStream) throws IOException {
// 创建一个内存Excel对象
HSSFWorkbook workbook = new HSSFWorkbook();
// 创建一个表格
HSSFSheet sheet = workbook.createSheet("sheet1");
// 创建表头
// 获取表头内容
String[] headerStr = resources.get(0);
HSSFRow headerRow = sheet.createRow(0);
// 设置列宽
for (int i = 0; i < headerStr.length; i++) {
sheet.setColumnWidth(i, 5000);
}
// 设置头单元格样式
HSSFCellStyle headerStyle = workbook.createCellStyle();
// headerStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
// 设置字体
HSSFFont headerFont = workbook.createFont();
headerFont.setColor(HSSFFont.COLOR_RED);
headerFont.setFontName("宋体");
headerStyle.setFont(headerFont);
// 定义表头内容
for (int i = 0; i < headerStr.length; i++) {
HSSFCell headerCell = headerRow.createCell(i);
headerCell.setCellStyle(headerStyle);
headerCell.setCellValue(headerStr[i]);
}
// 表体内容
for (int i = 1; i < resources.size(); i++) {
// 输出行的数据
String[] temp = resources.get(i);
// 创建行
HSSFRow bodyRow = sheet.createRow(i);
// 循环创建列
for (int j = 0; j < temp.length; j++) {
HSSFCell bodyCell = bodyRow.createCell(j);
// bodyCell.setCellStyle()
bodyCell.setCellValue(temp[j]);
}
}
// 将内存创建的excel对象,输出到文件中
workbook.write(outputStream);
}
/**
* 解析Excel 表格
*
* @param inputStream 输入流
* @param suffix 文件的后缀名
* @param startRow 从哪一行开始
* @return 返回List集合
* @throws IOException
*/
@SuppressWarnings("resource")
public static List getParseExcel(InputStream inputStream, String suffix, int startRow)
throws IOException {
// 1.定义excel对象变量
Workbook workbook = null;
// 2.判断后缀 决定如何创建具体的对象
if ("xls".equals(suffix)) {
// 2003
workbook = new HSSFWorkbook(inputStream);
} else if ("xlsx".equals(suffix)) {
// 2007
workbook = new XSSFWorkbook(inputStream);
} else {
return null;
}
// 获取工作表 excel分为若干个表
Sheet sheet = workbook.getSheetAt(0);
if (sheet == null) {
return null;
}
// 获取表格中最后一行的行号
int lastRowNum = sheet.getLastRowNum();
// 最后一行的行号大于startRow
if (lastRowNum <= startRow) {
return null;
}
List result = new ArrayList();
// 循环读取
Row row = null;
Cell cell = null;
for (int rowNum = startRow; rowNum <= lastRowNum; rowNum++) {
row = sheet.getRow(rowNum);
// 获取当前行的第一列和最后一列的标记
short firstCellNum = row.getFirstCellNum();
short lastCellNum = row.getLastCellNum();
if (firstCellNum != lastCellNum && lastCellNum != 0) {
String[] rowArray = new String[lastCellNum];
for (int cellNum = firstCellNum; cellNum < lastCellNum; cellNum++) {
cell = row.getCell(cellNum);
// 判断单元格是否有数据
if (cell == null) {
rowArray[cellNum] = null;
} else {
rowArray[cellNum] = parseCell(cell);
}
}
result.add(rowArray);
}
}
return result;
}
/**
* 解析单元格
*
* @param cell 需要解析的单元格数据
* @return 返回字符串
*/
@SuppressWarnings("deprecation")
private static String parseCell(Cell cell) {
String cellStr = null;
// 判断单元格的类型
switch (cell.getCellType()) {
// 字符串类型单元格
case STRING:
cellStr = cell.getStringCellValue();
break;
// 空数据 标准数据
case BLANK:
cellStr = "";
break;
// 数学类型 时间,日期,数字
case NUMERIC:
// 判断日期类型
if (HSSFDateUtil.isCellDateFormatted(cell)) {
// 判断具体类型 是日期还是时间
SimpleDateFormat sdf = null;
if (cell.getCellStyle().getDataFormat() == HSSFDataFormat.getBuiltinFormat("h:mm")) {
// 这是时间
sdf = new SimpleDateFormat("HH:MM");
} else {
// 日期
sdf = new SimpleDateFormat("yyyy-MM-dd");
}
Date temp = cell.getDateCellValue();
cellStr = sdf.format(temp);
} else {
// 是数字
double temp = cell.getNumericCellValue();
// 数学格式化工具
DecimalFormat format = new DecimalFormat();
String formatString = cell.getCellStyle().getDataFormatString();
if ("General".equals(formatString)) {
// 定义格式化的正则 定义
format.applyPattern("#");
}
cellStr = format.format(temp);
}
break;
default:
cellStr = "";
}
return cellStr;
}
}
文件解析测试类
package cn.icanci.poi.test;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import org.junit.jupiter.api.Test;
import cn.icanci.poi.util.ParseExcel;
/**
* @author 178111545333 zhu qiang
* @version 1.10
* @classAction
*/
class ParseExcelTest {
/**
* Test method for {@link cn.icanci.poi.util.ParseExcel#getParseExcel(java.io.InputStream, java.lang.String, int)}.
* @throws IOException
*/
@Test
void testGetParseExcel() throws IOException {
InputStream inputStream = new FileInputStream("crm_poi.xlsx");
String suffix = "xlsx";
int startRow = 2;
List result = ParseExcel.getParseExcel(inputStream, suffix, startRow);
for (String[] s : result) {
for (String s1 : s) {
System.out.print(s1+" ");
}
System.out.println();
}
}
}
我的crm_poi.xlsx文件内容
测试结果
系统管理 null 系统管理 T 1
客户管理 null 客户管理 T 1
合同管理 null 合同管理 T 1
个人管理 null 个人管理 T 1
用户维护 /user 用户维护 F 2
用户查询 /user 用户查询 F 2
修改用户密码 /user 修改用户密码 F 2
客户维护 /cus 客户维护 F 3
客户查询 /cus 客户查询 F 3
合同维护 /contract 合同维护 F 4
合同查询 /contract 合同查询 F 4
查询个人信息 /self 查询个人信息 F 5
修改个人信息 /self 修改个人信息 F 5
修改个人密码 /self 修改个人密码 F 5