在项目中多次操作poi来做导入导出操作,然后整理了两个工具类,一个导入,一个导出.方便之后的使用.
一.工具类代码:
package com.chcx.excel;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* Excel(POI)工具类
*/
public class ExcelTestUtil {
/**
* @param headList Excel文件Head标题集合
* @param fieldList Excel文件Field标题集合
* @param dataList Excel文件数据内容部分
* @throws XSSFWorkbook
*/
public static XSSFWorkbook createExcel(List<String> headList,
List<String> fieldList, List<Map<String, Object>> dataList)
throws Exception {
// 创建新的Excel 工作簿
XSSFWorkbook workbook = new XSSFWorkbook();
// 在Excel工作簿中建一工作表,其名为缺省值
// 如要新建一名为"效益指标"的工作表,其语句为:
// HSSFSheet sheet = workbook.createSheet("效益指标");
XSSFSheet sheet = workbook.createSheet();
// 在索引0的位置创建行(最顶端的行)
XSSFRow row = sheet.createRow(0);// 第一个sheet的第一行为标题
// ===============================================================
for (int i = 0; i < headList.size(); i++) {
// 在索引0的位置创建单元格(左上端)
XSSFCell cell = row.createCell(i);
// 定义单元格为字符串类型
cell.setCellType(XSSFCell.CELL_TYPE_STRING);
// 在单元格中输入一些内容
cell.setCellValue(headList.get(i));
}
// ===============================================================
for (int n = 0; n < dataList.size(); n++) {
// 在索引1的位置创建行(最顶端的行)
XSSFRow row_value = sheet.createRow(n + 1);
Map<String, Object> dataMap = dataList.get(n);
// ===============================================================
for (int i = 0; i < fieldList.size(); i++) {
// 在索引0的位置创建单元格(左上端)
XSSFCell cell = row_value.createCell(i);
// 定义单元格为字符串类型
cell.setCellType(XSSFCell.CELL_TYPE_STRING);
// 在单元格中输入一些内容
cell.setCellValue(objToString(dataMap.get(fieldList.get(i))));
}
// ===============================================================
}
return workbook;
}
private static String objToString(Object obj) {
if (obj == null) {
return "";
} else {
if (obj instanceof String) {
return (String) obj;
} else if (obj instanceof Date) {
return null;// DateUtil.dateToString((Date)
// obj,DateUtil.DATESTYLE_SHORT_EX);
} else {
return obj.toString();
}
}
}
/**
* 读取 Excel文件内容
*
* @param inputstream 文件输入流
* @return
* @throws Exception
*/
public static List<List<Object>> readExcelByInputStream(
InputStream inputstream) throws Exception {
// 结果集
List<List<Object>> list = new ArrayList<List<Object>>();
XSSFWorkbook workbook = new XSSFWorkbook(inputstream);
// 遍历该表格中所有的工作表,i表示工作表的数量 getNumberOfSheets表示工作表的总数
XSSFSheet sheet = workbook.getSheetAt(0);
// 遍历该行所有的行,j表示行数 getPhysicalNumberOfRows行的总数
// //System.out.println("excel行数: "+hssfsheet.getPhysicalNumberOfRows());
for (int j = 0; j < sheet.getPhysicalNumberOfRows(); j++) {
XSSFRow row = sheet.getRow(j);
if (row != null) {
int col = row.getPhysicalNumberOfCells();
// 单行数据
List<Object> arrayString = new ArrayList<Object>();
for (int i = 0; i < col; i++) {
XSSFCell cell = row.getCell(i);
if (cell == null) {
arrayString.add("");
} else if (cell.getCellType() == 0) {
arrayString.add(new Double(cell.getNumericCellValue())
.toString());
} else {// 如果EXCEL表格中的数据类型为字符串型
arrayString.add(cell.getStringCellValue().trim());
}
}
list.add(arrayString);
}
}
return list;
}
}
二.测试代码:
1.测试导出
public static void main(String[] args) {
test1();
}
public static void test1() {
List<String> headList = new ArrayList<>();
headList.add("标题1");
headList.add("标题2");
headList.add("标题3");
headList.add("标题4");
List<String> fieldList = new ArrayList<>();
fieldList.add("id");
fieldList.add("name");
fieldList.add("pas");
fieldList.add("sex");
ArrayList<Map<String, Object>> maps = new ArrayList<>();
Map<String, Object> map = new HashMap<>();
map.put("id", "id1");
map.put("name", "name1");
map.put("pas", "pa1111111111111111111111111111111111111111111111111s1");
map.put("sex", "sex1");
Map<String, Object> map2 = new HashMap<>();
map2.put("id", "id2");
map2.put("name", "name2");
map2.put("pas", "pas2");
map2.put("sex", "sex2");
Map<String, Object> map3 = new HashMap<>();
map3.put("id", "id3");
map3.put("name", "name3");
map3.put("pas", "pas3");
map3.put("sex", "sex3");
maps.add(map);
maps.add(map3);
maps.add(map2);
try {
XSSFWorkbook workbook = ExcelTestUtil.createExcel(headList, fieldList, maps);
FileOutputStream outputStream = new FileOutputStream("F:\\del\\xxxxx.xlsx");
workbook.write(outputStream);// 输出到流中
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
执行结果:
2.读取excel 获取list数据
public static void main(String[] args) throws Exception {
// test1();
test2();
}
public static void test2() throws Exception {
InputStream fileInputStream = new FileInputStream("F:\\del\\xxxxx.xlsx");
List<List<Object>> lists = ExcelTestUtil.readExcelByInputStream(fileInputStream);
lists.forEach(objects -> objects.forEach(System.out::println));
}
debug 读取到的结果集
输出打印内容