1. 程式人生 > 其它 >Java 匯入 excel

Java 匯入 excel

Utile 包檔案
//包名自己根據自己的包名寫

import org.apache.poi.hssf.usermodel.;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.
;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.*;

public class InputExcelUtil {
/**
* 這是一個通用的方法,利用了JAVA的反射機制,可以將放置在JAVA集合中並且符號一定條件的資料以EXCEL 的形式輸出
* title 表格標題名
* headersName 表格屬性列名陣列
* headersId 表格屬性列名對應的欄位---你需要匯出的欄位名(為了更靈活控制你想要匯出的欄位)
* dtoList 需要顯示的資料集合,集合中一定要放置符合javabean風格的類的物件
* out 與輸出裝置關聯的流物件,可以將EXCEL文件匯出到本地檔案或者網路中
/
public byte[] exportExcel(String title, List headersName,List headersId,
List dtoList) {
/

(一)表頭--標題欄/
Map<Integer, String> headersNameMap = new HashMap<>();
int key=0;
for (int i = 0; i < headersName.size(); i++) {
if (!headersName.get(i).equals(null)) {
headersNameMap.put(key, headersName.get(i));
key++;
}
}
/
(二)欄位/
Map<Integer, String> titleFieldMap = new HashMap<>();
int value = 0;
for (int i = 0; i < headersId.size(); i++) {
if (!headersId.get(i).equals(null)) {
titleFieldMap.put(value, headersId.get(i));
value++;
}
}
/
(三)宣告一個工作薄:包括構建工作簿、表格、樣式/
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet(title);
sheet.setDefaultColumnWidth((short)15);
// 生成一個樣式
HSSFCellStyle style = wb.createCellStyle();
HSSFRow row = sheet.createRow(0);
// style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
HSSFCell cell;
Collection c = headersNameMap.values();//拿到表格所有標題的value的集合
Iterator it = c.iterator();//表格標題的迭代器
/
(四)匯出資料:包括匯出標題欄以及內容欄*/
//根據選擇的欄位生成表頭
short size = 0;
while (it.hasNext()) {
cell = row.createCell(size);
cell.setCellValue(it.next().toString());
cell.setCellStyle(style);
size++;
}
//表格標題一行的欄位的集合
Collection zdC = titleFieldMap.values();
Iterator labIt = dtoList.iterator();//總記錄的迭代器
int zdRow =0;//列序號
while (labIt.hasNext()) {//記錄的迭代器,遍歷總記錄
int zdCell = 0;
zdRow++;
row = sheet.createRow(zdRow);
T l = (T) labIt.next();
// 利用反射,根據javabean屬性的先後順序,動態呼叫getXxx()方法得到屬性值
Field[] fields = l.getClass().getDeclaredFields();//獲得JavaBean全部屬性
for (short i = 0; i < fields.length; i++) {//遍歷屬性,比對
Field field = fields[i];
String fieldName = field.getName();//屬性名
Iterator zdIt = zdC.iterator();//一條欄位的集合的迭代器
while (zdIt.hasNext()) {//遍歷要匯出的欄位集合
if (zdIt.next().equals(fieldName)) {//比對JavaBean的屬性名,一致就寫入,不一致就丟棄
String getMethodName = "get"
+ fieldName.substring(0, 1).toUpperCase()
+ fieldName.substring(1);//拿到屬性的get方法
Class tCls = l.getClass();//拿到JavaBean物件
try {
Method getMethod = tCls.getMethod(getMethodName,
new Class[] {});//通過JavaBean物件拿到該屬性的get方法,從而進行操控
Object val = getMethod.invoke(l, new Object[] {});//操控該物件屬性的get方法,從而拿到屬性值
String textVal = null;
if (val!= null) {
textVal = String.valueOf(val);//轉化成String
}else{
textVal = null;
}
row.createCell((short) zdCell).setCellValue(textVal);//寫進excel物件
zdCell++;
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
}
}
return wb.getBytes();
}
/**
* Excel讀取 操作
*/
public static List<List> readExcel(InputStream is)
throws IOException, InvalidFormatException {
Workbook wb = null;
try {
wb = WorkbookFactory.create(is);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

    /** 得到第一個sheet */
    Sheet sheet = wb.getSheetAt(0);
    /** 得到Excel的行數 */
    int totalRows = sheet.getPhysicalNumberOfRows();

    /** 得到Excel的列數 */
    int totalCells = 0;
    if (totalRows >= 1 && sheet.getRow(0) != null) {
        totalCells = sheet.getRow(0).getPhysicalNumberOfCells();
    }

    List<List<String>> dataLst = new ArrayList<List<String>>();
    /** 迴圈Excel的行 */
    for (int r = 0; r < totalRows; r++) {
        Row row = sheet.getRow(r);
        if (row == null)
            continue;
        List<String> rowLst = new ArrayList<String>();
        /** 迴圈Excel的列 */
        for (int c = 0; c < totalCells; c++) {
            Cell cell = row.getCell(c);
            String cellValue = "";
            if (null != cell) {
                 /*HSSFDataFormatter hSSFDataFormatter = new HSSFDataFormatter();
                 cellValue= hSSFDataFormatter.formatCellValue(cell);*/

                // 以下是判斷資料的型別
                CellType type = cell.getCellTypeEnum();

                switch (type) {
                    case NUMERIC: // 數字
                        cellValue = cell.getNumericCellValue() + "";
                        break;
                    case STRING: // 字串
                        cellValue = cell.getStringCellValue();
                        break;
                    case BOOLEAN: // Boolean
                        cellValue = cell.getBooleanCellValue() + "";
                        break;
                    case FORMULA: // 公式
                        try {
                            cellValue = cell.getStringCellValue();
                        } catch (IllegalStateException e) {
                            cellValue = String.valueOf(cell.getNumericCellValue());
                        }
                        break;
                   /* cellValue = cell.getCellFormula() + "";
                    break;*/
                    case BLANK: // 空值
                        cellValue = "";
                        break;
                    case _NONE: // 故障
                        cellValue = "非法字元";
                        break;
                    default:
                        cellValue = "未知型別";
                        break;
                }
            }
            rowLst.add(cellValue);
        }
        /** 儲存第r行的第c列 */
        dataLst.add(rowLst);
    }
    return dataLst;
}

}

controller層 多引數
@RequestMapping(value = "/adddetail")
@ResponseBody
public Result inputs(@RequestParam(value = "file") MultipartFile file,Integer projectid, Integer evaid ,Integer assid) throws IOException, InvalidFormatException {
//讀取excel表格
Result result = new Result();
try {
List<List> lists = InputExcelUtil.readExcel(file.getInputStream());
//判斷集合是否為空
if (!CollectionUtils.isEmpty(lists)) {
for (int i = 6; i < lists.size()-3; i++) {
List list = lists.get(i);
Eva_project_case_detail pdc= new Eva_project_case_detail();
pdc.setProject_id(projectid);
pdc.setPro_eva_relevance_id(evaid);
pdc.setEva_ass_id(assid);
pdc.setE_content(list.get(1));
pdc.setEvolve(list.get(7));
if (i==list.size()-3){
pdc.setType(1);
}else{
pdc.setType(0);
}
int ac = epcd.addCaserDetail(pdc);
if (ac < 0) {
result.setCode("500");
result.setMsg("新增資料失敗");
} else {
result.setCode("200");
result.setMsg("新增成功");
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
return result;
}

只匯入檔案
@RequestMapping(value = "/inputsdata")
@ResponseBody
public Result inputs(@RequestParam(value = "file") MultipartFile file) throws IOException, InvalidFormatException {
//讀取excel表格
Result result = new Result();
try {
List<List> lists = InputExcelUtil.readExcel(file.getInputStream());
//判斷集合是否為空
if (!CollectionUtils.isEmpty(lists)) {
for (int i = 1; i < lists.size(); i++) {
List list = lists.get(i);
Person_data per = new Person_data();
// Double a = Double.parseDouble(list.get(0));
// per.setDi_name(list.get(0));
per.setS_name(list.get(0)); //對應的列
per.setSex(list.get(1));
Double b = Double.parseDouble(list.get(2));
per.setAge(b.intValue());
per.setIndustry(list.get(3));
per.setK_back(list.get(4));
per.setOrganiz(list.get(5));
DecimalFormat df = new DecimalFormat("#");
Double c = Double.parseDouble(list.get(6));
String s = df.format(c);
per.setMob(s);
int ac = apd.adddate(per);
if (ac < 0) {
result.setCode("500");
result.setMsg("新增資料失敗");

                } else {
                    result.setCode("200");
                    result.setMsg("新增成功");
                }
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    return result;
}