文件导入导出必须代码
ExportExcel.java
/*** ลิขสิทธิ์© 2012-2014 <a href = "https://github.com/thinkgem/jeesite"> jeesite </a> สงวนลิขสิทธิ์ */แพ็คเกจ com.thinkgem.jeesite.common.utils.excel; นำเข้า java.io.filenotfoundexception; นำเข้า java.io.fileoutputstream นำเข้า java.io.ioexception; นำเข้า java.io.OutputStream; นำเข้า java.lang.reflect.field; นำเข้า java.lang.reflect.method; java.util.comparator; นำเข้า java.util.date; นำเข้า java.util.hashmap; นำเข้า java.util.linkedhashmap; นำเข้า java.util.list; นำเข้า java.util.map; นำเข้า Javax.servlet.http.httpservletResponse; นำเข้า org.apache.commons.lang3.Stringutils; นำเข้า org.apache.poi.ss.usermodel.cell; นำเข้า org.apache.poi.ss.usermodel.cellstyle นำเข้า org.apache.poi.ss.ss.ss.ss.ss.ss. org.apache.poi.ss.usermodel.font; นำเข้า org.apache.poi.ss.usermodel.indexedcolors; นำเข้า org.apache.poi.ss.usermodel.row; นำเข้า org.apache.poi.ss.usermodel.Sheet; org.apache.poi.ss.util.cellrangeaddress; นำเข้า org.apache.poi.xssf.streaming.sxssfworkbook; นำเข้า org.apache.poi.xssf.usermodel.xssfclientanchor; org.slf4j.logger; นำเข้า org.slf4j.loggerfactory; นำเข้า com.google.common.collect.lists; นำเข้า com.thinkgem.jeesite.common.utils.dateutils; นำเข้า com.thinkgem.jeesite.common.utils.encodes; นำเข้า com.thinkgem.jees.common.utils.reflections; com.thinkgem.jeesite.common.utils.excel.annotation.excelfield; นำเข้า com.thinkgem.jeesite.modules.sys.utils.dictutils; /** * 导出 Excel 文件(导出“ XLSX” 格式, 支持大数据量导出 @@See org.apache.poi.ss.ss.spreadsheetVerversion) * @author ThinkGem * @version 2013-04-21 */การส่งออกคลาสสาธารณะ / ** * 工作薄对象 */ ส่วนตัว sxssfworkbook wb; / ** * 工作表对象 */ แผ่นแผ่นส่วนตัว; / ** * 样式列表 */ แผนที่ส่วนตัว <String, CellStyle> Styles; / ** * 当前行号 */ ส่วนตัว int rownum; /** * 注解列表( Object [] {Excelfield, Field/Method}) */list <object []> AnnotationList = lists.newarraylist (); / ** * 字段แผนที่ */ LinkedHashMap <String, String> FieldMap; hashmap <string, string> dicttypes; / ** * 构造函数 * @param ชื่อเรื่อง表格标题, 传“ 空值”, 表示无标题表示无标题 * @param cls 实体对象, 通过 Annotation.exportfield 获取标题 */ การส่งออกสาธารณะสาธารณะ } / ** * 构造函数 * @param ชื่อเรื่อง表格标题, 传“ 空值”, 表示无标题 * @param fieldmap, 获取要导出的字段和字段标题获取要导出的字段和字段标题获取要导出的字段和字段标题 * / การส่งออกสาธารณะสาธารณะ (ชื่อสตริง, linkedhashmap <สตริง, สตริง> fieldmap) {this.fieldmap = fieldmap; dictTypes = new hashmap <string, string> (); // เริ่มต้น int colunm = 0; รายการ <String> headerList = lists.newarrayList (); สำหรับ (คีย์สตริง: fieldmap.keyset ()) {string t = fieldmap.get (คีย์); hashmap <string, string> map = com.thinkgem.jeesite.common.utils.stringutils.tomap (t, ";", "=", false); if (map.get ("name")! = null) {t = map.get ("ชื่อ"); } if (map.get ("dicttype")! = null) {dicttypes.put (""+(colunm), map.get ("dicttype")); } Colunm ++; headerlist.add (t); } เริ่มต้น (ชื่อเรื่อง headerList); } / ** * 构造函数 * @param title 表格标题, 传“ 空值”, 表示无标题表示无标题 * @param cls 实体对象, 通过 annotation.exportfield * @param type 导出类型( 1: 导出数据; 2: 导出模板))) cls.getdeclaredfields (); สำหรับ (ฟิลด์ f: fs) {excelfield ef = f.getannotation (excelfield.class); if (ef! = null && (ef.type () == 0 || ef.type () == ประเภท)) {ถ้า (กลุ่ม! = null && groups.length> 0) {boolean ingroup = false; สำหรับ (int g: กลุ่ม) {ถ้า (ingroup) {break; } สำหรับ (int efg: ef.groups ()) {ถ้า (g == efg) {ingroup = true; AnnotationList.add (วัตถุใหม่ [] {ef, f}); หยุดพัก; }}}} else {AnnotationList.add (วัตถุใหม่ [] {ef, f}); }}} // รับวิธีการอธิบายประกอบ [] ms = cls.getDeclaredMethods (); สำหรับ (วิธีการ m: ms) {excelfield ef = m.getannotation (excelfield.class); if (ef! = null && (ef.type () == 0 || ef.type () == ประเภท)) {ถ้า (กลุ่ม! = null && groups.length> 0) {boolean ingroup = false; สำหรับ (int g: กลุ่ม) {ถ้า (ingroup) {break; } สำหรับ (int efg: ef.groups ()) {ถ้า (g == efg) {ingroup = true; AnnotationList.add (วัตถุใหม่ [] {ef, m}); หยุดพัก; }}}} else {AnnotationList.add (วัตถุใหม่ [] {ef, m}); }}} // คอลเลกชันการเรียงลำดับฟิลด์ (คำอธิบายประกอบ, ตัวเปรียบเทียบใหม่ <object []> () {int สาธารณะเปรียบเทียบ (วัตถุ [] o1, object [] o2) {ส่งคืนจำนวนเต็มใหม่ ((excelfield) o1 [0]); // เริ่มต้นรายการ <string> headerList = lists.newarraylist (); สำหรับ (Object [] OS: AnnotationList) {String t = ((excelfield) OS [0]). title (); // 如果是导出, 则去掉注释ถ้า (type == 1) {string [] ss = stringutils.split (t, "**", 2); if (ss.length == 2) {t = ss [0]; }} headerList.add (t); } เริ่มต้น (ชื่อเรื่อง headerList); } / ** * 构造函数 * @param ชื่อเรื่อง表格标题, 传“ 空值”, 表示无标题表示无标题 * @param ส่วนหัว表头数组 * / การส่งออกสาธารณะสาธารณะ (ชื่อสตริง, สตริง [] ส่วนหัว) {เริ่มต้น (title, lists.newarraylist (ส่วนหัว)); } / ** * 构造函数 * @param ชื่อเรื่อง表格标题, 传“ 空值”, 表示无标题 * @param HeaderList 表头列表 * / การส่งออกสาธารณะสาธารณะ (ชื่อสตริง, รายการ <string> headerList) {เริ่มต้น (ชื่อ, headerList); } / ** * 初始化函数 * @param ชื่อเรื่อง表格标题, 传“ 空值”, 表示无标题表示无标题 * @param HeaderList 表头列表 * / โมฆะส่วนตัวเริ่มต้น (ชื่อสตริง, รายการ <string> headerList) {this.wb = ใหม่ sxssfworkbook (500); this.sheet = wb.createsheet ("ส่งออก"); this.styles = createstyles (wb); // สร้างชื่อเรื่องถ้า (stringUtils.isnotblank (ชื่อ)) {row titlerow = sheet.createrow (Rownum ++); Titlerow.SetheightInpoints (30); เซลล์ titleCell = titlerow.createCell (0); titlecell.setcellstyle (styles.get ("title")); TitleCell.SetCellValue (ชื่อ); sheet.addmergedRegion (ใหม่ CellrangeAddress (titlerow.getRownum (), titlerow.getRownum (), titlerow.getRownum (), headerList.size ()-1)); } // สร้างส่วนหัวถ้า (headerList == null) {โยน runtimeException ใหม่ ("headerList ไม่ใช่ NULL!"); } row headerrow = sheet.createrow (Rownum ++); headerrow.Setheightinpoints (16); สำหรับ (int i = 0; i <headerlist.size (); i ++) {เซลล์เซลล์ = headerrow.createCell (i); cell.setcellstyle (styles.get ("ส่วนหัว")); String [] ss = stringUtils.split (headerlist.get (i), "**", 2); if (ss.length == 2) {cell.setCellValue (SS [0]); ความคิดเห็นความคิดเห็น = this.sheet.createdrawingPatriarch (). createCellComment (ใหม่ XSSFClientanChor (0, 0, 0, 0, 0, (สั้น) 3, 3, (สั้น) 5, 6)); comment.setstring (ใหม่ XSSFRICHTEXTSTRING (SS [1])); cell.setcellcomment (ความคิดเห็น); } else {cell.setCellValue (headerList.get (i)); } sheet.autosizeColumn (i); } สำหรับ (int i = 0; i <headerlist.size (); i ++) {int colwidth = sheet.getColumnWidth (i)*2; Sheet.SetColumnWidth (I, Colwidth <3000? 3000: Colwidth); } log.debug ("เริ่มต้นความสำเร็จ"); } / ** * 创建表格样式 * @param wb 工作薄对象 * @return 样式列表 * / แผนที่ส่วนตัว <String, CellStyle> CreateStyles (Workbook WB) {แผนที่ <String, CellStyle> styles = new HashMap <String, CellStyle> (); CellStyle Style = WB.CreateCellStyle (); style.setAlignment (CellStyle.align_center); style.setverticalalignment (CellStyle.vertical_center); FONT titlefont = wb.createFont (); titlefont.setFontName ("Arial"); titlefont.setfontheightinpoints ((สั้น) 16); titlefont.setboldweight (font.boldweight_bold); style.setFont (titlefont); Styles.put ("title", style); style = wb.createCellStyle (); style.setverticalalignment (CellStyle.vertical_center); style.setBorderright (CellStyle.Border_thin); style.setrightBorderColor (indexedColors.grey_50_percent.getIndex ()); style.setBorderLeft (cellStyle.border_thin); style.setleftBorderColor (indexedColors.grey_50_percent.getIndex ()); style.setBorderTop (CellStyle.Border_thin); style.settopBorderColor (indexedColors.grey_50_percent.getIndex ()); style.setBorderBottom (CellStyle.Border_thin); style.setBottomborderColor (indexedColors.grey_50_percent.getIndex ()); FONT DATAFONT = WB.CreateFont (); DataFont.SetFontName ("Arial"); datafont.setfontheightinpoints ((สั้น) 10); style.setFont (datafont); Styles.put ("data", style); style = wb.createCellStyle (); style.clonestylefrom (styles.get ("data")); style.setAlignment (CellStyle.align_left); styles.put ("data1", สไตล์); style = wb.createCellStyle (); style.clonestylefrom (styles.get ("data")); style.setAlignment (CellStyle.align_center); styles.put ("data2", สไตล์); style = wb.createCellStyle (); style.clonestylefrom (styles.get ("data")); style.setAlignment (CellStyle.align_right); styles.put ("data3", สไตล์); style = wb.createCellStyle (); style.clonestyleFrom (styles.get ("data")); // style.setWrapText (จริง); style.setAlignment (CellStyle.align_center); style.setFillforegroundColor (indexedColors.grey_50_percent.getIndex ()); style.setFillPattern (cellStyle.solid_foreground); FONT HeaderFont = WB.CreateFont (); headerFont.SetFontName ("Arial"); headerfont.setfontheightinpoints ((สั้น) 10); headerfont.setboldweight (font.boldweight_bold); headerfont.setColor (indexedColors.white.getIndex ()); style.setFont (headerFont); Styles.put ("Header", Style); รูปแบบการกลับมา; } / ** * 添加一行 * @return 行对象 * / แถวสาธารณะ addrow () {return sheet.createrow (Rownum ++); } / ** * 添加一个单元格 * @param row 添加的行 * @param คอลัมน์添加列号 * @param val 添加值 * @return 单元格对象 * / เซลล์สาธารณะ addcell (แถวแถว, คอลัมน์ int, val วัตถุ) {return.addcell (แถว, คอลัมน์, val, 0, class.class); } / ** * 添加一个单元格 * @param row 添加的行 * @param คอลัมน์添加列号 * @param val 添加值 * @param Align 对齐方式( 1: 靠左; 2: 3:: 靠右) @@return * / เซลล์สาธารณะ (แถวแถว) CellStyle style = styles.get ("data"+(Align> = 1 && จัดตำแหน่ง <= 3? Align: "")); ลอง {ถ้า (val == null) {cell.setCellValue (""); } else if (val อินสแตนซ์ของสตริง) {cell.setCellValue ((สตริง) val); } อื่นถ้า (อินสแตนซ์วาลของจำนวนเต็ม) {cell.setCellValue ((จำนวนเต็ม) val); } อื่นถ้า (อินสแตนซ์วาลยาว) {cell.setCellValue ((ยาว) val); } อื่นถ้า (อินสแตนซ์วาลสองครั้ง) {cell.setCellValue (decimalFormat ใหม่ (". #####") รูปแบบ (val)); } อื่นถ้า (อินสแตนซ์วาลของลอย) {cell.setCellValue ((ลอย) val); } อื่นถ้า (วันที่ val อินสแตนซ์) {dataFormat format = wb.createdataFormat (); style.setDataFormat (format.getFormat ("yyyy-mm-dd")); cell.setCellValue (dateutils.formatDateTime ((วันที่) val)); } else {ถ้า (FieldType! = class.class) {cell.setCellValue (((สตริง) FieldType.getMethod ("setValue", Object.class) .invoke (null, val)); } else {cell.setCellValue ((String) class.forName (this.getClass (). getName (). replaceall (this.getClass (). getSimplename (), "FieldType."+val.getClass () }}} catch (Exception Ex) {log.info ("ตั้งค่าเซลล์ ["+row.getRownum ()+","+คอลัมน์+"] ข้อผิดพลาด:"+ex.toString ()); cell.setCellValue (val.toString ()); } cell.setCellStyle (สไตล์); เซลล์กลับ; } / ** * 添加数据(通过 Annotation.Exportial 添加数据) * @return list 数据列表 * / public <e> exportExcel setDatalist (รายการ <e> รายการ) {สำหรับ (e e: list) {int colunm = 0; แถวแถว = this.addrow (); StringBuilder sb = new StringBuilder (); if (e อินสแตนซ์ของแผนที่) {@SuppressWarnings ("ไม่ได้ตรวจสอบ") แผนที่ <string, object> map = (แผนที่ <string, object>) e; สำหรับ (คีย์สตริง: fieldmap.keyset ()) {ค่าวัตถุ = map.get (คีย์); String columnDictType = dicttypes.get (colunm+""); if (stringutils.isnotblank (columnDictType)) {value = dictUtils.getDictLabel (value == null? "": value.toString (), columnDictType, ""); } this.addcell (แถว, colunm ++, value == null? "": value.toString (), 0, string.class); sb.append (value + ","); }} else {สำหรับ (Object [] OS: AnnotationList) {excelfield ef = (excelfield) OS [0]; Object val = null; // รับค่าเอนทิตีลอง {ถ้า (stringutils.isnotblank (ef.value ())) {val = reflections.invokegetter (e, ef.value ()); } else {if (os [1] ฟิลด์อินสแตนซ์ของ) {val = reflections.invokegetter (e, ((ฟิลด์) OS [1]). getName ()); } อื่นถ้า (os [1] method ของอินสแตนซ์) {val = reflections.invokemethod (e, ((เมธอด) OS [1]). getName (), คลาสใหม่ [] {}, วัตถุใหม่ [] {}); }} // ถ้าเป็น dict ให้รับ dict label ถ้า (stringutils.isnotblank (ef.dicttype ())) {val = dictutils.getDictLabel (val == null? "": val.toString (), ef.dicttype (), "); }} catch (Exception Ex) {// ความล้มเหลวในการละเว้น log.info (ex.toString ()); val = ""; } this.addcell (แถว, colunm ++, val, ef.align (), ef.fieldtype ()); sb.append (val + ","); } log.debug ("เขียนความสำเร็จ: ["+row.getRownum ()+"]"+sb.toString ()); }} ส่งคืนสิ่งนี้; } / ** * 输出数据流 * @param os 输出数据流 * / การส่งออกสาธารณะเขียน (OutputStream OS) พ่น IOException {wb.write (OS); คืนสิ่งนี้; } / ** * 输出到客户端 * @param filename 输出文件名 * / การเขียน ExportExcel สาธารณะ (การตอบกลับ httpservletResponse, ชื่อไฟล์สตริง) โยน ioexception {response.reset (); Response.setContentType ("แอปพลิเคชัน/octet-stream; charset = utf-8"); Response.SetheAder ("เนื้อหา-การจัดสรร", "สิ่งที่แนบมา; ชื่อไฟล์ ="+encodes.urlencode (ชื่อไฟล์)); เขียน (response.getOutputStream ()); คืนสิ่งนี้; } / ** * 输出到文件 * @param filename 输出文件名 * / สาธารณะ ExportExcel writefile (ชื่อสตริง) พ่น FilenotFoundException, iOexception {fileOutputStream OS = ใหม่ fileOutputStream (ชื่อ); this.write (OS); คืนสิ่งนี้; } / ** * 清理临时文件 * / การส่งออกสาธารณะ dispose () {wb.dispose (); คืนสิ่งนี้; -导出测试
โมฆะสาธารณะคงที่หลัก (สตริง [] args) โยน {list <string> headerList = lists.newarraylist (); สำหรับ (int i = 1; i <= 10; i ++) {headerlist.add ("表头"+i); } รายการ <String> dataRowList = lists.newarrayList (); สำหรับ (int i = 1; i <= headerList.size (); i ++) {dataRowlist.add ("数据"+i); } รายการ <list <string>> datalist = lists.newarraylist (); สำหรับ (int i = 1; i <= 1000000; i ++) {datalist.add (dataRowList); } ExportExcel EE = New ExportExcel ("表格标题", HeaderList); สำหรับ (int i = 0; i <datalist.size (); i ++) {row row = ee.addrow (); สำหรับ (int j = 0; j <datalist.get (i) .size (); j ++) {ee.addcell (แถว, j, datalist.get (i) .get (j)); }} ee.writeFile ("target/export.xlsx"); ee.dispose (); log.debug ("ความสำเร็จในการส่งออก"); -importExcel.java
/*** ลิขสิทธิ์© 2012-2014 <a href = "https://github.com/thinkgem/jeesite"> jeesite </a> สงวนลิขสิทธิ์ */แพ็คเกจ com.thinkgem.jeesite.common.utils.excel; นำเข้า java.io.file; นำเข้า java.io.fileinputstream; นำเข้า java.io.ioexception; นำเข้า java.io.inputstream; นำเข้า java.lang.reflect.field; นำเข้า java.lang.reflect.method นำเข้า java.util.collections; java.util.list; นำเข้า org.apache.commons.lang3.Stringutils; นำเข้า org.apache.poi.hssf.usermodel.hssfworkbook; นำเข้า org.apache.poi.openxml4j.exceptions.invalidformatexception; org.apache.poi.ss.usermodel.dateutil; นำเข้า org.apache.poi.ss.usermodel.row; นำเข้า org.apache.poi.ss.usermodel.sheet; นำเข้า org.apache.poi.ss.usermodel.workbook; org.slf4j.logger; นำเข้า org.slf4j.loggerfactory; นำเข้า org.springframework.web.multipart.multipartfile; นำเข้า com.google.common.collect.lists; นำเข้า com.thinkgem.jeesite.common.utils.reflections; นำเข้า com.thinkgem.jeesite.common.utils.excel.annotation.excelfield; /** * 导入 Excel 文件(支持“ XLS” 和“ XLSX” 格式) * @author ThinkGem * @Version 2013-03-10 */ชั้นเรียนสาธารณะ ImportExcel {logger แบบคงที่ส่วนตัว = loggerFactory.getLogger (importExcel.class); / ** * 工作薄对象 */ สมุดงานส่วนตัว wb; / ** * 工作表对象 */ แผ่นแผ่นส่วนตัว; / ** * 标题行号 */ ส่วนหัวส่วนตัว / ** * 构造函数 * @param Path 导入文件, 读取第一个工作表 * @param Headernum 标题行号, 数据行号 = 标题行号 +1 * @throws invalidformatexception * @throws ioexception */ importExcel สาธารณะ } / ** * 构造函数 * @param Path 导入文件对象, 读取第一个工作表 * @param Headernum 标题行号, 数据行号 = 标题行号 +1 * @throws invalidformatexception * @throws ioexception * / importExcel สาธารณะ } / ** * 构造函数 * @param path 导入文件 * @param Headernum 标题行号, 数据行号 = 标题行号 +1 * @param sheetindex 工作表编号 * @throws invalidformatexception * @throws ioexception * / public importExcel SheetIndex); } / ** * 构造函数 * @param Path 导入文件对象 * @param Headernum 标题行号, 数据行号 = 标题行号 +1 * @param sheetindex 工作表编号 * @throws invalidformatexception * @throws ioexception * / public importExcel FileInputStream (ไฟล์), Headernum, SheetIndex); } / ** * 构造函数 * @param ไฟล์导入文件对象 * @param Headernum 标题行号, 数据行号 = 标题行号 +1 * @param sheetindex 工作表编号 * @throws invalidformatexception * @throws ioexception * / public importExcel นี่ (MultipartFile.getoriginalfilename (), MultipartFile.getInputStream (), Headernum, SheetIndex); } / ** * 构造函数 * @param Path 导入文件对象 * @param Headernum 标题行号, 数据行号 = 标题行号 +1 * @param sheetindex 工作表编号 * @throws invalidformatexception * @throws ioexception * / public importExcel (stringutils.isblank (ชื่อไฟล์)) {โยน runtimeException ใหม่ ("导入文档为空!"); } อื่นถ้า (filename.toLowerCase (). endswith ("xls")) {this.wb = hssfworkbook ใหม่ (IS); } อื่นถ้า (filename.toLowerCase (). endswith ("xlsx")) {this.wb = ใหม่ XSSFWORKBOOK (IS); } else {โยน runtimeException ใหม่ ("文档格式不正确!"); } if (this.wb.getNumberOfSheets () <SheetIndex) {โยน runtimeException ใหม่ ("文档中没有工作表!"); } this.sheet = this.wb.getSheetat (SheetIndex); this.headernum = Headernum; log.debug ("เริ่มต้นความสำเร็จ"); } / ** * 获取行对象 * @param rownum * @return * / แถวสาธารณะ getrow (int rownum) {return this.sheet.getrow (rownum); } / ** * 获取数据行号 * @return * / public int getDatarownum () {return Headernum+1; } / ** * 获取最后一个数据行号 * @return * / public int getLaStDatarownum () {return this.sheet.getLastrownum ()+Headernum; } / ** * 获取最后一个列号 * @return * / public int getLaStcellnum () {return this.getrow (Headernum) .getLastCellNum (); } / ** * 获取单元格值 * @param row 获取的行 * @param คอลัมน์获取单元格列号 * @return 单元格值 * / วัตถุสาธารณะ getCellValue (แถวแถว, คอลัมน์ int) {Object val = ""; ลอง {cell cell = row.getCell (คอลัมน์); if (cell! = null) {ถ้า (cell.getCellType () == cell.cell_type_numeric) {val = cell.getNumericCellValue (); } อื่นถ้า (cell.getCellType () == cell.cell_type_string) {val = cell.getStringCellValue (); } อื่นถ้า (cell.getCellType () == cell.cell_type_formula) {val = cell.getCellformula (); } อื่นถ้า (cell.getCellType () == cell.cell_type_boolean) {val = cell.getBooleanCellValue (); } อื่นถ้า (cell.getCellType () == cell.cell_type_error) {val = cell.geterRoRcellValue (); }}} catch (exception e) {return val; } return val; } / ** * 获取导入数据列表 * @param cls 导入对象类型 * @param Groups 导入分组 * / สาธารณะ <e> รายการ <e> getDatalist (คลาส <e> cls, int ... กลุ่ม) พ่น InstantiationException, unglectexception // รับฟิลด์ฟิลด์คำอธิบายประกอบ [] fs = cls.getdeclaredfields (); สำหรับ (ฟิลด์ f: fs) {excelfield ef = f.getannotation (excelfield.class); if (ef! = null && (ef.type () == 0 || ef.type () == 2)) {ถ้า (กลุ่ม! = null && groups.length> 0) {boolean ingroup = false; สำหรับ (int g: กลุ่ม) {ถ้า (ingroup) {break; } สำหรับ (int efg: ef.groups ()) {ถ้า (g == efg) {ingroup = true; AnnotationList.add (วัตถุใหม่ [] {ef, f}); หยุดพัก; }}}} else {AnnotationList.add (วัตถุใหม่ [] {ef, f}); }}} // รับวิธีการอธิบายประกอบ [] ms = cls.getDeclaredMethods (); สำหรับ (วิธีการ m: ms) {excelfield ef = m.getannotation (excelfield.class); if (ef! = null && (ef.type () == 0 || ef.type () == 2)) {ถ้า (กลุ่ม! = null && groups.length> 0) {boolean ingroup = false; สำหรับ (int g: กลุ่ม) {ถ้า (ingroup) {break; } สำหรับ (int efg: ef.groups ()) {ถ้า (g == efg) {ingroup = true; AnnotationList.add (วัตถุใหม่ [] {ef, m}); หยุดพัก; }}}} else {AnnotationList.add (วัตถุใหม่ [] {ef, m}); }}} // คอลเลกชันการเรียงลำดับฟิลด์ (คำอธิบายประกอบ, ตัวเปรียบเทียบใหม่ <object []> () {int สาธารณะเปรียบเทียบ (วัตถุ [] o1, object [] o2) {ส่งคืนจำนวนเต็มใหม่ ((excelfield) o1 [0]); //log.debug("Import คอลัมน์นับ: "+AnnotationList.size ()); // รับรายการข้อมูล excel <e> datalist = lists.newarraylist (); สำหรับ (int i = this.getDatarownum (); i <this.getLastDatarownum (); i ++) {e e = (e) cls.newinstance (); คอลัมน์ int = 0; แถวแถว = this.getrow (i); StringBuilder sb = new StringBuilder (); สำหรับ (Object [] OS: AnnotationList) {Object val = this.getCellValue (แถวคอลัมน์ ++); if (val! = null) {excelfield ef = (excelfield) OS [0]; // ถ้าเป็นประเภท dict ให้รับค่า dict ถ้า (stringutils.isnotblank (ef.dicttype ())) {val = dictutils.getDictValue (val.toString (), ef.dicttype (), ""); //log.debug("dictionary ประเภทค่า: ["+i+", "+colunm+"] "+val); } // รับประเภทพารามิเตอร์และประเภทคลาสหล่อ <?> valtype = class.class; if (os [1] ฟิลด์อินสแตนซ์ของ) {valtype = ((ฟิลด์) OS [1]). getType (); } อื่นถ้า (OS [1] อินสแตนซ์ของเมธอด) {method method = ((วิธี) OS [1]); if ("get" .equals (method.getName (). substring (0, 3))) {valtype = method.getReturntype (); } else if ("set" .equals (method.getName (). substring (0, 3))) {valtype = ((วิธี) OS [1]). getParameterTypes () [0]; }} //log.debug("import ประเภทค่า: ["+i+", "+คอลัมน์+"] "+valtype); ลอง {ถ้า (valtype == string.class) {string s = string.valueof (val.toString ()); if (stringutils.endswith (s, ".0")) {val = stringUtils.substringBefore (s, ".0"); } else {val = string.valueof (val.toString ()); }} อื่นถ้า (valtype == integer.class) {val = double.valueof (val.toString ()). intvalue (); } อื่นถ้า (valtype == long.class) {val = double.valueof (val.toString ()). longValue (); } อื่นถ้า (valtype == double.class) {val = double.valueof (val.toString ()); } อื่นถ้า (valtype == float.class) {val = float.valueof (val.toString ()); } อื่นถ้า (valtype == date.class) {val = dateutil.getJavadate ((สองครั้ง) val); } else {ถ้า (ef.fieldType ()! = class.class) {val = ef.fieldType (). getMethod ("getValue", string.class) .invoke (null, val.tostring ()); } else {val = class.forName (this.getClass (). getName (). replaceall (this.getClass (). getSimplename (), "FieldType."+valtype.getSimplename ()+"type")) }}} catch (Exception Ex) {log.info ("รับค่าเซลล์ ["+i+","+คอลัมน์+"] ข้อผิดพลาด:"+ex.toString ()); val = null; } // ตั้งค่าเอนทิตีถ้า (OS [1] ฟิลด์อินสแตนซ์ของฟิลด์) {reflections.invokesetter (e, ((ฟิลด์) OS [1]). getName (), val); } อื่นถ้า (os [1] method ของอินสแตนซ์) {string mthodname = ((เมธอด) OS [1]). getName (); if ("get" .equals (mthodname.substring (0, 3))) {mthodname = "set"+stringutils.substringafter (mthodname, "get"); } reflections.invokemethod (e, mthodname, คลาสใหม่ [] {valtype}, วัตถุใหม่ [] {val}); }} sb.append (val+","); } datalist.add (e); log.debug ("อ่านความสำเร็จ: ["+i+"]"+sb.toString ()); } ส่งคืน Datalist; -导入测试
โมฆะคงที่สาธารณะหลัก (สตริง [] args) พ่นที่โยนได้ {importExcel ei = new importExcel ("target/export.xlsx", 1); สำหรับ (int i = ei.getDatarownum (); i <ei.getLastDatarownum (); i ++) {แถวแถว = ei.getrow (i); สำหรับ (int j = 0; j <ei.getLastCellNum (); j ++) {object val = ei.getCellValue (แถว, j); System.out.print (val+","); } system.out.print ("/n"); -