zoukankan      html  css  js  c++  java
  • 转:java 解析excel,带合并单元的excel

      收集了一些对博主有帮助的博文,如下

    >>>>>>>>>>>第一部分:

    首先,mavn导入jar包

    <!-- 解析excel需要导入的 jar包    begin -->
              <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi</artifactId>
                <version>3.11</version>
            </dependency>
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml</artifactId>
                <version>3.11</version>
            </dependency>
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml-schemas</artifactId>
                <version>3.11</version>
            </dependency>
              <dependency>
                <groupId>stax</groupId>
                <artifactId>stax-api</artifactId>
                <version>1.0.1</version>
            </dependency>
            <dependency>
                <groupId>org.apache.xmlbeans</groupId>
                <artifactId>xmlbeans</artifactId>
                <version>2.6.0</version>
            </dependency>
              <!-- 解析excel需要导入的 jar包    end -->

    其次,代码如下:

    package excel;

    import java.io.File;  
    import java.io.IOException;  
      
    import org.apache.poi.openxml4j.exceptions.InvalidFormatException;  
    import org.apache.poi.ss.usermodel.Cell;  
    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;  
    import org.apache.poi.ss.util.CellRangeAddress;  
    import org.junit.Test;  
      
    /**  
    *   
    @author  wcyong  
    *  
    * @date   2013-6-21  
    */  
    public class TestReadMergeRegionExcel {  
      
        
        @Test   
        public void testReadExcel() {  
            readExcelToObj("C:\Users\Administrator\Desktop\11.xls");  
        }  
          
        /**  
        * 读取excel数据  
        * @param  path  
        */  
        private void readExcelToObj(String path) {  
          
            Workbook wb = null;  
            try {  
                wb = WorkbookFactory.create(new File(path));  
                readExcel(wb, 0, 0, 0);  
            } catch (InvalidFormatException e) {  
                e.printStackTrace();  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
        }  
          
        /**  
        * 读取excel文件  
        * @param  wb   
        * @param sheetIndex sheet页下标:从0开始  
        * @param startReadLine 开始读取的行:从0开始  
        * @param tailLine 去除最后读取的行  
        */  
        private void readExcel(Workbook wb,int sheetIndex, int startReadLine, int tailLine) {  
            
            Sheet sheet = wb.getSheetAt(sheetIndex);  
            Row row = null;  
              
            for(int i=startReadLine; i<sheet.getLastRowNum()-tailLine+1; i++) {  
                
                row = sheet.getRow(i); 
                for(Cell c : row) {  
                    c.setCellType(Cell.CELL_TYPE_STRING);
                    boolean isMerge = isMergedRegion(sheet, i, c.getColumnIndex());  
                    //判断是否具有合并单元格  
                    if(isMerge) {  
                        String rs = getMergedRegionValue(sheet, row.getRowNum(), c.getColumnIndex());  
                        System.out.print(rs + "  ");  
                    }else {  
                        System.out.print(c.getRichStringCellValue()+"  ");  
                    }  
                }  
                System.out.println();  
                  
            }  
          
        }  
          
        /**   
        * 获取合并单元格的值   
        * @param sheet   
        * @param row   
        * @param column   
        * @return   
        */    
        public String getMergedRegionValue(Sheet sheet ,int row , int column){    
            
            int sheetMergeCount = sheet.getNumMergedRegions();    
                
            for(int i = 0 ; i < sheetMergeCount ; i++){    
                CellRangeAddress ca = sheet.getMergedRegion(i);    
                int firstColumn = ca.getFirstColumn();    
                int lastColumn = ca.getLastColumn();    
                int firstRow = ca.getFirstRow();    
                int lastRow = ca.getLastRow();    
                    
                if(row >= firstRow && row <= lastRow){    
                        
                    if(column >= firstColumn && column <= lastColumn){    
                        Row fRow = sheet.getRow(firstRow);    
                        Cell fCell = fRow.getCell(firstColumn);    
                        return getCellValue(fCell) ;    
                    }    
                }    
            }    
                
            return null ;    
        }    
          
        /**  
        * 判断合并了行  
        * @param sheet  
        * @param row  
        * @param column  
        * @return  
        */  
        private boolean isMergedRow(Sheet sheet,int row ,int column) {  
          
          int sheetMergeCount = sheet.getNumMergedRegions();  
          for (int i = 0; i < sheetMergeCount; i++) {  
            CellRangeAddress range = sheet.getMergedRegion(i);  
            int firstColumn = range.getFirstColumn();  
            int lastColumn = range.getLastColumn();  
            int firstRow = range.getFirstRow();  
            int lastRow = range.getLastRow();  
            if(row == firstRow && row == lastRow){  
                if(column >= firstColumn && column <= lastColumn){  
                    return true;  
                }  
            }  
          }  
          return false;  
        }  
          
        /**  
        * 判断指定的单元格是否是合并单元格  
        * @param sheet   
        * @param row 行下标  
        * @param column 列下标  
        * @return  
        */  
        private boolean isMergedRegion(Sheet sheet,int row ,int column) {  
          
          int sheetMergeCount = sheet.getNumMergedRegions();  
          for (int i = 0; i < sheetMergeCount; i++) {  
            
            CellRangeAddress range = sheet.getMergedRegion(i);  
            int firstColumn = range.getFirstColumn();  
            int lastColumn = range.getLastColumn();  
            int firstRow = range.getFirstRow();  
            int lastRow = range.getLastRow();  
            if(row >= firstRow && row <= lastRow){  
                if(column >= firstColumn && column <= lastColumn){  
                    return true;  
                }  
            }  
          }  
          return false;  
        }  
          
        /**  
        * 判断sheet页中是否含有合并单元格   
        * @param sheet   
        * @return  
        */  
        private boolean hasMerged(Sheet sheet) {  
                return sheet.getNumMergedRegions() > 0 ? true : false;  
        }  
          
        /**  
        * 合并单元格  
        * @param sheet   
        * @param firstRow 开始行  
        * @param lastRow 结束行  
        * @param firstCol 开始列  
        * @param lastCol 结束列  
        */  
        private void mergeRegion(Sheet sheet, int firstRow, int lastRow, int firstCol, int lastCol) {  
            sheet.addMergedRegion(new CellRangeAddress(firstRow, lastRow, firstCol, lastCol));  
        }  
          
        /**   
        * 获取单元格的值   
        * @param cell   
        * @return   
        */    
        public String getCellValue(Cell cell){    
                
            if(cell == null) return "";    
                
            if(cell.getCellType() == Cell.CELL_TYPE_STRING){    
                    
                return cell.getStringCellValue();    
                    
            }else if(cell.getCellType() == Cell.CELL_TYPE_BOOLEAN){    
                    
                return String.valueOf(cell.getBooleanCellValue());    
                    
            }else if(cell.getCellType() == Cell.CELL_TYPE_FORMULA){    
                    
                return cell.getCellFormula() ;    
                    
            }else if(cell.getCellType() == Cell.CELL_TYPE_NUMERIC){    
                    
                return String.valueOf(cell.getNumericCellValue());    
                    
            }    
            return "";    
        }    

    >>>>>>>>>>>第二部分:

    通过这个例子,演示以下如何用java生成excel文件:
    import org.apache.poi.hssf.usermodel.*;
    import java.io.FileOutputStream;
    import java.io.IOException;
    publicclass CreateCells
    {
    publicstaticvoid main(String[] args)
    throws IOException
    {
    HSSFWorkbook wb = new HSSFWorkbook();//建立新HSSFWorkbook对象
    HSSFSheet sheet = wb.createSheet("new sheet");//建立新的sheet对象
    // Create a row and put some cells in it. Rows are 0 based.
    HSSFRow row = sheet.createRow((short)0);//建立新行
    // Create a cell and put a value in it.
    HSSFCell cell = row.createCell((short)0);//建立新cell
    cell.setCellValue(1);//设置cell的整数类型的值
    // Or do it on one line.
    row.createCell((short)1).setCellValue(1.2);//设置cell浮点类型的值
    row.createCell((short)2).setCellValue("test");//设置cell字符类型的值
    row.createCell((short)3).setCellValue(true);//设置cell布尔类型的值
    HSSFCellStyle cellStyle = wb.createCellStyle();//建立新的cell样式
    cellStyle.setDataFormat(HSSFDataFormat.getFormat("m/d/yy h:mm"));//设置cell样式为定制的日期格式
    HSSFCell dCell =row.createCell((short)4);
    dCell.setCellValue(new Date());//设置cell为日期类型的值
    dCell.setCellStyle(cellStyle); //设置该cell日期的显示格式
    HSSFCell csCell =row.createCell((short)5);
    csCell.setEncoding(HSSFCell.ENCODING_UTF_16);//设置cell编码解决中文高位字节截断
    csCell.setCellValue("中文测试_Chinese Words Test");//设置中西文结合字符串
    row.createCell((short)6).setCellType(HSSFCell.CELL_TYPE_ERROR);//建立错误cell
    // Write the output to a file
    FileOutputStream fileOut = new FileOutputStream("workbook.xls");
    wb.write(fileOut);
    fileOut.close();
    }
    }
    从以上例子,可以清楚的看到xls文件从大到小包扩了 HSSFWorkbook HSSFSheet HSSFRow HSSFCell这样几个对象。还可以在cell中设置各种类型的值。尤其要注意的是如果你想正确的显示非欧美的字符时,尤其象中日韩这样的语言,必须 设置编码为16位的即是HSSFCell.ENCODING_UTF_16,才能保证字符的高8位不被截断而引起编码失真形成乱码。
    其他测试可以通过参考examples包中的测试例子掌握poi的详细用法,包括字体的设置,cell大小和低纹的设置等。需要注意的是POI是一 个仍然在完善中的公开代码的项目,所以有些功能正在不断的扩充。如HSSFSheet的getFooter() getHeader()和 setFooter(HSSFFooter hsf) setHeader(HSSFHeader hsh)是在POI1.7中才有的,而POI1.5中就没有。运行测试熟悉代码或者使用它做项目时请注意POI的版本。
    另外需要注意的是HSSF也有它的对xls基于事件的解析。可以参考例程中的EventExample.java。它通过实现 HSSFListener完成从普通流认知Xls中包含的内容,在apache Cocoon中的 org.apache.cocoon.serialization.HSSFSerializer中用到了这个解析。因为Cocoon2 是基于事件的,所以POI为了提供快速的解析也提供了相应的事件。当然我们自己也可以实现这个事件接口。
    因为POI还不是一个足够成熟的项目,所以有必要做进一步的开发和测试。但是它已经为我们用纯java操作ole2对象提供了可能,而且克服了ole对象调用的缺陷,提供了服务器端的Excel解决方案。
    利用Java 创建和读取Excel文档
    为了保证示例程序的运行,必须安装Java 2 sdk1.4.0 和Jakarta POI,Jakarta POI的Web站点是: http://jakarta.apache.org/poi/
    示例1将演示如何利用Jakarta POI API 创建Excel 文档。
    示例1程序如下:
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.hssf.usermodel.HSSFSheet;
    import org.apache.poi.hssf.usermodel.HSSFRow;
    import org.apache.poi.hssf.usermodel.HSSFCell;
    import java.io.FileOutputStream;
    publicclass CreateXL {
    /** Excel 文件要存放的位置,假定在D盘JTest目录下*/
    publicstatic String outputFile="D:/JTest/ gongye.xls";
    publicstaticvoid main(String argv[])
    {
    try
    {
    // 创建新的Excel 工作簿
    HSSFWorkbook workbook = new HSSFWorkbook();
    // 在Excel工作簿中建一工作表,其名为缺省值
    // 如要新建一名为"效益指标"的工作表,其语句为:
    // HSSFSheet sheet = workbook.createSheet("效益指标");
    HSSFSheet sheet = workbook.createSheet();
    // 在索引0的位置创建行(最顶端的行)
    HSSFRow row = sheet.createRow((short)0);
    //在索引0的位置创建单元格(左上端)
    HSSFCell cell = row.createCell((short) 0);
    // 定义单元格为字符串类型
    cell.setCellType(HSSFCell.CELL_TYPE_STRING);
    // 在单元格中输入一些内容
    cell.setCellValue("增加值");
    // 新建一输出文件流
    FileOutputStream fOut = new FileOutputStream(outputFile);
    // 把相应的Excel 工作簿存盘
    workbook.write(fOut);
    fOut.flush();
    // 操作结束,关闭文件
    fOut.close();
    System.out.println("文件生成...");
    }catch(Exception e) {
    System.out.println("已运行 xlCreate() : " + e );
    }
    }
    }
    这里演示创建和设置字体和单元格的格式,然后再应用这些格式:

    1、创建字体,设置其为红色、粗体:
    HSSFFont font = workbook.createFont();
    font.setColor(HSSFFont.COLOR_RED);
    font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
    2、创建格式
    HSSFCellStyle cellStyle= workbook.createCellStyle();
    cellStyle.setFont(font);
    3、应用格式
    HSSFCell cell = row.createCell((short) 0);
    cell.setCellStyle(cellStyle);
    cell.setCellType(HSSFCell.CELL_TYPE_STRING);
    cell.setCellValue("标题 ");

    总之,如本篇文章所演示的一样,Java程序员不必担心Excel工作表中的数据了,利用Jakarta POI API, 就可以轻易的在程序中存取Excel文档。



    >>>>>>>>>>>第三部分:


    利用java操作Excel,有个开源的东东-jxl.jar,可以到http://sourceforge.net/project/showfiles.php?group_id=79926下载。

    一.读取Excel文件内容

    java 代码
    1.   
    2. public static String readExcel(File file){   
    3.     StringBuffer sb = new StringBuffer();   
    4.        
    5.     Workbook wb = null;   
    6.     try {   
    7.         //构造Workbook(工作薄)对象   
    8.         wb=Workbook.getWorkbook(file);   
    9.     } catch (BiffException e) {   
    10.         e.printStackTrace();   
    11.     } catch (IOException e) {   
    12.         e.printStackTrace();   
    13.     }   
    14.        
    15.     if(wb==null)   
    16.         return null;   
    17.        
    18.     //获得了Workbook对象之后,就可以通过它得到Sheet(工作表)对象了   
    19.     Sheet[] sheet = wb.getSheets();   
    20.        
    21.     if(sheet!=null&&sheet.length>0){   
    22.         //对每个工作表进行循环   
    23.         for(int i=0;i
    24.             //得到当前工作表的行数   
    25.             int rowNum = sheet[i].getRows();   
    26.             for(int j=0;j
    27.                 //得到当前行的所有单元格   
    28.                 Cell[] cells = sheet[i].getRow(j);   
    29.                 if(cells!=null&&cells.length>0){   
    30.                     //对每个单元格进行循环   
    31.                     for(int k=0;k
    32.                         //读取当前单元格的值   
    33.                         String cellValue = cells[k].getContents();   
    34.                         sb.append(cellValue+" ");   
    35.                     }   
    36.                 }   
    37.                 sb.append(" ");   
    38.             }   
    39.             sb.append(" ");   
    40.         }   
    41.     }   
    42.     //最后关闭资源,释放内存   
    43.     wb.close();   
    44.     return sb.toString();   
    45. }  

    二.写入Excel文件

    这里有很多格式了,比如文本内容加粗,加上某些颜色等,可以参考jxl的api,同时还推荐一篇不错的文章:http://www.ibm.com/developerworks/cn/java/l-javaExcel/?ca=j-t10

    java 代码
    1.   
    2.     public static void writeExcel(String fileName){   
    3.         WritableWorkbook wwb = null;   
    4.         try {   
    5.             //首先要使用Workbook类的工厂方法创建一个可写入的工作薄(Workbook)对象   
    6.             wwb = Workbook.createWorkbook(new File(fileName));   
    7.         } catch (IOException e) {   
    8.             e.printStackTrace();   
    9.         }   
    10.         if(wwb!=null){   
    11.             //创建一个可写入的工作表   
    12.             //Workbook的createSheet方法有两个参数,第一个是工作表的名称,第二个是工作表在工作薄中的位置   
    13.             WritableSheet ws = wwb.createSheet("sheet1"0);   
    14.                
    15.             //下面开始添加单元格   
    16.             for(int i=0;i<10;i++){   
    17.                 for(int j=0;j<5;j++){   
    18.                     //这里需要注意的是,在Excel中,第一个参数表示列,第二个表示行   
    19.                     Label labelC = new Label(j, i, "这是第"+(i+1)+"行,第"+(j+1)+"列");   
    20.                     try {   
    21.                         //将生成的单元格添加到工作表中   
    22.                         ws.addCell(labelC);   
    23.                     } catch (RowsExceededException e) {   
    24.                         e.printStackTrace();   
    25.                     } catch (WriteException e) {   
    26.                         e.printStackTrace();   
    27.                     }   
    28.   
    29.                 }   
    30.             }   
    31.   
    32.             try {   
    33.                 //从内存中写入文件中   
    34.                 wwb.write();   
    35.                 //关闭资源,释放内存   
    36.                 wwb.close();   
    37.             } catch (IOException e) {   
    38.                 e.printStackTrace();   
    39.             } catch (WriteException e) {   
    40.                 e.printStackTrace();   
    41.             }   
    42.         }   
    43.     }   

    三.在一个Excel文件中查找是否包含某一个关键字

    java 代码
    1.   
    2.     public static boolean searchKeyWord(File file,String keyWord){   
    3.         boolean res = false;   
    4.            
    5.         Workbook wb = null;   
    6.         try {   
    7.             //构造Workbook(工作薄)对象   
    8.             wb=Workbook.getWorkbook(file);   
    9.         } catch (BiffException e) {   
    10.             return res;   
    11.         } catch (IOException e) {   
    12.             return res;   
    13.         }   
    14.            
    15.         if(wb==null)   
    16.             return res;   
    17.            
    18.         //获得了Workbook对象之后,就可以通过它得到Sheet(工作表)对象了   
    19.         Sheet[] sheet = wb.getSheets();   
    20.            
    21.         boolean breakSheet = false;   
    22.            
    23.         if(sheet!=null&&sheet.length>0){   
    24.             //对每个工作表进行循环   
    25.             for(int i=0;i
    26.                 if(breakSheet)   
    27.                     break;   
    28.                    
    29.                 //得到当前工作表的行数   
    30.                 int rowNum = sheet[i].getRows();   
    31.                    
    32.                 boolean breakRow = false;   
    33.                    
    34.                 for(int j=0;j
    35.                     if(breakRow)   
    36.                         break;   
    37.                     //得到当前行的所有单元格   
    38.                     Cell[] cells = sheet[i].getRow(j);   
    39.                     if(cells!=null&&cells.length>0){   
    40.                         boolean breakCell = false;   
    41.                         //对每个单元格进行循环   
    42.                         for(int k=0;k
    43.                             if(breakCell)   
    44.                                 break;   
    45.                             //读取当前单元格的值   
    46.                             String cellValue = cells[k].getContents();   
    47.                             if(cellValue==null)   
    48.                                 continue;   
    49.                             if(cellValue.contains(keyWord)){   
    50.                                 res = true;   
    51.                                 breakCell = true;   
    52.                                 breakRow = true;   
    53.                                 breakSheet = true;   
    54.                             }   
    55.                         }   
    56.                     }   
    57.                 }   
    58.             }   
    59.         }   
    60.         //最后关闭资源,释放内存   
    61.         wb.close();   
    62.            
    63.         return res;   
    64.     }  

    四.往Excel中插入图片图标

    插入图片的实现很容易,参看以下代码:

    java 代码
    1.   
    2. public static void insertImg(WritableSheet dataSheet, int col, int row, int width,   
    3.         int height, File imgFile){   
    4.     WritableImage img = new WritableImage(col, row, width, height, imgFile);   
    5.     dataSheet.addImage(img);   
    6. }   

    以上代码的注释已经很清楚了,大概也就不用再解释了,我们可以用如下程序验证:

    java 代码
    1.     try {   
    2.         //创建一个工作薄   
    3. WritableWorkbook workbook = Workbook.createWorkbook(new File("D:/test1.xls"));   
    4. //待插入的工作表   
    5. WritableSheet imgSheet = workbook.createSheet("Images",0);   
    6. //要插入的图片文件   
    7. File imgFile = new File("D:/1.png");   
    8. //图片插入到第二行第一个单元格,长宽各占六个单元格   
    9. insertImg(imgSheet,0,1,6,6,imgFile);   
    10. workbook.write();   
    11. workbook.close();   
    12.  catch (IOException e) {   
    13. e.printStackTrace();   
    14.  catch (WriteException e) {   
    15. e.printStackTrace();   

     但是jxl只支持png格式的图片,jpg格式和gif格式都不支持

    五.插入页眉页脚

    一般的页眉页脚都分为三个部分,左,中,右三部分,利用如下代码可实现插入页眉页脚

    java 代码
    1.   
    2. public static void setHeader(WritableSheet dataSheet,String left,String center,String right){   
    3.     HeaderFooter hf = new HeaderFooter();   
    4.     hf.getLeft().append(left);   
    5.     hf.getCentre().append(center);   
    6.     hf.getRight().append(right);   
    7.     //加入页眉   
    8.     dataSheet.getSettings().setHeader(hf);   
    9.     //加入页脚   
    10.     //dataSheet.getSettings().setFooter(hf);   
    11. }  

    我们可以用如下代码测试该方法:

    java 代码
    1.     try {   
    2.         //创建一个工作薄   
    3.     WritableWorkbook workbook = Workbook.createWorkbook(new File("D:/test1.xls"));   
    4.     //待插入的工作表   
    5.     WritableSheet dataSheet = workbook.createSheet("加入页眉",0);   
    6.     ExcelUtils.setHeader(dataSheet, "chb""2007-03-06""第1页,共3页");   
    7.     workbook.write();   
    8.     workbook.close();   
    9. catch (IOException e) {   
    10.     e.printStackTrace();   
    11. catch (WriteException e) {   
    12.     e.printStackTrace();   
    13. }   
    14.   }   

    合并单元格:

    //首先创建一个sheet

    WritableSheet sheetWrite=writeWorkbook.createSheet("sheet的名称",0);

    //把 单元格(column, row)到单元格(column1, row1)进行合并

    sheetWrite.mergeCells(column, row, column1, row1);

    java 操作excel,jxl加边框,jxl合并单元格,单元格的设置,单元

    WritableCellFormat headerFormat = new WritableCellFormat(
                        HEADER_FONT_STYLE);
                //水平居中对齐
                headerFormat.setAlignment(Alignment.CENTRE);
                //竖直方向居中对齐
                headerFormat.setVerticalAlignment

    (VerticalAlignment.CENTRE);
               
                //建立标签,参数依次为:列索引、行索引、内容、格式
                Label seqLabel = new Label(0, 0, "序号", headerFormat);
                //增加单元格
                sheet.addCell(seqLabel);
                //合并单元格,参数依次为:列索引、行索引、列索引+需要合并

    的列的个数、行索引+需要合并的行的个数
                sheet.mergeCells(0, 0, 0, 1);
                //设置单元格宽度,以字符为单位
                sheet.setColumnView(0, "序号".length() + 10);

                Label basicInfoLabel = new Label(1, 0, "基本信息",

    headerFormat);
                sheet.addCell(basicInfoLabel);
                sheet.mergeCells(1, 0, 3, 0);//合并垮了3行。

             sheet.mergeCells(1, 1, 1, 3);//合并垮了3列。

     

             label = new Label(0, 1, "苹果”);
             sheet.mergeCells(0,1, 0, 3- 1);//合并垮了3列。
             WritableCellFormat cellFormat = new WritableCellFormat();
             cellFormat.setVerticalAlignment(VerticalAlignment.CENTRE);

    // 垂直居中
             label.setCellFormat(cellFormat);
             sheet.addCell(label);

             注:再次使cellFormat时,需要重新NEW WritableCellFormat 。

     

  • 相关阅读:
    Django进阶Model篇006
    nginx 实现反向代理、负载均衡、高可用
    【springcloud】Zuul高级配置(zuul--3)
    【springcloud】Zuul高级配置(zuul--2)
    【springcloud】API Gateway 的路由和过滤(Zuul--1)
    【springcloud】服务熔断与降级(Hystrix)
    【springcloud】hystrix面试题
    时间复杂度On和空间复杂度O1是什么意思?
    2019年 Java 面试题解析
    【springcloud】模拟RPC调用(Feign)
  • 原文地址:https://www.cnblogs.com/jinloooong/p/7351612.html
Copyright © 2011-2022 走看看