代码运行环境与导包问题

后端使用SpringMVC、Spring,如果是Springboot,则不用考虑配置问题

接收文件使用MultipartFile file(需单独配置解析器)

解析Execl通过导入 POI 的jar包解决

配置依赖

	//MultipartFile需要导入的依赖
	<dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.3.3</version>
    </dependency>
    //导入POI需要的依赖
    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi</artifactId>
      <version>3.6</version>
    </dependency>
    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi-ooxml</artifactId>
      <version>3.6</version>
    </dependency>

springmvc配置文件中,加上文件上传解析器

	<bean id="multipartResolver"
          class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="10485760"></property>
    </bean>

前端vue发送excel文件

可以参考我的另一篇博客:添加链接描述
https://blog.csdn.net/weixin_44452346/article/details/107613304

接收前端发送的excel文件

    public String fileupload( MultipartFile file, Model model)
            throws IOException, InterruptedException {
            
        System.out.println("接收到前端文件");
        //调用Read.excel方法,传入file文件进行解析
               

解析excel内容

此处需要说明的是文件格式问题
目前通常用到的excel文件有两种类型,一种是.xls、一种是.xlsx
.xls是excel2003的版本,比较老
.xlsx是2007之后的版本,兼容性更好,而且文件所占用的内存小了一倍。
推荐使用.xlsx这种文件类型,也是目前最常使用的

两种在解析上的主要区别是:
扩展名为.xls的话,workbook 对象要写成HSSFWorkbook
扩展名是.xlsx,workbook 对象要写成XSSFWorkbook

我是定义了一个类,便于接收这个形式的对象集合,在接收的时候好遍历集合,得到想要的类型传给前端。读者可以自行定义。

不足之处在于,我把excel表格中的类型全部处理为了字符串格式,因为全变为字符串比较简单。如果有date类型或者数字类型是需要添加条件选择,做出不同的方法对应。

//解析xlsx
public class Read {
    public static List<xxx> excel(MultipartFile file) {
        //定义一个空数组
        List <xxx> list = new ArrayList<>();
        //定义数组中的对象,全局可使用
        xxx xxx = null;
        try {
            //1. 创建一个 workbook 对象
            XSSFWorkbook workbook = new XSSFWorkbook(file.getInputStream());
            //2. 获取 workbook 中表单的数量
            int numberOfSheets = workbook.getNumberOfSheets();
            for (int i = 0; i < numberOfSheets; i++) {
            //3. 获取表单,先得到每一行,在得到每一列
            XSSFSheet sheet = workbook.getSheetAt(i);
            //4. 获取表单中的行数
            int physicalNumberOfRows = sheet.getPhysicalNumberOfRows();
                for (int j = 0; j < physicalNumberOfRows; j++) {
                    //5. 跳过标题行
                    if (j == 0) {
                    continue;//跳过标题行
                    }
                    //6. 获取行
                    XSSFRow row = sheet.getRow(j);
                        if (row == null) {
                            continue;//防止数据中间有空行
                        }
                     //7. 获取列数
                     int physicalNumberOfCells = row.getPhysicalNumberOfCells();

                    //循环获得每一行中每一列数据
                    xxx = new xxx();
                   for (int k = 0; k < physicalNumberOfCells; k++) {
                        XSSFCell cell = row.getCell(k);

                   //pridict里边的excell是数字型,要把先转换成String类型
                   if(cell != null){
                      cell.setCellType(Cell.CELL_TYPE_STRING);
                   }
                   String cellValue = cell.getStringCellValue();

                        //k为表示哪一列,用switch选择,把对应值加入对象中
                        switch (k) {
                            case 0:
                            
                                 break;
                            case 1:
                                
                                break;
                            case 2:
                               
                                break;
                           
                          ........

                            default:
                                System.out.println("default!");
                                break;
                        }
                    }
                    // 最后将解析后的数据,为csv对象,添加到List集合中
                    list.add(xxx);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return list;
    }
}

以对象集合的形式打印输出

        List <xxx> xxx = Read.excel(file);

        //定义全局变量,接收java解析出的数据,并给python发送
        String receive = "";

        // 遍历输出解析出的对象,格式可以通过tostring方法自行定义
        for ( xxx  xxx : list) {
            receive=csv.toString();
        }
        System.out.println(receive);
        System.out.println("文件解析了");

刚入门的小白,写的不足之处请多多指教,欢迎与我沟通交流!!!

Logo

前往低代码交流专区

更多推荐