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解析表格并实例化 的相关文章

  • Spring Batch 多线程 - 如何使每个线程读取唯一的记录?

    这个问题在很多论坛上都被问过很多次了 但我没有看到适合我的答案 我正在尝试在我的 Spring Batch 实现中实现多线程步骤 有一个包含 100k 条记录的临时表 想要在 10 个线程中处理它 每个线程的提交间隔为 300 因此在任何时
  • 如何默认将 Maven 插件附加到阶段?

    我有一个 Maven 插件应该在编译阶段运行 所以在项目中consumes我的插件 我必须做这样的事情
  • Java - 将节点添加到列表的末尾?

    这是我所拥有的 public class Node Object data Node next Node Object data Node next this data data this next next public Object g
  • 如何找到给定字符串的最长重复子串

    我是java新手 我被分配寻找字符串的最长子字符串 我在网上研究 似乎解决这个问题的好方法是实现后缀树 请告诉我如何做到这一点或者您是否有任何其他解决方案 请记住 这应该是在 Java 知识水平较低的情况下完成的 提前致谢 附 测试仪字符串
  • 制作一个交互式Windows服务

    我希望我的 Java 应用程序成为交互式 Windows 服务 用户登录时具有 GUI 的 Windows 服务 我搜索了这个 我发现这样做的方法是有两个程序 第一个是服务 第二个是 GUI 程序并使它们进行通信 服务将从 GUI 程序获取
  • JavaMail 只获取新邮件

    我想知道是否有一种方法可以在javamail中只获取新消息 例如 在初始加载时 获取收件箱中的所有消息并存储它们 然后 每当应用程序再次加载时 仅获取新消息 而不是再次重新加载它们 javamail 可以做到这一点吗 它是如何工作的 一些背
  • 无法解析插件 Java Spring

    我正在使用 IntelliJ IDEA 并且我尝试通过 maven 安装依赖项 但它给了我这些错误 Cannot resolve plugin org apache maven plugins maven clean plugin 3 0
  • 斯坦福 NLP - 处理文件列表时 OpenIE 内存不足

    我正在尝试使用斯坦福 CoreNLP 中的 OpenIE 工具从多个文件中提取信息 当多个文件 而不是一个 传递到输入时 它会给出内存不足错误 All files have been queued awaiting termination
  • 从 127.0.0.1 到 2130706433,然后再返回

    使用标准 Java 库 从 IPV4 地址的点分字符串表示形式获取的最快方法是什么 127 0 0 1 到等效的整数表示 2130706433 相应地 反转所述操作的最快方法是什么 从整数开始2130706433到字符串表示形式 127 0
  • JRE 系统库 [WebSphere v6.1 JRE](未绑定)

    将项目导入 Eclipse 后 我的构建路径中出现以下错误 JRE System Library WebSphere v6 1 JRE unbound 谁知道怎么修它 右键单击项目 特性 gt Java 构建路径 gt 图书馆 gt JRE
  • 使用Caliper时如何指定命令行?

    我发现 Google 的微型基准测试项目 Caliper 非常有趣 但文档仍然 除了一些示例 完全不存在 我有两种不同的情况 需要影响 JVM Caliper 启动的命令行 我需要设置一些固定 最好在几个固定值之间交替 D 参数 我需要指定
  • 加密 JBoss 配置中的敏感信息

    JBoss 中的标准数据源配置要求数据库用户的用户名和密码位于 xxx ds xml 文件中 如果我将数据源定义为 c3p0 mbean 我会遇到同样的问题 是否有标准方法来加密用户和密码 保存密钥的好地方是什么 这当然也与 tomcat
  • 如何在 javadoc 中使用“<”和“>”而不进行格式化?

    如果我写
  • Google App Engine 如何预编译 Java?

    App Engine 对应用程序的 Java 字节码使用 预编译 过程 以增强应用程序在 Java 运行时环境中的性能 预编译代码的功能与原始字节码相同 有没有详细的信息这是做什么的 我在一个中找到了这个谷歌群组消息 http groups
  • 无法捆绑适用于 Mac 的 Java 应用程序 1.8

    我正在尝试将我的 Java 应用程序导出到 Mac 该应用程序基于编译器合规级别 1 7 我尝试了不同的方法来捆绑应用程序 1 日食 我可以用来在 Eclipse 上导出的最新 JVM 版本是 1 6 2 马文 看来Maven上也存在同样的
  • 如何从终端运行处理应用程序

    我目前正在使用加工 http processing org对于一个小项目 但是我不喜欢它附带的文本编辑器 我使用 vim 编写所有代码 我找到了 pde 文件的位置 并且我一直在从 vim 中编辑它们 然后重新打开它们并运行它们 重新加载脚
  • 获取 JVM 上所有引导类的列表?

    有一种方法叫做findBootstrapClass对于一个类加载器 如果它是引导的 则返回一个类 有没有办法找到类已经加载了 您可以尝试首先通过例如获取引导类加载器呼叫 ClassLoader bootstrapLoader ClassLo
  • 捕获的图像分辨率太大

    我在做什么 我允许用户捕获图像 将其存储到 SD 卡中并上传到服务器 但捕获图像的分辨率为宽度 4608 像素和高度 2592 像素 现在我想要什么 如何在不影响质量的情况下获得小分辨率图像 例如我可以获取或设置捕获的图像分辨率为原始图像分
  • JGit 检查分支是否已签出

    我正在使用 JGit 开发一个项目 我设法删除了一个分支 但我还想检查该分支是否已签出 我发现了一个变量CheckoutCommand但它是私有的 private boolean isCheckoutIndex return startCo
  • Spring Boot @ConfigurationProperties 不从环境中检索属性

    我正在使用 Spring Boot 1 2 1 并尝试创建一个 ConfigurationProperties带有验证的bean 如下所示 package com sampleapp import java net URL import j

随机推荐