springboot中poi使用操作方法
在項(xiàng)目中,有很多對(duì)excel的操作,大都數(shù)時(shí)候我們都會(huì)使用poi工具類(lèi),本文將介紹poi的一些使用方法。
1.poi導(dǎo)入excel,并展示數(shù)據(jù)
使用poi導(dǎo)入excel,解析后返回List數(shù)據(jù)到前臺(tái)展示。
/** * * (讀入excel文件,解析后返回) * @param file(文件類(lèi)型) * @throws IOException * @return List<String[]> */ public static List<String[]> readExcel(MultipartFile file) throws IOException { // 檢查文件 checkFile(file); // 獲得Workbook工作薄對(duì)象 Workbook workbook = getWorkBook(file); // 創(chuàng)建返回對(duì)象,把每行中的值作為一個(gè)數(shù)組,所有行作為一個(gè)集合返回 List<String[]> list = new ArrayList<String[]>(); if (workbook != null) { for (int sheetNum = 0; sheetNum < workbook.getNumberOfSheets(); sheetNum++ ) { // 獲得當(dāng)前sheet工作表 Sheet sheet = workbook.getSheetAt(sheetNum); if (sheet == null) { continue; } // 獲得當(dāng)前sheet的開(kāi)始行 int firstRowNum = sheet.getFirstRowNum(); // 獲得當(dāng)前sheet的結(jié)束行 int lastRowNum = sheet.getLastRowNum(); // 循環(huán)除了第一行的所有行 for (int rowNum = firstRowNum + 1; rowNum <= lastRowNum; rowNum++ ) { // 獲得當(dāng)前行 Row row = sheet.getRow(rowNum); if (row == null) { continue; } // 獲得當(dāng)前行的開(kāi)始列 int firstCellNum = row.getFirstCellNum(); // 獲得當(dāng)前行的列數(shù) int lastCellNum = row.getLastCellNum(); String[] cells = new String[row.getLastCellNum()]; // 循環(huán)當(dāng)前行 for (int cellNum = firstCellNum; cellNum < lastCellNum; cellNum++ ) { Cell cell=row.getCell(cellNum, Row.MissingCellPolicy.RETURN_BLANK_AS_NULL); cells[cellNum] = getCellValue(cell); } list.add(cells); } } } return list; } /** * * (判斷文件) * @param file * @throws IOException * @return void */ public static void checkFile(MultipartFile file) throws IOException { // 判斷文件是否存在 if (null == file) { throw new FileNotFoundException("文件不存在!"); } // 獲得文件名 String fileName = file.getOriginalFilename(); // 判斷文件是否是excel文件 if (!fileName.endsWith(XLS_TYPE) && !fileName.endsWith(XLSX_TYPE)) { throw new IOException(fileName + "不是excel文件"); } } public static String getCellValue(Cell cell) { String cellValue = ""; if (cell == null) { return cellValue; } // 把數(shù)字當(dāng)成String來(lái)讀,避免出現(xiàn)1讀成1.0的情況 if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) { cell.setCellType(Cell.CELL_TYPE_STRING); } // 判斷數(shù)據(jù)的類(lèi)型 switch (cell.getCellType()) { // 數(shù)字 case Cell.CELL_TYPE_NUMERIC: cellValue = String.valueOf(cell.getNumericCellValue()); break; // 字符串 case Cell.CELL_TYPE_STRING: cellValue = String.valueOf(cell.getStringCellValue()); break; // Boolean case Cell.CELL_TYPE_BOOLEAN: cellValue = String.valueOf(cell.getBooleanCellValue()); break; // 公式 case Cell.CELL_TYPE_FORMULA: cellValue = String.valueOf(cell.getCellFormula()); break; // 空值 case Cell.CELL_TYPE_BLANK: cellValue = ""; break; // 故障 case Cell.CELL_TYPE_ERROR: cellValue = "非法字符"; break; default: cellValue = "未知類(lèi)型"; break; } return cellValue; } /** * * (getWorkBook:(創(chuàng)建WorkBook對(duì)象)) * @param file * @return * @return Workbook */ public static Workbook getWorkBook(MultipartFile file) { // 獲得文件名 String fileName = file.getOriginalFilename(); // 創(chuàng)建Workbook工作薄對(duì)象,表示整個(gè)excel Workbook workbook = null; try { // 獲取excel文件的io流 InputStream is = file.getInputStream(); // 根據(jù)文件后綴名不同(xls和xlsx)獲得不同的Workbook實(shí)現(xiàn)類(lèi)對(duì)象 if (fileName.endsWith(XLS_TYPE)) { // 2003 workbook = new HSSFWorkbook(is); } else if (fileName.endsWith(XLSX_TYPE)) { // 2007 workbook = new XSSFWorkbook(is); } } catch (IOException e) { e.printStackTrace(); } return workbook; }
2.poi導(dǎo)出excel并以web下載方式保存excel
將數(shù)據(jù)庫(kù)中的數(shù)據(jù)組裝成excel并導(dǎo)出,并在web下載欄中直接下載。
/** * 人員導(dǎo)出 * * @param sysSysUserVO * @throws IOException */ @PostMapping("/exportUser") @ApiOperation(value = "導(dǎo)出人員excel", notes = "導(dǎo)出人員excel") public void exportUser(@ApiParam(name = "人員id", value = "人員id", required = false) @RequestBody List<SysUserVO> sysSysUserVO) throws IOException { List<SysUserVO> middleList = new ArrayList<>(); // 查詢用戶詳細(xì)信息 for (SysUserVO sysUserVO : sysSysUserVO) { List<SysUserVO> resultListSysUser = sysUserService.querySysUserAll(sysUserVO); userInfoUtil.completionInformation(resultListSysUser.get(0)); middleList.add(resultListSysUser.get(0)); } // excle格式 String[] headers = {"用戶名", "姓名", "密碼", "啟動(dòng)狀態(tài)", "崗位", "角色", "所屬部門(mén)", "手機(jī)", "郵箱", "身份證號(hào)"}; HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.createSheet(); // 設(shè)置列寬 sheet.setDefaultColumnWidth((short)18); HSSFRow row = sheet.createRow(0); for (short i = 0; i < headers.length; i++) { // 創(chuàng)建單元格,每行多少數(shù)據(jù)就創(chuàng)建多少個(gè)單元格 HSSFCell cell = row.createCell(i); HSSFRichTextString text = new HSSFRichTextString(headers[i]); // 給單元格設(shè)置內(nèi)容 cell.setCellValue(text); } for (int j = 0; j < middleList.size(); j++) { SysUserVO export = middleList.get(j); // 從第二行開(kāi)始填充數(shù)據(jù) row = sheet.createRow(j + 1); List<String> datas = new ArrayList<>(); String userName = export.getUsername(); String trueName = export.getTureName(); String password = export.getPassword(); String status = String.valueOf(export.getIsEnabled()); String postName = export.getPostName(); String roleName = export.getRoleName(); String organName = export.getOrganizationName(); String phone = export.getMobile(); String email = export.getEmail(); String identityCard = export.getIdentityCard(); datas.add(userName); datas.add(trueName); datas.add(password); datas.add(status); datas.add(postName); datas.add(roleName); datas.add(organName); datas.add(phone); datas.add(email); datas.add(identityCard); for (int k = 0; k < datas.size(); k++) { String string = datas.get(k); HSSFCell cell = row.createCell(k); HSSFRichTextString richString = new HSSFRichTextString(string); HSSFFont font3 = workbook.createFont(); // 定義Excel數(shù)據(jù)顏色,這里設(shè)置為藍(lán)色 font3.setColor(HSSFColor.BLUE.index); richString.applyFont(font3); cell.setCellValue(richString); } } String fileName = "人員導(dǎo)出.xls"; // 導(dǎo)出 HttpServletResponse response = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getResponse(); RequestAttributes requsetAttributes = RequestContextHolder.currentRequestAttributes(); HttpServletRequest request = ((ServletRequestAttributes)requsetAttributes).getRequest(); // 獲得瀏覽器代理信息 final String userAgent = request.getHeader("USER-AGENT"); // 判斷瀏覽器代理并分別設(shè)置響應(yīng)給瀏覽器的編碼格式 if (StringUtils.contains(userAgent, "MSIE") || StringUtils.contains(userAgent, "Trident")) { // IE瀏覽器 fileName = URLEncoder.encode(fileName, "UTF-8"); } else if (StringUtils.contains(userAgent, "Mozilla")) { // google,火狐瀏覽器 fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1"); } else { // 其他瀏覽器 fileName = URLEncoder.encode(fileName, "UTF-8");// 其他瀏覽器 } // 設(shè)置HTTP響應(yīng)頭 response.reset(); // 重置 如果不在頁(yè)面上顯示而是下載下來(lái) 則放開(kāi)注釋 response.setContentType("application/octet-stream"); response.addHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\""); OutputStream os = response.getOutputStream(); workbook.write(os); os.close(); }
3.poi導(dǎo)出并以流方式保存excel
將數(shù)據(jù)庫(kù)中的數(shù)據(jù)組裝成excel并導(dǎo)出,并以數(shù)據(jù)流方式存在指定的路徑。
public class BarcodeExportlFlow implements IBarcodeExport { @Autowired BarcodeManageBatchSerivce barcodeManageBatchSerivce; @Override public OutputStream exportData() throws IOException { //查詢批次碼 BarcodeBatchManageBo input = new BarcodeBatchManageBo(); List<BarcodeBatchManageBo> middleList = barcodeManageBatchSerivce.selectBatch(input); String[] headers = {"id", "條碼批次碼", "激活狀態(tài)", "有效狀態(tài)", "導(dǎo)入人", "導(dǎo)入時(shí)間", "激活人", "激活時(shí)間", "作廢人", "作廢時(shí)間", "本批次條數(shù)"}; HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.createSheet(); //設(shè)置列寬 sheet.setDefaultColumnWidth((short) 18); HSSFRow row = sheet.createRow(0); for (short i = 0; i < headers.length; i++) { //創(chuàng)建單元格,每行多少數(shù)據(jù)就創(chuàng)建多少個(gè)單元格 HSSFCell cell = row.createCell(i); HSSFRichTextString text = new HSSFRichTextString(headers[i]); //給單元格設(shè)置內(nèi)容 cell.setCellValue(text); } for (int j = 0; j < middleList.size(); j++) { BarcodeBatchManageBo export = middleList.get(j); //從第二行開(kāi)始填充數(shù)據(jù) row = sheet.createRow(j + 1); List<String> datas = new ArrayList<>(); String id = export.getId().toString(); String batchCode = export.getBatchCode(); String activationStatus = export.getActivationStatus(); String effectiveStatus = export.getEffectiveStatus(); datas.add(id); datas.add(batchCode); datas.add(activationStatus); datas.add(effectiveStatus); for (int k = 0; k < datas.size(); k++) { String string = datas.get(k); HSSFCell cell = row.createCell(k); HSSFRichTextString richString = new HSSFRichTextString(string); HSSFFont font3 = workbook.createFont(); //定義Excel數(shù)據(jù)顏色,這里設(shè)置為藍(lán)色 font3.setColor(HSSFColor.BLUE.index); richString.applyFont(font3); cell.setCellValue(richString); } } FileOutputStream fos = new FileOutputStream("D:/wb.xls"); workbook.write(fos); fos.close(); return null; } }
到此這篇關(guān)于springboot中poi操作合集的文章就介紹到這了,更多相關(guān)springboot poi操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot中使用?POI的示例代碼
- SpringBoot EasyPoi動(dòng)態(tài)導(dǎo)入導(dǎo)出的兩種方式實(shí)現(xiàn)方法詳解
- SpringBoot如何基于POI-tl和word模板導(dǎo)出龐大的Word文件
- SpringBoot集成POI實(shí)現(xiàn)Excel導(dǎo)入導(dǎo)出的示例詳解
- SpringBoot?AOP?@Pointcut切入點(diǎn)表達(dá)式排除某些類(lèi)方式
- springboot?aop里的@Pointcut()的配置方式
- springboot中EasyPoi實(shí)現(xiàn)自動(dòng)新增序號(hào)的方法
- 淺談springboot之JoinPoint的getSignature方法
- SpringBoot中使用JeecgBoot的Autopoi導(dǎo)出Excel的方法步驟
相關(guān)文章
SpringBoot的Admin服務(wù)監(jiān)控詳解
這篇文章主要介紹了SpringBoot的Admin服務(wù)監(jiān)控詳解,Spring Boot Admin(SBA)是一個(gè)開(kāi)源的社區(qū)項(xiàng)目,用于管理和監(jiān)控 Spring Boot 應(yīng)用程序,需要的朋友可以參考下2024-01-01Java實(shí)現(xiàn)簡(jiǎn)單的斗地主游戲
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)單的斗地主游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04springboot如何實(shí)現(xiàn)前后端分離跨域訪問(wèn)
這篇文章主要介紹了springboot如何實(shí)現(xiàn)前后端分離跨域訪問(wèn)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12應(yīng)用Java泛型和反射導(dǎo)出CSV文件的方法
這篇文章主要介紹了應(yīng)用Java泛型和反射導(dǎo)出CSV文件的方法,通過(guò)一個(gè)自定義函數(shù)結(jié)合泛型與反射的應(yīng)用實(shí)現(xiàn)導(dǎo)出CSV文件的功能,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2014-12-12Java 匿名對(duì)象與匿名內(nèi)部類(lèi)的使用
很多小伙伴對(duì)匿名對(duì)象和匿名內(nèi)部類(lèi)的寫(xiě)法有點(diǎn)陌生,本文主要介紹了Java 匿名對(duì)象與匿名內(nèi)部類(lèi)的使用,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01Kafka日志清理實(shí)現(xiàn)詳細(xì)過(guò)程講解
這篇文章主要為大家介紹了Kafka日志清理實(shí)現(xiàn)詳細(xì)過(guò)程講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05Java 數(shù)據(jù)結(jié)構(gòu)之刪除鏈表中重復(fù)的結(jié)點(diǎn)
在一個(gè)排序的鏈表中,會(huì)存在重復(fù)的結(jié)點(diǎn),如何實(shí)現(xiàn)刪除該鏈表中重復(fù)的結(jié)點(diǎn),重復(fù)的結(jié)點(diǎn)不保留,并返回鏈表頭指針呢?接下來(lái)小編將帶你詳細(xì)介紹2021-12-12Struts2通過(guò)自定義標(biāo)簽實(shí)現(xiàn)權(quán)限控制的方法
這篇文章主要介紹了Struts2通過(guò)自定義標(biāo)簽實(shí)現(xiàn)權(quán)限控制的方法,介紹了定義Struts2的自定義標(biāo)簽的三個(gè)步驟以及詳細(xì)解釋?zhuān)枰呐笥芽梢詤⒖枷隆?/div> 2017-09-09Spring Boot 整合mybatis 與 swagger2
之前使用springMVC+spring+mybatis,總是被一些繁瑣的xml配置,還經(jīng)常出錯(cuò),下面把以前的一些ssm項(xiàng)目改成了spring boot + mybatis,相對(duì)于來(lái)說(shuō)優(yōu)點(diǎn)太明顯了,具體內(nèi)容詳情大家通過(guò)本文學(xué)習(xí)吧2017-08-08最新評(píng)論