base64文件上传Java解析表格并实例化

2023-05-16

excel表格文件怎么解析?别慌,Apache早已有解决方式。以下,从应用的角度实现Excel文件上传并解析

语言:Java、Vue

1.文件转base64格式传输

    <el-upload
            class="action-btn"
            :multiple="false"
            :show-file-list="false"
            :with-credentials="true"
            accept=".xlsx,.xls"
            name="file"
            :headers="headers"
            :http-request="uploadFileByBase64"
          >
            <el-button  >上传</el-button>
          </el-upload>
          <!-- headers根据条件添加,action -->
// 以base64格式进行文件上传
    uploadFileByBase64(file, fileList) {
      this.getBase64(file.file).then(async (res) => {
        const fileBase64 = res;
        const param = {
          fileName: file.file.name,
          fileStr: fileBase64, // 需要带上格式前缀
        };
        await api.uploadFile({
          param,
        }).then((v) => {
          this.$message.success('文件上传成功!');
          console.log('上传结果 v = ', v);
        }).catch((err) => {
          this.$message.warning('文件上传异常,请检查文件格式!');
        });
      });
    },
    // 文件转base64-- 摘抄自网络……
    getBase64(file) {
      return new Promise((resolve, reject) => {
        const reader = new FileReader();
        let fileResult = '';
        reader.readAsDataURL(file);
        // 开始转
        reader.onload = function () {
          fileResult = reader.result;
        };
        // 转失败
        reader.onerror = function (error) {
          reject(error);
        };
        // 成功
        reader.onloadend = function () {
          resolve(fileResult);
        };
      });
    },

为什么要使用base64字符串?

2.解析

2.1 base64 -> MultipartFile


public static MultipartFile base64ToMultipart(String fileStr) {
        try {
            String[] baseStr = fileStr.split(",");
            if(baseStr.length != 2) {
                log.error("base64ToMultipartToStream 输入base64字符串无文件前缀, fileStr = {}", fileStr);
                return null;
            }

            BASE64Decoder decoder = new BASE64Decoder();
            byte[] b = new byte[0];
            b = decoder.decodeBuffer(baseStr[1]);

            for(int i = 0; i < b.length; ++i) {
                if (b[i] < 0) {
                    b[i] += 256;
                }
            }

            return new BASE64DecodedMultipartFile(b, baseStr[0]);
        } catch (IOException e) {
            log.error("error")
        }
    }
    /**
     * 文件base64字符串 -> MultipartFile ->  字节数入流
     * (此处 fileStr 需要添加文件格式化后的前缀,例如 .xlsx base64字符的前缀:'data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,' )
     */

2.2 内容校验,实例化

使用apache提供工具包, 详情:https://mvnrepository.com/artifact/org.apache.poi

        <!--excel-xls-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.6</version>
        </dependency>
        <!--excel-xlsx-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.6</version>
        </dependency>

private List<BeanParam> readAndConstruct(InputStream file) {
        List<BeanParam> resultList = new ArrayList<>(); // 目标实体
        DecimalFormat decimalFormat = new DecimalFormat("0"); // 格式化数字
        try {
            // 当文件类型为.xls 使用HSSF
            //HSSFWorkbook xwb = new HSSFWorkbook(new POIFSFileSystem(file));
            //HSSFSheet sheet = xwb.getSheetAt(0);
            //HSSFRow row = null;
            //HSSFCell cell = null;

            // 当文件类型为.xlsx,使用XSSF
            OPCPackage pkg = OPCPackage.open(file);
            XSSFWorkbook xwb = new XSSFWorkbook(pkg);
            XSSFSheet sheet = xwb.getSheetAt(0);
            XSSFRow row = null; // 一行
            XSSFCell cell = null; // 一单元
            for (int i = sheet.getFirstRowNum() + 1; i <= sheet.getPhysicalNumberOfRows(); i++) {
                BeanParam vo = new BeanParam();
                row = sheet.getRow(i);
                if (row == null) {
                    continue;
                }
                String categoryStr = "";
                cell = row.getCell(0); // 得到第一行第一个单元格
                if(cell == null){
                    continue;
                }
                switch(cell.getCellType()){ // 类型
                    case HSSFCell.CELL_TYPE_STRING:
                        categoryStr = cell.getStringCellValue().trim();break;
                    case HSSFCell.CELL_TYPE_NUMERIC:
                        categoryStr = decimalFormat.format(cell.getNumericCellValue());break;
                    default:
                        categoryStr = cell.getStringCellValue().trim();break;
                }
                vo.setCateId(Long.parseLong(categoryStr));
               .
               .
               .
               .
               .
                cell = row.getCell(5);
                if(cell == null){
                    continue;
                }
                vo.setName(getValByCell(cell));
               .
               .
               .

                resultList.add(vo);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return resultList;
    }
    /**
    *通过这种方式,可对excel格式内容进行校验,同时将其实例化为目标对像
    *
    **/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

base64文件上传Java解析表格并实例化 的相关文章

  • 在Windows上安装Java 11 OpenJDK(系统路径问题)

    Java 11 最近发布了 众所周知 这个版本没有安装文件 当然 要在没有安装程序的情况下安装 Java 我将系统设置 PATH 和 JAVA HOME 设置为解压缩 Java 11 的文件夹的地址 根据对类似问题的已接受回复建议 唯一的事
  • 线程自动利用多个CPU核心?

    假设我的应用程序运行 2 个线程 例如渲染线程和游戏更新线程 如果它在具有多核 CPU 当今典型 的移动设备上运行 我是否可以期望线程在可能的情况下自动分配给不同的核心 我知道底层操作系统内核 Android linux内核 决定调度 我的
  • 解决错误:日志已在具有多个实例的atomikos中使用

    我仅在使用atomikos的实时服务器上遇到问题 在我的本地服务器上它工作得很好 我在服务器上面临的问题是 init 中出错 日志已在使用中 完整的异常堆栈跟踪 java lang RuntimeException Log already
  • Java8无符号算术

    据广泛报道 Java 8 具有对无符号整数的库支持 然而 似乎没有文章解释如何使用它以及有多少可能 有些函数 例如 Integer CompareUnsigned 很容易找到 并且似乎可以实现人们所期望的功能 但是 我什至无法编写一个简单的
  • Convert.FromBase64String 方法的 Java 等效项

    Java 中是否有相当于Convert FromBase64String http msdn microsoft com en us library system convert frombase64string aspx which 将指
  • java中删除字符串中的特殊字符?

    如何删除字符串中除 之外的特殊字符 现在我用 replaceAll w s 它删除了所有特殊字符 但我想保留 谁能告诉我我该怎么办 Use replaceAll w s 我所做的是将下划线和连字符添加到正则表达式中 我添加了一个 连字符之前
  • 一种使用 Java Robot API 和 Selenium WebDriver by Java 进行文件上传的解决方案

    我看到很多人在使用 Selenium WebDriver 的测试环境中上传文件时遇到问题 我使用 selenium WebDriver 和 java 也遇到了同样的问题 我终于找到了解决方案 所以我将其发布在这里希望对其他人有所帮助 当我需
  • hibernate总是自己删除表中的所有数据

    您好 我正在开发一个 spring mvc 应用程序 它使用 hibernate 连接到存储文件的 mysql 数据库 我有两个方法 一个方法添加我选择的特定文件路径中的所有文件 另一种方法调用查询以返回从 mysql 存储的文件列表 问题
  • 如何在jsp代码中导入java库?

    我有以下jsp代码 我想添加 java io 等库 我怎样才能做到这一点
  • 请求位置更新参数

    这就是 requestLocationUpdates 的样子 我使用它的方式 requestLocationUpdates String provider long minTime float minDistance LocationLis
  • 序列化对象以进行单元测试

    假设在单元测试中我需要一个对象 其中所有 50 个字段都设置了一些值 我不想手动设置所有这些字段 因为这需要时间而且很烦人 不知何故 我需要获得一个实例 其中所有字段都由一些非空值初始化 我有一个想法 如果我要调试一些代码 在某个时候我会得
  • 如何将文件透明地传输到浏览器?

    受控环境 IE8 IIS 7 ColdFusion 当从 IE 发出指向媒体文件 例如 mp3 mpeg 等 的 GET 请求时 浏览器将启动关联的应用程序 Window Media Player 我猜测 IIS 提供文件的方式允许应用程序
  • 应用程序关闭时的倒计时问题

    我制作了一个 CountDownTimer 代码 我希望 CountDownTimer 在完成时重新启动 即使应用程序已关闭 但它仅在应用程序正在运行或重新启动应用程序时重新启动 因此 如果我在倒计时为 00 10 分钟 秒 时关闭应用程序
  • Tomcat 6找不到mysql驱动

    这里有一个类似的问题 但关于类路径 ClassNotFoundException com mysql jdbc Driver https stackoverflow com questions 1585811 classnotfoundex
  • 休眠以持久保存日期

    有没有办法告诉 Hibernate java util Date 应该持久保存 我需要这个来解决 MySQL 中缺少的毫秒分辨率问题 您能想到这种方法有什么缺点吗 您可以自己创建字段long 或者使用自定义的UserType 实施后User
  • 如何修复“sessionFactory”或“hibernateTemplate”是必需的问题

    我正在使用 Spring Boot JPA WEB 和 MYSQL 创建我的 Web 应用程序 它总是说 sessionFactory or hibernateTemplate是必需的 我该如何修复它 我已经尝试过的东西 删除了本地 Mav
  • com.jcraft.jsch.JSchException:身份验证失败

    当我从本地磁盘上传文件到远程服务器时 出现这样的异常 com jcraft jsch JSchException Auth fail at org apache tools ant taskdefs optional ssh Scp exe
  • java8 Collectors.toMap() 限制?

    我正在尝试使用java8Collectors toMap on a Stream of ZipEntry 这可能不是最好的想法 因为在处理过程中可能会发生异常 但我想这应该是可能的 我现在收到一个我不明白的编译错误 我猜是类型推理引擎 这是
  • javax.persistence.Table.indexes()[Ljavax/persistence/Index 中的 NoSuchMethodError

    我有一个 Play Framework 应用程序 并且我was使用 Hibernate 4 2 5 Final 通过 Maven 依赖项管理器检索 我决定升级到 Hibernate 4 3 0 Final 成功重新编译我的应用程序并运行它
  • Jackson 将单个项目反序列化到列表中

    我正在尝试使用一项服务 该服务为我提供了一个带有数组字段的实体 id 23233 items name item 1 name item 2 但是 当数组包含单个项目时 将返回该项目本身 而不是包含一个元素的数组 id 43567 item

随机推荐