欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java利用POI讀取、寫(xiě)入Excel的方法指南

 更新時(shí)間:2019年03月05日 10:15:03   作者:Dreamer-1  
這篇文章主要給大家介紹了關(guān)于Java利用POI讀取、寫(xiě)入Excel的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

Apache POI [1] 是用Java編寫(xiě)的免費(fèi)開(kāi)源的跨平臺(tái)的 Java API,Apache POI提供API給Java程式對(duì)Microsoft Office格式檔案讀和寫(xiě)的功能。POI為“Poor Obfuscation Implementation”的首字母縮寫(xiě),意為“簡(jiǎn)潔版的模糊實(shí)現(xiàn)”。

做項(xiàng)目時(shí)經(jīng)常有通過(guò)程序讀取Excel數(shù)據(jù),或是創(chuàng)建新的Excel并寫(xiě)入數(shù)據(jù)的需求;

網(wǎng)上很多經(jīng)驗(yàn)教程里使用的POI版本都比較老了,一些API在新版里已經(jīng)廢棄,這里基于最新的Apache POI 4.0.1版本來(lái)總結(jié)一下整個(gè)讀取和寫(xiě)入Excel的過(guò)程,希望能幫助到需要的人 ^_^

1. 準(zhǔn)備工作

1.1 在項(xiàng)目中引入Apache POI相關(guān)類(lèi)庫(kù)

引入 Apache POI 和 Apache POI-OOXML 這兩個(gè)類(lèi)庫(kù),Maven坐標(biāo)如下:

 <dependency>
 <groupId>org.apache.poi</groupId>
 <artifactId>poi</artifactId>
 <version>4.0.1</version>
 </dependency>
 <dependency>
 <groupId>org.apache.poi</groupId>
 <artifactId>poi-ooxml</artifactId>
 <version>4.0.1</version>
 </dependency>

2. 讀取或?qū)懭隕xcel數(shù)據(jù)

2.1 示例程序結(jié)構(gòu)說(shuō)明

簡(jiǎn)單說(shuō)明一下示例程序的整體結(jié)構(gòu):

  • ExcelReader.java是實(shí)現(xiàn)讀取Excel數(shù)據(jù)功能的類(lèi);
  • ExcelWriter.java是創(chuàng)建新的Excel并向其中寫(xiě)入數(shù)據(jù)的類(lèi);
  • ExcelDataVO.java封裝了讀取或?qū)懭霑r(shí)每一“行”的數(shù)據(jù);
  • MainTest.java是示例程序的入口類(lèi),其中演示了讀取和寫(xiě)入Excel數(shù)據(jù)的整個(gè)過(guò)程;

2.2 讀取數(shù)據(jù)

示例程序需要從桌面讀取 readExample.xlsx 內(nèi)的數(shù)據(jù),readExample.xlsx 的內(nèi)容如下:

讀取Excel時(shí)主要調(diào)用ExcelReader.java類(lèi)來(lái)讀取和解析Excel的具體內(nèi)容,這里以讀取系統(tǒng)文件的形式演示讀取過(guò)程:(兼容 xls 和 xlsx)

2.2.1 主程序入口類(lèi)代碼:

/**
 * Author: Dreamer-1
 * Date: 2019-03-01
 * Time: 10:13
 * Description: 示例程序入口類(lèi)
 */
public class MainTest {

 public static void main(String[] args) {
 // 設(shè)定Excel文件所在路徑
 String excelFileName = "/Users/Dreamer-1/Desktop/myBlog/java解析Excel/readExample.xlsx";
 // 讀取Excel文件內(nèi)容
 List<ExcelDataVO> readResult = ExcelReader.readExcel(excelFileName);
 
 // todo 進(jìn)行業(yè)務(wù)操作
 }

}

讀取和寫(xiě)入時(shí)封裝每一“行”數(shù)據(jù)的ExcelDataVO.java代碼如下:

/**
 * Author: Dreamer-1
 * Date: 2019-03-01
 * Time: 11:33
 * Description: 讀取Excel時(shí),封裝讀取的每一行的數(shù)據(jù)
 */
public class ExcelDataVO {

 /**
 * 姓名
 */
 private String name;

 /**
 * 年齡
 */
 private Integer age;

 /**
 * 居住地
 */
 private String location;

 /**
 * 職業(yè)
 */
 private String job;

 public String getName() {
 return name;
 }

 public void setName(String name) {
 this.name = name;
 }

 public Integer getAge() {
 return age;
 }

 public void setAge(Integer age) {
 this.age = age;
 }

 public String getLocation() {
 return location;
 }

 public void setLocation(String location) {
 this.location = location;
 }

 public String getJob() {
 return job;
 }

 public void setJob(String job) {
 this.job = job;
 }
}

2.2.2 Excel解析類(lèi)的代碼:

/**
 * Author: Dreamer-1
 * Date: 2019-03-01
 * Time: 10:21
 * Description: 讀取Excel內(nèi)容
 */
public class ExcelReader {

 private static Logger logger = Logger.getLogger(ExcelReader.class.getName()); // 日志打印類(lèi)

 private static final String XLS = "xls";
 private static final String XLSX = "xlsx";

 /**
 * 根據(jù)文件后綴名類(lèi)型獲取對(duì)應(yīng)的工作簿對(duì)象
 * @param inputStream 讀取文件的輸入流
 * @param fileType 文件后綴名類(lèi)型(xls或xlsx)
 * @return 包含文件數(shù)據(jù)的工作簿對(duì)象
 * @throws IOException
 */
 public static Workbook getWorkbook(InputStream inputStream, String fileType) throws IOException {
 Workbook workbook = null;
 if (fileType.equalsIgnoreCase(XLS)) {
  workbook = new HSSFWorkbook(inputStream);
 } else if (fileType.equalsIgnoreCase(XLSX)) {
  workbook = new XSSFWorkbook(inputStream);
 }
 return workbook;
 }

 /**
 * 讀取Excel文件內(nèi)容
 * @param fileName 要讀取的Excel文件所在路徑
 * @return 讀取結(jié)果列表,讀取失敗時(shí)返回null
 */
 public static List<ExcelDataVO> readExcel(String fileName) {

 Workbook workbook = null;
 FileInputStream inputStream = null;

 try {
  // 獲取Excel后綴名
  String fileType = fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length());
  // 獲取Excel文件
  File excelFile = new File(fileName);
  if (!excelFile.exists()) {
  logger.warning("指定的Excel文件不存在!");
  return null;
  }

  // 獲取Excel工作簿
  inputStream = new FileInputStream(excelFile);
  workbook = getWorkbook(inputStream, fileType);

  // 讀取excel中的數(shù)據(jù)
  List<ExcelDataVO> resultDataList = parseExcel(workbook);

  return resultDataList;
 } catch (Exception e) {
  logger.warning("解析Excel失敗,文件名:" + fileName + " 錯(cuò)誤信息:" + e.getMessage());
  return null;
 } finally {
  try {
  if (null != workbook) {
   workbook.close();
  }
  if (null != inputStream) {
   inputStream.close();
  }
  } catch (Exception e) {
  logger.warning("關(guān)閉數(shù)據(jù)流出錯(cuò)!錯(cuò)誤信息:" + e.getMessage());
  return null;
  }
 }
 }

 /**
 * 解析Excel數(shù)據(jù)
 * @param workbook Excel工作簿對(duì)象
 * @return 解析結(jié)果
 */
 private static List<ExcelDataVO> parseExcel(Workbook workbook) {
 List<ExcelDataVO> resultDataList = new ArrayList<>();
 // 解析sheet
 for (int sheetNum = 0; sheetNum < workbook.getNumberOfSheets(); sheetNum++) {
  Sheet sheet = workbook.getSheetAt(sheetNum);

  // 校驗(yàn)sheet是否合法
  if (sheet == null) {
  continue;
  }

  // 獲取第一行數(shù)據(jù)
  int firstRowNum = sheet.getFirstRowNum();
  Row firstRow = sheet.getRow(firstRowNum);
  if (null == firstRow) {
  logger.warning("解析Excel失敗,在第一行沒(méi)有讀取到任何數(shù)據(jù)!");
  }

  // 解析每一行的數(shù)據(jù),構(gòu)造數(shù)據(jù)對(duì)象
  int rowStart = firstRowNum + 1;
  int rowEnd = sheet.getPhysicalNumberOfRows();
  for (int rowNum = rowStart; rowNum < rowEnd; rowNum++) {
  Row row = sheet.getRow(rowNum);

  if (null == row) {
   continue;
  }

  ExcelDataVO resultData = convertRowToData(row);
  if (null == resultData) {
   logger.warning("第 " + row.getRowNum() + "行數(shù)據(jù)不合法,已忽略!");
   continue;
  }
  resultDataList.add(resultData);
  }
 }

 return resultDataList;
 }

 /**
 * 將單元格內(nèi)容轉(zhuǎn)換為字符串
 * @param cell
 * @return
 */
 private static String convertCellValueToString(Cell cell) {
 if(cell==null){
  return null;
 }
 String returnValue = null;
 switch (cell.getCellType()) {
  case NUMERIC: //數(shù)字
  Double doubleValue = cell.getNumericCellValue();

  // 格式化科學(xué)計(jì)數(shù)法,取一位整數(shù)
  DecimalFormat df = new DecimalFormat("0");
  returnValue = df.format(doubleValue);
  break;
  case STRING: //字符串
  returnValue = cell.getStringCellValue();
  break;
  case BOOLEAN: //布爾
  Boolean booleanValue = cell.getBooleanCellValue();
  returnValue = booleanValue.toString();
  break;
  case BLANK: // 空值
  break;
  case FORMULA: // 公式
  returnValue = cell.getCellFormula();
  break;
  case ERROR: // 故障
  break;
  default:
  break;
 }
 return returnValue;
 }

 /**
 * 提取每一行中需要的數(shù)據(jù),構(gòu)造成為一個(gè)結(jié)果數(shù)據(jù)對(duì)象
 *
 * 當(dāng)該行中有單元格的數(shù)據(jù)為空或不合法時(shí),忽略該行的數(shù)據(jù)
 *
 * @param row 行數(shù)據(jù)
 * @return 解析后的行數(shù)據(jù)對(duì)象,行數(shù)據(jù)錯(cuò)誤時(shí)返回null
 */
 private static ExcelDataVO convertRowToData(Row row) {
 ExcelDataVO resultData = new ExcelDataVO();

 Cell cell;
 int cellNum = 0;
 // 獲取姓名
 cell = row.getCell(cellNum++);
 String name = convertCellValueToString(cell);
 resultData.setName(name);
 // 獲取年齡
 cell = row.getCell(cellNum++);
 String ageStr = convertCellValueToString(cell);
 if (null == ageStr || "".equals(ageStr)) {
  // 年齡為空
  resultData.setAge(null);
 } else {
  resultData.setAge(Integer.parseInt(ageStr));
 }
 // 獲取居住地
 cell = row.getCell(cellNum++);
 String location = convertCellValueToString(cell);
 resultData.setLocation(location);
 // 獲取職業(yè)
 cell = row.getCell(cellNum++);
 String job = convertCellValueToString(cell);
 resultData.setJob(job);

 return resultData;
 }
}

2.2.3 應(yīng)用場(chǎng)景補(bǔ)充

一般我們會(huì)有這樣的應(yīng)用場(chǎng)景,即:在前臺(tái)頁(yè)面的文件上傳入口上傳本地的Excel文件到后臺(tái),后臺(tái)收到Excel文件后進(jìn)行解析并做對(duì)應(yīng)的業(yè)務(wù)操作;

這里假設(shè)前臺(tái)已經(jīng)有了上傳文件的入口,再簡(jiǎn)單貼一下后臺(tái)的解析代碼;

后臺(tái)接收前臺(tái)數(shù)據(jù)的Controller層代碼示例:

 @PostMapping("/uploadExcel")
 public ResponseEntity<?> uploadImage(MultipartFile file) {

  // 檢查前臺(tái)數(shù)據(jù)合法性
  if (null == file || file.isEmpty()) {
   logger.warning("上傳的Excel商品數(shù)據(jù)文件為空!上傳時(shí)間:" + new Date());
   return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
  }

  try {
   // 解析Excel
   List<ExcelDataVO> parsedResult = ExcelReader.readExcel(file);
   // todo 進(jìn)行業(yè)務(wù)操作

   return new ResponseEntity<>(HttpStatus.OK);
  } catch (Exception e) {
   logger.warning("上傳的Excel商品數(shù)據(jù)文件為空!上傳時(shí)間:" + new Date());
   return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
  }

 }

ExcelReader.java中的 readExcel() 方法需要做一定的修改,代碼如下:

 /**
  * 讀取Excel文件內(nèi)容
  * @param file 上傳的Excel文件
  * @return 讀取結(jié)果列表,讀取失敗時(shí)返回null
  */
 public static List<ExcelDataVO> readExcel(MultipartFile file) {

  Workbook workbook = null;

  try {
   // 獲取Excel后綴名
   String fileName = file.getOriginalFilename();
   if (fileName == null || fileName.isEmpty() || fileName.lastIndexOf(".") < 0) {
    logger.warning("解析Excel失敗,因?yàn)楂@取到的Excel文件名非法!");
    return null;
   }
   String fileType = fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length());

   // 獲取Excel工作簿
   workbook = getWorkbook(file.getInputStream(), fileType);

   // 讀取excel中的數(shù)據(jù)
   List<ExcelDataVO> resultDataList = parseExcel(workbook);

   return resultDataList;
  } catch (Exception e) {
   logger.warning("解析Excel失敗,文件名:" + file.getOriginalFilename() + " 錯(cuò)誤信息:" + e.getMessage());
   return null;
  } finally {
   try {
    if (null != workbook) {
     workbook.close();
    }
   } catch (Exception e) {
    logger.warning("關(guān)閉數(shù)據(jù)流出錯(cuò)!錯(cuò)誤信息:" + e.getMessage());
    return null;
   }
  }
 }

2.3 寫(xiě)入數(shù)據(jù)

寫(xiě)入數(shù)據(jù)時(shí)主要調(diào)用ExcelWriter.java來(lái)創(chuàng)建Excel工作簿對(duì)象并寫(xiě)入數(shù)據(jù),這里以寫(xiě)入系統(tǒng)文件數(shù)據(jù)為例演示寫(xiě)入的過(guò)程:

2.3.1 主程序入口類(lèi)代碼

/**
 * Author: Dreamer-1
 * Date: 2019-03-01
 * Time: 10:13
 * Description: 示例程序入口類(lèi)
 */
public class MainTest {

 private static Logger logger = Logger.getLogger(MainTest.class.getName());

 public static void main(String[] args) {
  // 創(chuàng)建需要寫(xiě)入的數(shù)據(jù)列表
  List<ExcelDataVO> dataVOList = new ArrayList<>(2);
  ExcelDataVO dataVO = new ExcelDataVO();
  dataVO.setName("小明");
  dataVO.setAge(18);
  dataVO.setLocation("廣州");
  dataVO.setJob("大學(xué)生");
  ExcelDataVO dataVO2 = new ExcelDataVO();
  dataVO2.setName("小花");
  dataVO2.setAge(19);
  dataVO2.setLocation("深圳");
  dataVO2.setJob("大學(xué)生");
  dataVOList.add(dataVO);
  dataVOList.add(dataVO2);

  // 寫(xiě)入數(shù)據(jù)到工作簿對(duì)象內(nèi)
  Workbook workbook = ExcelWriter.exportData(dataVOList);

  // 以文件的形式輸出工作簿對(duì)象
  FileOutputStream fileOut = null;
  try {
   String exportFilePath = "/Users/Dreamer-1/Desktop/myBlog/java解析Excel/writeExample.xlsx";
   File exportFile = new File(exportFilePath);
   if (!exportFile.exists()) {
    exportFile.createNewFile();
   }

   fileOut = new FileOutputStream(exportFilePath);
   workbook.write(fileOut);
   fileOut.flush();
  } catch (Exception e) {
   logger.warning("輸出Excel時(shí)發(fā)生錯(cuò)誤,錯(cuò)誤原因:" + e.getMessage());
  } finally {
   try {
    if (null != fileOut) {
     fileOut.close();
    }
    if (null != workbook) {
     workbook.close();
    }
   } catch (IOException e) {
    logger.warning("關(guān)閉輸出流時(shí)發(fā)生錯(cuò)誤,錯(cuò)誤原因:" + e.getMessage());
   }
  }

 }

}

2.3.2 寫(xiě)入Excel類(lèi)的代碼

ExcelWriter.java類(lèi)中,你可以根據(jù)實(shí)際需要替換 CELL_HEADS 列頭的信息,然后重寫(xiě) convertDataToRow 方法,轉(zhuǎn)換你自己的行數(shù)據(jù);

/**
 * Author: Dreamer-1
 * Date: 2019-03-01
 * Time: 11:09
 * Description: 生成Excel并寫(xiě)入數(shù)據(jù)
 */
public class ExcelWriter {

 private static List<String> CELL_HEADS; //列頭

 static{
  // 類(lèi)裝載時(shí)就載入指定好的列頭信息,如有需要,可以考慮做成動(dòng)態(tài)生成的列頭
  CELL_HEADS = new ArrayList<>();
  CELL_HEADS.add("姓名");
  CELL_HEADS.add("年齡");
  CELL_HEADS.add("居住城市");
  CELL_HEADS.add("職業(yè)");
 }

 /**
  * 生成Excel并寫(xiě)入數(shù)據(jù)信息
  * @param dataList 數(shù)據(jù)列表
  * @return 寫(xiě)入數(shù)據(jù)后的工作簿對(duì)象
  */
 public static Workbook exportData(List<ExcelDataVO> dataList){
  // 生成xlsx的Excel
  Workbook workbook = new SXSSFWorkbook();

  // 如需生成xls的Excel,請(qǐng)使用下面的工作簿對(duì)象,注意后續(xù)輸出時(shí)文件后綴名也需更改為xls
  //Workbook workbook = new HSSFWorkbook();

  // 生成Sheet表,寫(xiě)入第一行的列頭
  Sheet sheet = buildDataSheet(workbook);
  //構(gòu)建每行的數(shù)據(jù)內(nèi)容
  int rowNum = 1;
  for (Iterator<ExcelDataVO> it = dataList.iterator(); it.hasNext(); ) {
   ExcelDataVO data = it.next();
   if (data == null) {
    continue;
   }
   //輸出行數(shù)據(jù)
   Row row = sheet.createRow(rowNum++);
   convertDataToRow(data, row);
  }
  return workbook;
 }

 /**
  * 生成sheet表,并寫(xiě)入第一行數(shù)據(jù)(列頭)
  * @param workbook 工作簿對(duì)象
  * @return 已經(jīng)寫(xiě)入列頭的Sheet
  */
 private static Sheet buildDataSheet(Workbook workbook) {
  Sheet sheet = workbook.createSheet();
  // 設(shè)置列頭寬度
  for (int i=0; i<CELL_HEADS.size(); i++) {
   sheet.setColumnWidth(i, 4000);
  }
  // 設(shè)置默認(rèn)行高
  sheet.setDefaultRowHeight((short) 400);
  // 構(gòu)建頭單元格樣式
  CellStyle cellStyle = buildHeadCellStyle(sheet.getWorkbook());
  // 寫(xiě)入第一行各列的數(shù)據(jù)
  Row head = sheet.createRow(0);
  for (int i = 0; i < CELL_HEADS.size(); i++) {
   Cell cell = head.createCell(i);
   cell.setCellValue(CELL_HEADS.get(i));
   cell.setCellStyle(cellStyle);
  }
  return sheet;
 }

 /**
  * 設(shè)置第一行列頭的樣式
  * @param workbook 工作簿對(duì)象
  * @return 單元格樣式對(duì)象
  */
 private static CellStyle buildHeadCellStyle(Workbook workbook) {
  CellStyle style = workbook.createCellStyle();
  //對(duì)齊方式設(shè)置
  style.setAlignment(HorizontalAlignment.CENTER);
  //邊框顏色和寬度設(shè)置
  style.setBorderBottom(BorderStyle.THIN);
  style.setBottomBorderColor(IndexedColors.BLACK.getIndex()); // 下邊框
  style.setBorderLeft(BorderStyle.THIN);
  style.setLeftBorderColor(IndexedColors.BLACK.getIndex()); // 左邊框
  style.setBorderRight(BorderStyle.THIN);
  style.setRightBorderColor(IndexedColors.BLACK.getIndex()); // 右邊框
  style.setBorderTop(BorderStyle.THIN);
  style.setTopBorderColor(IndexedColors.BLACK.getIndex()); // 上邊框
  //設(shè)置背景顏色
  style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
  style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
  //粗體字設(shè)置
  Font font = workbook.createFont();
  font.setBold(true);
  style.setFont(font);
  return style;
 }

 /**
  * 將數(shù)據(jù)轉(zhuǎn)換成行
  * @param data 源數(shù)據(jù)
  * @param row 行對(duì)象
  * @return
  */
 private static void convertDataToRow(ExcelDataVO data, Row row){
  int cellNum = 0;
  Cell cell;
  // 姓名
  cell = row.createCell(cellNum++);
  cell.setCellValue(null == data.getName() ? "" : data.getName());
  // 年齡
  cell = row.createCell(cellNum++);
  if (null != data.getAge()) {
   cell.setCellValue(data.getAge());
  } else {
   cell.setCellValue("");
  }
  // 所在城市
  cell = row.createCell(cellNum++);
  cell.setCellValue(null == data.getLocation() ? "" : data.getLocation());
  // 職業(yè)
  cell = row.createCell(cellNum++);
  cell.setCellValue(null == data.getJob() ? "" : data.getJob());
 }
}

示例程序運(yùn)行后將會(huì)在指定的系統(tǒng)路徑下生成 writeExample.xlsx文件,其內(nèi)容如下:

2.3.3 應(yīng)用場(chǎng)景補(bǔ)充

一般寫(xiě)入Excel時(shí)會(huì)有這樣的場(chǎng)景:前臺(tái)頁(yè)面上有一個(gè)導(dǎo)出按鈕,點(diǎn)擊后將后臺(tái)某張表里的數(shù)據(jù)以Excel的形式導(dǎo)出,導(dǎo)出的Excel文件通過(guò)瀏覽器下載到用戶(hù)系統(tǒng)中;

這里默認(rèn)前臺(tái)頁(yè)面已經(jīng)有相應(yīng)的按鈕功能,給出對(duì)應(yīng)的Controller層代碼供參考:

 @GetMapping("/exportExcel")
 public void exportExcel(HttpServletRequest request, HttpServletResponse response) {
  Workbook workbook = null;
  OutputStream out = null;
  try {
   // todo 根據(jù)業(yè)務(wù)需求獲取需要寫(xiě)入Excel的數(shù)據(jù)列表 dataList

   // 生成Excel工作簿對(duì)象并寫(xiě)入數(shù)據(jù)
   workbook = ExcelWriter.exportData(dataList);

   // 寫(xiě)入Excel文件到前端
   if(null != workbook){
    String excelName = "示例Excel導(dǎo)出";
    String fileName = excelName + DateUtil.format(new Date(), DateUtil.SHORT_DATE) + ".xlsx";
    fileName = new String(fileName.getBytes("UTF-8"),"iso8859-1");
    response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
    response.setContentType("application/x-download");
    response.setCharacterEncoding("UTF-8");
    response.addHeader("Pargam", "no-cache");
    response.addHeader("Cache-Control", "no-cache");
    response.flushBuffer();
    out = response.getOutputStream();
    workbook.write(out);
    out.flush();
   }
  } catch (Exception e) {
   logger.WARNING("寫(xiě)入Excel過(guò)程出錯(cuò)!錯(cuò)誤原因:" + e.getMessage());
  } finally {
   try {
    if (null != workbook) {
     workbook.close();
    }
    if (null != out) {
     out.close();
    }
   } catch (IOException e) {
    logger.WARNING("關(guān)閉workbook或outputStream出錯(cuò)!");
   }
  }
 }
// 前臺(tái)頁(yè)面發(fā)送請(qǐng)求到后臺(tái)Controller時(shí)的JS代碼可參考:

var url = "/exportExcel";
window.location=url;

3. 源碼下載

點(diǎn)我哦.

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • 解決Mybatis-plus和pagehelper依賴(lài)沖突的方法示例

    解決Mybatis-plus和pagehelper依賴(lài)沖突的方法示例

    這篇文章主要介紹了解決Mybatis-plus和pagehelper依賴(lài)沖突的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • SpringBoot上傳文件大小受限問(wèn)題的解決辦法

    SpringBoot上傳文件大小受限問(wèn)題的解決辦法

    最近有一次由于項(xiàng)目升級(jí)發(fā)現(xiàn)了一個(gè)上傳方面的問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于SpringBoot上傳文件大小受限問(wèn)題的解決辦法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-05-05
  • SpringBoot整合Solr實(shí)現(xiàn)文檔檢索

    SpringBoot整合Solr實(shí)現(xiàn)文檔檢索

    Solr高度可靠、可擴(kuò)展和容錯(cuò),提供分布式索引、復(fù)制和負(fù)載平衡查詢(xún)、自動(dòng)故障轉(zhuǎn)移和恢復(fù)、集中配置等,Solr 為世界上許多最大的 Internet 站點(diǎn)的搜索和導(dǎo)航功能提供支持,本文將給大家介紹SpringBoot整合Solr實(shí)現(xiàn)文檔檢索,需要的朋友可以參考下
    2023-08-08
  • 親身體驗(yàn)Intellij?Idea從卡頓到順暢全過(guò)程

    親身體驗(yàn)Intellij?Idea從卡頓到順暢全過(guò)程

    這篇文章主要介紹了親身體驗(yàn)Intellij?Idea從卡頓到順暢全過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Java Scala偏函數(shù)與偏應(yīng)用函數(shù)超詳細(xì)講解

    Java Scala偏函數(shù)與偏應(yīng)用函數(shù)超詳細(xì)講解

    Scala是一種多范式的編程語(yǔ)言,支持面向?qū)ο蠛秃瘮?shù)式編程。Scala也支持異常處理,即在程序運(yùn)行過(guò)程中發(fā)生意外或錯(cuò)誤時(shí),采取相應(yīng)的措施
    2023-04-04
  • java利用遞歸調(diào)用實(shí)現(xiàn)樹(shù)形菜單的樣式

    java利用遞歸調(diào)用實(shí)現(xiàn)樹(shù)形菜單的樣式

    這篇文章主要給大家介紹了關(guān)于java利用遞歸調(diào)用實(shí)現(xiàn)樹(shù)形菜單樣式的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • 解讀@RabbitListener起作用的原理

    解讀@RabbitListener起作用的原理

    這篇文章主要介紹了解讀@RabbitListener起作用的原理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Spring Boot+Mybatis+Druid+PageHelper實(shí)現(xiàn)多數(shù)據(jù)源并分頁(yè)的方法

    Spring Boot+Mybatis+Druid+PageHelper實(shí)現(xiàn)多數(shù)據(jù)源并分頁(yè)的方法

    這篇文章主要給大家介紹了關(guān)于Spring Boot+Mybatis+Druid+PageHelper實(shí)現(xiàn)多數(shù)據(jù)源并分頁(yè)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們來(lái)一起看看吧
    2018-05-05
  • Java中的運(yùn)算符你知道多少

    Java中的運(yùn)算符你知道多少

    這篇文章主要為大家詳細(xì)介紹了Java中的運(yùn)算符,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-02-02
  • MAC?在類(lèi)路徑或引導(dǎo)類(lèi)路徑中找不到程序包?java.lang問(wèn)題

    MAC?在類(lèi)路徑或引導(dǎo)類(lèi)路徑中找不到程序包?java.lang問(wèn)題

    這篇文章主要介紹了MAC?在類(lèi)路徑或引導(dǎo)類(lèi)路徑中找不到程序包?java.lang問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11

最新評(píng)論