poi導出excel提示錯誤?前言:剛開始導入Excel的時候,每次有新的Excel文件需要導入的時候就需要重新再新寫一個對應的工具來導入excel所以,鄙人痛定思痛,覺得有必要寫一個可以萬能導入的Excel工具,現在小編就來說說關于poi導出excel提示錯誤?下面内容希望能幫助到你,我們來一起看看吧!
前言:
剛開始導入Excel的時候,每次有新的Excel文件需要導入的時候就需要重新再新寫一個對應的工具來導入excel。所以,鄙人痛定思痛,覺得有必要寫一個可以萬能導入的Excel工具。
private final static String xls = "xls";
private final static String xlsx = "xlsx";
public static Map<String, Object> readExcelPOIT(Object obj) throws Exception
{
// FileInputStream fis = (FileInputStream) file.getInputStream();
Map<String,Object> jsonObject = new HashMap<>();
String msg = null;
List<String> msgList = new ArrayList<>();
//創建輸入流
FileInputStream fis = new FileInputStream(new File("g:\\data\\test.xlsx"));
//通過構造函數傳參
Workbook workbook = getWorkBookT(new File("g:\\data\\test.xlsx"));
// Workbook workbook = getWorkBook(file);
int sheets = workbook.getNumberOfSheets();
if (sheets<1){
msg="内容為空";
msgList.add(msg);
jsonObject.put("msg",msgList);
return jsonObject;
}
//獲取工作标名稱
// for (int i=0;i<sheets;i ){
// System.out.println(workbook.getSheetName(i));
//
// }
//獲取工作表 第一張工作表
Sheet sheet = workbook.getSheetAt(0);
//獲取行,行号作為參數傳遞給getRow方法,第一行從0開始計算
//獲取第一行
int firstRowNum = sheet.getFirstRowNum() 2;
//獲取第一行的第一個值進行判斷是否為我需要的值
Row row1 = sheet.getRow(firstRowNum);
Row row2 = sheet.getRow(firstRowNum-1);
Class cl = obj.getClass();
Field[] fs = cl.getDeclaredFields();
StringBuilder stringBuilder = new StringBuilder();
for (Field f : fs ){
if (stringBuilder.length()==0){
stringBuilder.append(f.getName());
}else {
stringBuilder.append(",");
stringBuilder.append(f.getName());
}
}
String containsIn = stringBuilder.toString();
if (row1==null){
msg="内容為空";
msgList.add(msg);
jsonObject.put("msg",msgList);
return jsonObject;
}
// 判斷 所需字段是否存在
int cellNum = -1;
short rowNum = row2.getLastCellNum();
for (int i=0;i<rowNum;i ){
Cell cell1 = row2.getCell(i);
cell1.setCellType(CellType.STRING);
if (cell1!=null){
String cellValue = cell1.getStringCellValue();
if (!containsIn.contains(cellValue)){
cellNum=i;
break;
}
}
}
if (cellNum!=-1){
msg="不存在需要的字段";
msgList.add(msg);
jsonObject.put("msg",msgList);
return jsonObject;
}
//最後 一列
// short lastCellNum = row.getLastCellNum();
//最後一行
Integer sheetLastRowNum = sheet.getLastRowNum();
List<Object> list = new ArrayList<>();
if (sheetLastRowNum<1){
msg="數據行不存在";
msgList.add(msg);
}
for (int i=firstRowNum 1;i<sheetLastRowNum 1;i ){
//獲取第i行
Row row = sheet.getRow(i);
//獲取該列
Cell cell1 = null;
if (row!=null){
Object object = obj.getClass().newInstance();
BeanUtils.copyProperties(obj,object);
for (int j=0;j<rowNum;j ){
cell1 = row.getCell(j);
// String cellValue = row1.getCell(j).getStringCellValue();
String cellValue = row2.getCell(j).getStringCellValue();
if (cell1==null){
msg="第" i "行第" (j 1) "列值為空";
msgList.add(msg);
break;
}
if (cell1!=null){
cell1.setCellType(CellType.STRING);
if (containsIn.contains(cellValue)){
String value = cell1.getStringCellValue();
Class cal = CustomerPoolAddRequest.class;
Field field = cal.getDeclaredField(cellValue);
field.setAccessible(true);
field.set(object,value);
}
}
}
Object o =AnnotationUtils.validate(object).get("result");
if (Boolean.TRUE.equals(o)){
list.add(object);
}
}
}
logger.warn("msgList={}",msgList);
jsonObject.put("list",list);
jsonObject.put("msg",msgList);
workbook.close();
fis.close();
return jsonObject;
}
public static Workbook getWorkBookT(File file) {
//獲得文件名
// String fileName = file.getOriginalFilename();
String fileName = file.getName();
//創建Workbook工作薄對象,表示整個excel
Workbook workbook = null;
try {
//獲取excel文件的io流
// InputStream is = file.getInputStream();
FileInputStream is = new FileInputStream(file);
//根據文件後綴名不同(xls和xlsx)獲得不同的Workbook實現類對象
if(fileName.endsWith(xls)){
//2003
workbook = new HSSFWorkbook(is);
}else if(fileName.endsWith(xlsx)){
//2007
workbook = new XSSFWorkbook(is);
}
} catch (IOException e) {
logger.info(e.getMessage());
}
return workbook;
}
注釋:前三行不被讀取 |
第二行内容字段與接收實體類字段相同 |
-- |
name |
phone |
address |
姓名 |
手機号 |
地址 |
張三 |
11011011000 |
杭州 |
本次demo中,前三行是被忽略的。第二行的字段與接受的實體類相對應。 |
如上:隻需實體類中用name,phone,address就能接收到姓名為張三 手機号為 11011011000 地址為杭州
ps:這裡我們隻對第一張Excel表進行了處理,需要對所有表進行處理的可自行修改
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!