基于POI的读写Excel文件的工具类
生活随笔
收集整理的這篇文章主要介紹了
基于POI的读写Excel文件的工具类
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
依賴的jar包:
?
import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Arrays; import java.util.List;import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; 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.ss.usermodel.WorkbookFactory; /*** * 基于POI的讀寫Excel文件的工具類* @author 彭鋒* @2018年5月13日 下午4:00:11*/ public final class ExcelUtils {private static <T>Field[] getFields(Class<T> clazz,String[] fieldNames) {Field[] fs = new Field[fieldNames.length];Field[] fields = clazz.getDeclaredFields();for (int i = 0; i < fieldNames.length; i++) {O:for (Field field : fields) {field.setAccessible(true);if(field.getName().equals(fieldNames[i])) {fs[i] = field;break O;}}}System.out.println(Arrays.toString(fs));return fs;}private static <T>String[][] getDatas(String[] titles,List<T> beans,String[] fieldNames) throws Exception{List<String[]> datas = new ArrayList<>();if(titles != null && titles.length > 0) {datas.add(titles);}//根據(jù)List集合中的JavaBean對象的類型,和參數(shù)fieldNames,獲取要寫出的字段數(shù)組;Field[] fs = getFields(beans.get(0).getClass(),fieldNames);for (T t : beans) {String[] data = new String[fs.length];for (int i = 0; i < fs.length; i++) {if(fs[i] != null) {Object obj = fs[i].get(t);String value = obj == null ? "" : obj.toString();data[i] = value;}}datas.add(data);}return datas.toArray(new String[datas.size()][]);}/*** 將指定的二維字符串?dāng)?shù)組中的數(shù)據(jù),寫出到指定的Excel文件中* @param datas:保存了要寫出的數(shù)據(jù)的二維數(shù)組;* @param output:關(guān)聯(lián)到要輸出的Excel文件的輸出流* @throws IOException* @throws FileNotFoundException*/public static void writeToExcel(String[][] datas, OutputStream output) throws IOException, FileNotFoundException {// 創(chuàng)建一個Workbook對象;Workbook book = new HSSFWorkbook();// 通過workbook對象,創(chuàng)建一個工作表(sheet對象)Sheet sheet = book.createSheet();for (int i = 0; i < datas.length; i++) {// 通過工作表創(chuàng)建行Row row = sheet.createRow(i);for (int j = 0; j < datas[i].length; j++) {// 通過行創(chuàng)建單元格Cell cell = row.createCell(j);cell.setCellType(CellType.STRING);// 為單元格設(shè)置內(nèi)容 cell.setCellValue(datas[i][j]);}}book.write(output);book.close();}/*** 將指定集合中的所有JavaBean數(shù)據(jù),寫出到關(guān)聯(lián)指定Excel文件的輸出流中;* @param titles:輸出的Excel文件的標(biāo)題行的內(nèi)容* @param fieldNames:一行中的各個列對應(yīng)的JavaBean中的字段* @param beans:要輸出的所有JavaBean對象* @param output:關(guān)聯(lián)到指定Excel文件的輸出流* @throws Exception*/public static <T>void writeToExcel(String[] titles,String[] fieldNames,List<T> beans,OutputStream output) throws Exception {String[][] datas = getDatas(titles, beans, fieldNames);writeToExcel(datas, output);}/*** 從指定的Excel的輸入流中讀取數(shù)據(jù),寫到指定類型的bean對象的List集合中;* @param input:關(guān)聯(lián)到某個Excel文件的輸入流* @param clazz:要封裝一行數(shù)據(jù)的JavaBean的類型* @param fieldNames:一行數(shù)據(jù)中的列按順序和JavaBean中對應(yīng)的字段* @return* @throws Exception*/public static <T> List<T> readExcel(InputStream input, Class<T> clazz,String[] fieldNames) throws Exception {List<T> list = new ArrayList<>();Field[] fs = getFields(clazz,fieldNames);// 創(chuàng)建一個Workbook對象Workbook book = WorkbookFactory.create(input);// 通過Workbook對象,獲取里面的工作表(sheet對象)Sheet sheet = book.getSheetAt(0);// 獲取工作表中的行for (int i = 1; i <= sheet.getLastRowNum(); i++) {// 通過行號獲取行Row row = sheet.getRow(i);T t = clazz.newInstance();// 遍歷獲取一行中的所有單元格for (int j = 0; j < fs.length; j++) {if(fs[j] != null) {Cell cell = row.getCell(j);cell.setCellType(CellType.STRING);setCellValue(fs[j],t,cell);}}list.add(t);}return list;}private static void setCellValue(Field field,Object bean,Cell cell) throws Exception {String str = cell.toString();Class clazz = field.getType();if(clazz == byte.class) {field.set(bean, Byte.parseByte(str));}else if(clazz == short.class) {field.set(bean, Short.parseShort(str));}else if(clazz == int.class) {field.set(bean, Integer.parseInt(str));}else if(clazz == long.class) {field.set(bean, Long.parseLong(str));}else if(clazz == double.class) {field.set(bean, Double.parseDouble(str));}else if(clazz == float.class) {field.set(bean, Float.parseFloat(str));}else if(clazz == boolean.class) {field.set(bean, Boolean.parseBoolean(str));}else {field.set(bean, str);}} }?
轉(zhuǎn)載于:https://www.cnblogs.com/pf1988/p/9146105.html
總結(jié)
以上是生活随笔為你收集整理的基于POI的读写Excel文件的工具类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: open-falcon的邮件报警
- 下一篇: iOS9的几个新关键字(nonnull、