首页 > 其他分享 >vue2 数据导入excel

vue2 数据导入excel

时间:2024-11-26 16:22:56浏览次数:6  
标签:const arrayData excel yearMonth 导入 importData vue2 report new

1、安装 npm install xlsx

  一、前端

 <el-upload
     style="display: inline-block"
     action
     accept=".xlsx, .xls"
     :auto-upload="false"
      :show-file-list="false"
      :on-change="handleUpload"
  >
      <el-button type="primary" icon="el-icon-upload2" round>导入</el-button>
 </el-upload>

  二、逻辑

 

npm install xlsx
<script>
  /* eslint-disable */
  import * as XLSX from "xlsx";
    // 导入
    handleUpload(ev){
      let yearMonth =this.selectForm.yearMonth
      // 如果有数据则给出提示
      if(this.tableCount >0){
        this.$confirm(yearMonth+'有数据,是否进行替换?','提示',{
          confirmButtonText: '确定',
          cancelButtonText: '取消',
          type:'warning'
        }).then(() =>{
          const file = ev.raw
          const fileReader = new FileReader();
          fileReader.readAsArrayBuffer(file);
          fileReader.onload = (ev) =>{
            const data = new Uint8Array(ev.target.result);
            const workbook = XLSX.read(data, { type: 'array' });
            const firstSheetName = workbook.SheetNames[0];
            const worksheet = workbook.Sheets[firstSheetName];
            // 转译范围
            const range = { s: { r: 2, c: 3 }, e: { r: 32, c: 18 } }
            this.importData =(XLSX.utils.sheet_to_json(worksheet,{ header: 1,defval:'',range: range}));
            let formData={
              list: JSON.parse(JSON.stringify(this.importData)),
              yearMonth: this.selectForm.yearMonth
            }
            importData(formData).then((res) =>{
              if(res.code == 200){
                this.getDataList()
                this.$publicmethod.showMessage("导入成功",this.$publicmethod.SuccessType)
              }else{
                this.$publicmethod.showMessage("导入失败-选择的模版不正确!",this.$publicmethod.ErrorType)
              }
            })
          }
        })
      }else{
        const file = ev.raw
        const fileReader = new FileReader();
        fileReader.readAsArrayBuffer(file);
        fileReader.onload = (ev) =>{
          const data = new Uint8Array(ev.target.result);
          const workbook = XLSX.read(data, { type: 'array' });
          const firstSheetName = workbook.SheetNames[0];
          const worksheet = workbook.Sheets[firstSheetName];
          // 转译范围
          const range = { s: { r: 2, c: 3 }, e: { r: 32, c: 18 } }
          this.importData =(XLSX.utils.sheet_to_json(worksheet,{ header: 1,defval:'',range: range}));
          let formData={
            list: JSON.parse(JSON.stringify(this.importData)),
            yearMonth: this.selectForm.yearMonth
          }
          importData(formData).then((res) =>{
            if(res.code == 200){
              this.getDataList()
              this.$publicmethod.showMessage("导入成功",this.$publicmethod.SuccessType)
            }else{
              this.$publicmethod.showMessage("导入失败-选择的模版不正确!",this.$publicmethod.ErrorType)
            }
          })
        }
      }
    },
</script>

  三、接口

export function importData(data) {
  return request({
    url: 'api/operation_report/importData',
    method: 'post',
    data
  })  
}

  四、后端实现

  

  1、控制器类
   @ApiOperation(value = "导入数据")
    @PostMapping(value = "/importData")
    public JsonBean importData(  @RequestBody @Validated ReportQueryDo queryDo) {
        List<String> list =queryDo.getList();
        String yearMonth = queryDo.getYearMonth();
        return operationReportService.importData(list,yearMonth);
    }
  2、实现类
      // 导入
    @Override
    @Transactional(value = "MainTransactionManager", rollbackFor = Exception.class)
    public JsonBean importData(List<String> list,String  yearMonth) {
        try{
            List<OperationReport> addList = new ArrayList<>();
            // 将 excel数据保存在数据库中,传过来的是字符串,将字符串转成对应的对象进行数据的添加
            list.stream().forEach(data ->{
                OperationReport report = new OperationReport();
                report.setId(SnowIdUtil.getId());
                report.setYearMonth(yearMonth);
                JSONArray arrayData =JSON.parseArray(data);
                // 将数据转换成list集合进行操作
                if(arrayData !=null){
                    // 公司名称
                    String orgName = arrayData.getString(0);
                    int orgId=getOrgId(orgName);
                    // -1 代表没有当前组织
                    if(orgId != -1){
                        report.setOrgId(orgId);
                    }else{
                        String msg="不存在"+orgName+"公司";
                        logger.error(msg);
                        throw new RuntimeException(msg);
                    }
                    report = changeDataEntity(report,arrayData);
                    addList.add(report);
                }
            });
            // 数据批量添加
            if(CollectionUtils.isNotEmpty(addList)){
                // 先删除数据再进行添加
                Map<String,Object> map = new HashMap<>();
                map.put("yearMonth",yearMonth);
                operationReportMapper.delete(map);
                operationReportMapper.batchInsert(addList);
            }
            return new JsonBean(ResultCode.SERVICE_OK);
        }catch (Exception e){
            logger.error(e.toString());
            return new JsonBean(ResultCode.SERVICE_ERR);
        }
    }

   // 将excel表格数据转成实体
    private OperationReport changeDataEntity(OperationReport report,JSONArray arrayData){
        // 人员总数
        String personnelTotalCount = arrayData.getString(1);
        if(StringUtils.isNotEmpty(personnelTotalCount)){
            report.setPersonnelTotalCount(Integer.parseInt(personnelTotalCount));
        }else{
            report.setPersonnelTotalCount(0);
        }
        // 机关人员总数
        String officialCount = arrayData.getString(2);
        if(StringUtils.isNotEmpty(officialCount)){
            report.setOfficialCount(Integer.parseInt(officialCount));
        }else{
            report.setOfficialCount(0);
        }
        //  一线业务人员
        String frontLineBusinessCount = arrayData.getString(3);
        if(StringUtils.isNotEmpty(frontLineBusinessCount)){
            report.setFrontLineBusinessCount(Integer.parseInt(frontLineBusinessCount));
        }else{
            report.setFrontLineBusinessCount(0);
        }
        //  车辆总数
        String vehicleCount =  arrayData.getString(4);
        if(StringUtils.isNotEmpty(vehicleCount)){
            report.setVehicleCount(Integer.parseInt(vehicleCount));
        }else{
            report.setVehicleCount(0);
        }
        .....
        return report;
    }
  3、根据公司名称获取对应的公司编号
  public class ConstantEnum {
    // 创建HashMap来存储城市公司名称和编号的映射
    private static HashMap<String,Integer> orgMap = new HashMap<>();
    // 静态代码块,初始化公司编号数据
    static{
        orgMap.put("A",00001);
        orgMap.put("B",00002);

    }
    // 根据公司名称获取公司编号的方法
    public static int getOrgId(String orgName){
        return orgMap.containsKey(orgName)?orgMap.get(orgName):-1;
    }
 }
4、批量添加xml
    <!--批量添加 -->
    <insert id="batchInsert"  parameterType="java.util.List">
        insert into operation_report (id,org_id,yearMonth,personnel_total_count) values
        <foreach collection="list" item="item" index="index" separator=",">
            (#{item.id},#{item.orgId},#{item.yearMonth},#{item.personnelTotalCount})
        </foreach>
    </insert>
 

  五、导入的文件模版(行、列数据,只是转译内容,前面的数据不需要)

 

 

标签:const,arrayData,excel,yearMonth,导入,importData,vue2,report,new
From: https://www.cnblogs.com/flyShare/p/18570421

相关文章

  • python将Xmind用例转为Excel用例
     代码:#coding=utf-8importxlwtfrompast.builtinsimportraw_inputfromxmindparserimportxmind_to_dictdefresolvePath(dict,lists,title):#title去除首尾空格title=title.strip()#如果title是空字符串,则直接获取valueiflen(title)......
  • Jupyter Notebook无法导入外部模块—引出对环境变量的思考
    JupyterNotebook简介JupyterNotebook是一种交互式的计算环境,允许用户通过Notebook形式创建和共享代码、可视化和文档的组合。它是一个非常流行的数据科学工具,广泛用于数据分析、机器学习。今天主要使用了NumPy——科学计算库;Matplotlib——数据绘图库下文中,为方便起......
  • python如何读取excel的图表
    在Python中读取Excel文件中的图表,你可以使用openpyxl库来处理.xlsx文件。openpyxl是一个用来读写Excel2010xlsx/xlsm/xltx/xltm文件的Python库。以下是使用openpyxl读取Excel文件中图表的基本步骤:安装openpyxl:如果你还没有安装openpyxl,可以通过pip安装:pipinstallopenpyx......
  • 用Python将多个txt文件合并到同一个excel中的不同sheet
    写在前面:以下代码只适用于具有同样格式的多个txt文件合并在同一个excel的不同sheet,对于将所有txt按同样的格式合并在同一个sheet的,以下代码不能实现。导入模块:importopenpyxlimportos基本信息配置:filePath=r'C:\Amy\new'#存放txt的文件夹的存......
  • python openpyxl读写excel
    pipinstallopenpyxlimportopenpyxldefcode_main():xlsx_file_name=r'D:\ljh\work_info\test.xlsx'#excel文件路径xlsx_data=openpyxl.load_workbook(xlsx_file_name)table=xlsx_data.active#当前正在活跃的表,也可以指定Sheet对象:table=xl......
  • C#Npoi实现DataTable数据导出到Excel支持多表头
    至于Npoi的引用就省略了1.相关类的代码usingSystem;usingSystem.Collections.Generic;usingSystem.Data;usingSystem.IO;usingSystem.Linq;usingNPOI.SS.UserModel;usingNPOI.XSSF.UserModel;usingNPOI.HSSF.UserModel;usingNPOI.SS.Util;///<summary>//......
  • Vue3+Typescript+Axios+.NetCore实现导出Excel文件功能
    前端代码//导出ExcelconstexportMaintenanceOrderSettlementItemExcelClick=async()=>{leturl=`${VITE_APP_API_URL}/api/app/maintenance/settlement-service-item/${currentMaintenanceOrderId.value}/${currentMaintenanceOrderSettlementRow.value.id}`;......
  • 不仅仅是Excel,这些工具让协作更简单!
    在现代办公中,团队协作和信息共享变得愈发重要。随着Excel多人协同编辑功能的普及,工作效率和团队协作水平有了显著提升。通过多人同时编辑同一文档,无论是数据分析、财务报表,还是项目计划,团队成员都能实时看到彼此的修改,避免了版本冲突和重复劳动,提高了工作效率。除了Excel本身的......
  • MySQL frm、MYD、MYI数据文件恢复,导入MySQL中
    前言.frm、.MYI、.MYD 文件分别是 MySQL 的 MyISAM存储引擎存储的表结构、索引、数据文件。简单方法恢复数据.frm、.MYI、.MYD文件如果直接以文本打开,全部会以二进制形式显示,而我们希望看到的是 .sql 类型的文件。找到你对应版本的 mysql 的安装目录下的 data 文......
  • 一种word培训试题转为excel的简单办法,无需动手动脑
    分享早下班的终极秘诀~今天本来是个愉快的周五,心里想着周末的聚会和各种安排,然而突然一个加急任务砸了过来——要求在下周一提交一份精细整理的Excel表格!打开Word文件一看,成堆的试题内容需要整理到Excel里。看着满屏的题目,头皮一阵发麻,周末也变得遥不可及,工作量太大了吧?别急......