java-文件上传-excel存入数据库全代码及流程(附前端代码)

news2024/9/23 1:41:09

今天给大家带来的是文件上传中比较常用的,上传excel文件,将表格中的数据存入数据库中的一个转化的工具类;大致的流程是:前端点击上传按钮-->选择需要上传的excel表格-->确认上传-->    文件传到后台-->后台处理file文件-->将文件转化成List-->将List集合存入数据库

jsp的要引入一个fileinput;

首先通过前端点击按钮:

  <button type="button" id="input" data-loading-text="正在上传..." class="btn btn-default">        
     导入
  <i class="fa fa-upload"></i></button>

点击导入按钮,触发input框点击事件:

             $('#input').click(function () {
                $('#import_modal').modal('show');
            })

 点击按钮后,弹出框:

 弹窗代码:

          <div class="modal fade" id="import_modal">
                <div class="modal-dialog" style="max-height:80%">
                    <div class="modal-content">
                        <div class="modal-header">
                            <button type="button" class="close" data-dismiss="modal">
                                <span aria-hidden="true">&times;</span>
                                <span class="sr-only">Close</span>
                            </button>
                            <h4 class="modal-title">上传数据</h4>
                        </div>
                        <div class="modal-body" style="overflow: auto;
                                 max-hieght:800px;">
                            <div class="container-fluid"  style="height: 300px;">
                                <form class="form-horizontal" 
                                        enctype="multipart/form-data">
                                    <div class="form-group">
                                        <label for="file" class="col-sm-3 control-label">                    
                                           上传文件</label>
                                        <div class="col-sm-4">
                                            <input class="form-control" accept=".xlsx" 
                                                   style="padding:3px;" type="file"
                                                   id="file" name="file"/>
                                        </div>
                                    </div>
                                </form>
                            </div>

                        </div>
                        <div class="modal-footer">
                            <button type="button" class="btn btn-primary" id="import" 
                                     data-loading-text="正在上传...">确定
                            </button>
                            <button type="button" class="btn btn-default" data- 
                                        dismiss="modal">取消</button>
                        </div>
                    </div>
                </div>
            </div>

选择要上传的文件,然后点击确定:

点击确定触发:将请求地址改成自己本地的

 $('#import_modal form').bootstrapValidator('destroy');
            $('#import_modal form').bootstrapValidator({
                message: '输入不合法',
                fields: {
                    file: {
                        validators: {
                            notEmpty: {message: '文件不能为空'}
                        }
                    }
                }
            }).on('success.form.bv', function (e) {

                var files = $("#file").get(0).files;
                if (files.length > 0) {
                    if (files[0].size > 1024 * 1024 * 100) {
                        alert('文件大小不能超过100MB');
                        return false;
                    }
                    var formData = new FormData();
                    formData.append('file', files[0]);
                    $.ajax({
                        url: 
              '${pageContext.request.contextPath}/backend/form/evaluation_update/import',
                        type: 'POST',
                        cache: false,
                        data: formData,
                        processData: false,
                        contentType: false,
                        dataType: "json",
                        beforeSend: function () {
                            $('#import').button('loading');
                        },
                        success: function (data) {
                            if (data.errorCode === 0) {
                                alert(data.message);
                                $('#import_modal').modal('hide');
                                location.reload();
                            } else {
                                alert(data.message);
                            }
                            $('#import').button('reset');
                        }, error: function () {
                            $('#import').button('reset');
                        }
                    });
                }
            });

请求到后台:

controller层

@RequestMapping("evaluation_update/import")
    @ResponseBody
    public Result evaluationUpdate(@RequestParam(value = "file", required = true) MultipartFile file,
                                  UserSession session) throws Exception {
        try {
            Result result = new Result();
            result.setMessage("导入成功");
            int count = wfOrderService.importAnnualDemand(session, file);
            result.setMessage(count > 0 ? "导入成功,共:" + count + "条记录!" : "本次导入0条数据!");
            return result;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

service层:

public int importAnnualDemand(UserSession session, MultipartFile file) throws ErrorCodeException {

		List<Map<String, ArrayList<String[]>>> allDateList = new ArrayList<>();
		List<Requirement>list=new ArrayList<>();
		List<String[]> dataList;
		try {
			String filePath=getFilePath(file);
			Map<String,Object> insert = new HashMap();
			insert.put("file", filePath);
			File excelFile = uploadManager.file(filePath);
			dataList = POIExcelUtil.readExcel(excelFile, 1, false);
			System.out.println(dataList);
			for (String[] strings : dataList) {
				Requirement r = new Requirement();
				r.setErpCode(strings[0]);
				r.setAnnualDemand(new BigDecimal(strings[1]));
				r.setYear(strings[2]);
				list.add(r);
			}
			if(!list.isEmpty()){
				return this.insert(STATEMENT_ID + "importAnnualDemand", list);
			}
			return 0;

		}catch (Exception e){
			e.printStackTrace();
			return 0;
		}
	}
POIExcelUtil.readExcel工具类代码(拷贝即用):
//包名

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
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.xssf.usermodel.XSSFWorkbook;

import java.io.*;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.*;

public class POIExcelUtil {
    private final static String XLS = "xls";
    private final static String XLSX = "xlsx";


    private static NumberFormat numberFormat = NumberFormat.getNumberInstance();

    static {
        numberFormat.setGroupingUsed(false);
    }


    public static List<String[]> readExcel(File file, int firstRowNum, boolean needTitle) throws IOException {
        // 检查文件
        checkFile(file);
        Workbook workBook = getWorkBook(file);
        // 返回对象,每行作为一个数组,放在集合返回
        ArrayList<String[]> rowList = new ArrayList<>();
        if (null != workBook) {
            // 获得当前sheet工作表
            Sheet sheet = workBook.getSheetAt(0);
            if (sheet != null) {
                // 获得当前sheet的结束行
                int lastRowNum = sheet.getLastRowNum();
                sheet.getSheetName();
                int firstCellNum = sheet.getRow(firstRowNum - 1).getFirstCellNum();
                int lastCellNum = sheet.getRow(firstRowNum - 1).getLastCellNum();
                if (lastCellNum > 200) {
                    lastCellNum = 200;
                }

                if (needTitle) {
                    // 获取标题行,并返回在第一个list元素
                    Row titleRow = sheet.getRow(firstRowNum - 1);
                    String[] titleCells = new String[lastCellNum];
                    // 循环当前行
                    for (int cellNum = firstCellNum; cellNum < lastCellNum; cellNum++) {
                        Cell cell = titleRow.getCell(cellNum);
                        titleCells[cellNum] = getOriginalCellValue(cell);
                    }
                    rowList.add(titleCells);
                }

                // 循环所有行数据
                for (int rowNum = firstRowNum; rowNum <= lastRowNum; rowNum++) {
                    // 获得当前行
                    Row row = sheet.getRow(rowNum);
                    if (row == null) {
                        continue;
                    }
                    String[] cells = new String[lastCellNum];
                    // 循环当前行
                    for (int cellNum = firstCellNum; cellNum < lastCellNum; cellNum++) {
                        Cell cell = row.getCell(cellNum);
                        cells[cellNum] = getOriginalCellValue(cell);
                    }
                    rowList.add(cells);
                }
            }
            workBook.close();
        }

        return rowList;
    }


    public static List<String[]> readExcelPrecision(File file, int firstRowNum) throws IOException {
        // 检查文件
        checkFile(file);
        Workbook workBook = getWorkBook(file);
        // 返回对象,每行作为一个数组,放在集合返回
        ArrayList<String[]> rowList = new ArrayList<>();
        if (null != workBook) {
            // 获得当前sheet工作表
            Sheet sheet = workBook.getSheetAt(0);
            if (sheet != null) {
                // 获得当前sheet的结束行
                int lastRowNum = sheet.getLastRowNum();
                sheet.getSheetName();
                int firstCellNum = sheet.getRow(firstRowNum - 1).getFirstCellNum();
                int lastCellNum = sheet.getRow(firstRowNum - 1).getLastCellNum();
                if (lastCellNum > 200) {
                    lastCellNum = 200;
                }

                // 循环所有行数据
                for (int rowNum = firstRowNum; rowNum <= lastRowNum; rowNum++) {
                    // 获得当前行
                    Row row = sheet.getRow(rowNum);
                    if (row == null) {
                        continue;
                    }
                    String[] cells = new String[lastCellNum];
                    // 循环当前行
                    for (int cellNum = firstCellNum; cellNum < lastCellNum; cellNum++) {
                        Cell cell = row.getCell(cellNum);
                        cells[cellNum] = getOriginalCellValuePrecision(cell);
                    }
                    rowList.add(cells);
                }
            }
            workBook.close();
        }

        return rowList;
    }


    public static List<Map<String, ArrayList<String[]>>> readMultiExcel(File file, int firstRowNum, int firstRowNum2, boolean needTitle) throws IOException {
        // 检查文件
        checkFile(file);
        Workbook workBook = getWorkBook(file);
        List<Map<String, ArrayList<String[]>>> resultList = new ArrayList<>();
        // 返回对象,每行作为一个数组,放在集合返回

        if (null != workBook) {
            // 获得当前sheet工作表
            for (int w = 0; w < workBook.getNumberOfSheets(); w++) {
                Sheet sheet = workBook.getSheetAt(w);
                if (sheet != null) {
                    ArrayList<String[]> rowList = new ArrayList<>();
                    Map<String, ArrayList<String[]>> sheetMap = new HashMap<>();
                    String sheetName = sheet.getSheetName();
                    // 获得当前sheet的结束行
                    int lastRowNum = sheet.getLastRowNum();
                    int firstCellNum = sheet.getRow(w > 0 ? firstRowNum2 - 1 : firstRowNum - 1).getFirstCellNum();
                    int lastCellNum = sheet.getRow(w > 0 ? firstRowNum2 - 1 : firstRowNum - 1).getLastCellNum();
                    if (needTitle) {
                        // 获取标题行,并返回在第一个list元素
                        Row titleRow = sheet.getRow(w > 0 ? firstRowNum2 - 1 : firstRowNum - 1);
                        String[] titleCells = new String[lastCellNum];
                        // 循环当前行
                        for (int cellNum = firstCellNum; cellNum < lastCellNum; cellNum++) {
                            Cell cell = titleRow.getCell(cellNum);
                            titleCells[cellNum] = getOriginalCellValueByMulti(cell);
                        }
                        rowList.add(titleCells);
                    }
                    // 循环所有行数据
                    for (int rowNum = w > 0 ? firstRowNum2 - 1 : firstRowNum - 1; rowNum <= lastRowNum; rowNum++) {
                        // 获得当前行
                        Row row = sheet.getRow(rowNum);
                        if (row == null) {
                            continue;
                        }
                        String[] cells = new String[lastCellNum];
                        // 循环当前行
                        for (int cellNum = firstCellNum; cellNum < lastCellNum; cellNum++) {
                            Cell cell = row.getCell(cellNum);
                            cells[cellNum] = getOriginalCellValueByMulti(cell);
                        }
                        rowList.add(cells);
                    }
                    sheetMap.put(sheetName, rowList);
                    resultList.add(sheetMap);
                }
            }
            workBook.close();
        }
        return resultList;
    }


    public static String getOriginalCellValueByMulti(Cell cell) {
        DecimalFormat originalValueDecimalFormat = new DecimalFormat("#.##");
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        if (cell == null) {
            return "";
        }
        int cellType = cell.getCellType();
        switch (cellType) {
            case Cell.CELL_TYPE_FORMULA:
                return numberFormat.format(cell.getNumericCellValue());
            case Cell.CELL_TYPE_NUMERIC:
                if (org.apache.poi.ss.usermodel.DateUtil.isCellDateFormatted(cell)) {
                    Date dateCellValue = cell.getDateCellValue();
                    if (dateCellValue != null) {
                        return simpleDateFormat.format(dateCellValue);
                    }
                    return "";
                }
                return originalValueDecimalFormat
                        .format(cell.getNumericCellValue());
            case Cell.CELL_TYPE_STRING:
                return cell.getStringCellValue();
            case Cell.CELL_TYPE_BOOLEAN:
                return String.valueOf(cell.getBooleanCellValue());
            case Cell.CELL_TYPE_BLANK:
                return "";
            case Cell.CELL_TYPE_ERROR:
                return String.valueOf(cell.getErrorCellValue());
        }
        return "";
    }


    public static String getOriginalCellValue(Cell cell) {
        DecimalFormat originalValueDecimalFormat = new DecimalFormat("#.##");
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        if (cell == null) {
            return "";
        }
        int cellType = cell.getCellType();
        switch (cellType) {
            case Cell.CELL_TYPE_FORMULA:
                return String.valueOf(cell.getNumericCellValue());
            case Cell.CELL_TYPE_NUMERIC:
                if (org.apache.poi.ss.usermodel.DateUtil.isCellDateFormatted(cell)) {
                    Date dateCellValue = cell.getDateCellValue();
                    if (dateCellValue != null) {
                        return simpleDateFormat.format(dateCellValue);
                    }
                    return "";
                }
                return originalValueDecimalFormat
                        .format(cell.getNumericCellValue());
            case Cell.CELL_TYPE_STRING:
                return cell.getStringCellValue();
            case Cell.CELL_TYPE_BOOLEAN:
                return String.valueOf(cell.getBooleanCellValue());
            case Cell.CELL_TYPE_BLANK:
                return "";
            case Cell.CELL_TYPE_ERROR:
                return String.valueOf(cell.getErrorCellValue());
        }
        return "";
    }

    public static String getOriginalCellValuePrecision(Cell cell) {
        DecimalFormat originalValueDecimalFormat = new DecimalFormat("#.####");
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        if (cell == null) {
            return "";
        }
        int cellType = cell.getCellType();
        switch (cellType) {
            case Cell.CELL_TYPE_FORMULA:
                return String.valueOf(cell.getNumericCellValue());
            case Cell.CELL_TYPE_NUMERIC:
                if (org.apache.poi.ss.usermodel.DateUtil.isCellDateFormatted(cell)) {
                    Date dateCellValue = cell.getDateCellValue();
                    if (dateCellValue != null) {
                        return simpleDateFormat.format(dateCellValue);
                    }
                    return "";
                }
                return originalValueDecimalFormat
                        .format(cell.getNumericCellValue());
            case Cell.CELL_TYPE_STRING:
                return cell.getStringCellValue();
            case Cell.CELL_TYPE_BOOLEAN:
                return String.valueOf(cell.getBooleanCellValue());
            case Cell.CELL_TYPE_BLANK:
                return "";
            case Cell.CELL_TYPE_ERROR:
                return String.valueOf(cell.getErrorCellValue());
        }
        return "";
    }


    /**
     * 获得工作簿对象
     */
    private static Workbook getWorkBook(File file) throws IOException {
        String filename = file.getName();
        Workbook workbook = null;
        InputStream is = new FileInputStream(file);
        if (filename.endsWith(XLS)) {
            // 2003
            workbook = new HSSFWorkbook(is);
        } else if (filename.endsWith(XLSX)) {
            // 2007
            workbook = new XSSFWorkbook(is);
        }
        return workbook;
    }

    /**
     * 检查文件
     */
    private static void checkFile(File file) throws IOException {
        if (null == file) {
            throw new FileNotFoundException("文件不存在!");
        }
        // 获取文件名
        String filename = file.getName();
        // 判断是否为excel文件
        if (!filename.endsWith(XLS) && !filename.endsWith(XLSX)) {
            throw new IOException(filename + "不是excel文件");
        }
    }

    /**
     * 取单元格的值
     */
    private static String getCellValue(Cell cell) {
        String cellValue = "";
        if (cell == null) {
            return cellValue;
        }
        // 把数字当成String来读,防止1读成1.0
        if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
            // 日期格式
            short format = cell.getCellStyle().getDataFormat();
            if (format == 14 || format == 31 || format == 57 || format == 58
                    || (182 <= format && format <= 196)
                    || (210 <= format && format <= 213) || (208 == format)) { // 日期
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                double value = cell.getNumericCellValue();
                Date date = org.apache.poi.ss.usermodel.DateUtil.getJavaDate(value);
                if (date == null || "".equals(date)) {
                    return "";
                }
                return sdf.format(date);

            } else { // 不是日期格式
                cell.setCellType(Cell.CELL_TYPE_STRING);
            }
        }
        // 判断数据的类型
        switch (cell.getCellType()) {
            // 数字
            case Cell.CELL_TYPE_NUMERIC:
                cellValue = String.valueOf(cell.getNumericCellValue());
                break;
            // 字符串
            case Cell.CELL_TYPE_STRING:

                cellValue = String.valueOf(cell.getStringCellValue()).trim().replaceAll(String.valueOf((char) 10), "")
                        .replaceAll(String.valueOf((char) 11), "").replaceAll(String.valueOf((char) 12), "")
                        .replaceAll(String.valueOf((char) 13), "");
                break;
            // 布尔
            case Cell.CELL_TYPE_BOOLEAN:
                cellValue = String.valueOf(cell.getBooleanCellValue());
                break;
            // 公式
            case Cell.CELL_TYPE_FORMULA:
//                cellValue = String.valueOf(cell.getCellFormula());
                try {
                    cellValue = String.valueOf(cell.getNumericCellValue());
                } catch (IllegalStateException e) {
                    cellValue = String.valueOf(cell.getRichStringCellValue());
                }
                break;
            // 空
            case Cell.CELL_TYPE_BLANK:
                cellValue = "";
                break;
            // 错误
            case Cell.CELL_TYPE_ERROR:
                cellValue = "非法字符";
                break;
            default:
                cellValue = "未知类型";
                break;
        }
        return cellValue;
    }
}

service注入一个上传类:

	@Autowired
	private UploadManager uploadManager;

上传工具类(拷贝即用):



import com.yogapay.core.LangUitls;
import com.yogapay.sql.mapping2.StringListSQLData;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletContext;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.multipart.MultipartFile;

public class UploadManager implements InitializingBean {

	public static final String PATH_PREFIX = "/uploads";
	private final String basePath;
	private final String[] dirNames;
	@Autowired(required = false)
	private ServletContext sc;
	//
	private File baseDir;
	private URI baseDirUri;
	private Map<String, File> dirs;

	public UploadManager(String basePath, String dirNames) {
		this.basePath = StringUtils.trimToNull(basePath);
		this.dirNames = dirNames.split("\\s+");
	}

	@Override
	public void afterPropertiesSet() throws Exception {
		if (sc == null) {
			baseDir = new File("target");
		} else {
			baseDir = new File(basePath == null ? sc.getRealPath("uploads") : basePath);
		}
		baseDirUri = baseDir.toURI();
		dirs = new HashMap<String, File>();
		for (String dir : dirNames) {
			dirs.put(dir, createDir(dir));
		}
		dirs = Collections.unmodifiableMap(dirs);
	}

	private File createDir(String name) {
		File t = new File(baseDir, name);
		if (!t.mkdir() && !t.exists()) {
			throw new RuntimeException(t.getAbsolutePath());
		}
		return t;
	}

	public File file(String src) {
		if (!src.startsWith(PATH_PREFIX)) {
			throw new IllegalArgumentException();
		}
		src = src.substring(PATH_PREFIX.length());
		if (src.isEmpty() || src.charAt(0) != '/') {
			throw new IllegalArgumentException();
		}
		return new File(baseDirUri.resolve(src.substring(1)));
	}

	public String src(File f) {
		URI uri = baseDirUri.relativize(f.toURI());
		if (uri.isAbsolute()) {
			throw new IllegalArgumentException();
		}
		return PATH_PREFIX + "/" + uri;
	}

	public StringListSQLData saveDailyFiles(File rdir, Date date, MultipartFile[] files, String prefix, String suffix) throws IOException {
		if (files == null) {
			return null;
		}
		File dir = LangUitls.dailyFile(rdir, date);
		StringListSQLData fileList = new StringListSQLData();
		for (MultipartFile img : files) {
			if (!img.isEmpty()) {
				File f = File.createTempFile(prefix, suffix, dir);
				img.transferTo(f);
				fileList.add(src(f));
			}
		}
		return fileList;
	}

	public File getBaseDir() {
		return baseDir;
	}

	public Map<String, File> getDirs() {
		return dirs;
	}

}

获取文件地址:

	public String getFilePath(MultipartFile file) throws IOException {
		MultipartFile[] files = {file};
		String targetDir = uploadManager.getBaseDir() + "/" + "";
		int index = file.getOriginalFilename().lastIndexOf(".");
		String ext = index > 0 ? file.getOriginalFilename().substring(index + 1) : "";
		StringListSQLData fileData = uploadManager.saveDailyFiles(new File(targetDir), new Date(), files, "file_", "." + ext);
		return fileData.get(0);
	}

最后在Mybatis中将对应映射的sql写好就行了哦

	<insert id="importAnnualDemand" >
		INSERT IGNORE INTO 表名(字段名)
		VALUES
		<foreach item="i" collection="list" separator=",">(#{i.属性名})</foreach>
	</insert>

最后导入成功:

今天的分享结束啦,谢谢大家哦~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/69182.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]计算机毕业设计酒店在线预约咨询小程序Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

解决穿山甲Gromore广告在Oppo上报广告病毒Android.Virus.AdCheat.AdCut.A

描述 在上架Oppo的时候审核打回了发现了病毒。提示如下&#xff1a; 自动化检测“安全”项未通过,病毒名称&#xff1a;Android.Virus.AdCheat.AdCut.A,病毒描述&#xff1a;该病毒安装启动后&#xff0c;会展示非官方广告&#xff0c;造成盗源消耗和信息泄露&#xff0c;请卸…

[附源码]Python计算机毕业设计Django行程规划app

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

JUC07-ConcurrentHashMap

一、HashMap中的死链问题 多个线程对hashmap进行扩容时需要将原有数据转移到新的table数组中&#xff0c;这个过程中会重新计算每个元素对应的数组下标从而改变元素的next指针&#xff0c;而另一个线程重复对该链表进行迁移时可能会导致循环链表的产生 原始链表&#xff0c;格…

虹科案例 | 利用激光测距传感器进行锯齿定位

PART ONE 应用描述 在这项应用中&#xff0c;两个激光测距传感器分别安装在一个凸出部分的末端的两侧&#xff0c;用以测量其两侧到锯齿的距离的差。一个微型控制器会按照预设&#xff0c;记录测量数据并提供一个方便快捷的前后位置校准的图像&#xff0c;以便检查。当操作者触…

通过图卷积网络从单词语义学习到句子句法,用于基于方面的情感分析

Learning from word semantics to sentence syntax by graph convolutional networks for aspect-based sentiment analysis 1.Introduction 据我们所知&#xff0c;NLP 的基本动机是训练计算机处理明显属于人类的文本 。也就是说&#xff0c;在当前方法中整合语义信息和句法…

配音app开发,创建专属声音作品

娱乐生活的增加让人们开始向配音方面涉猎&#xff0c;配音逐渐变得大众化。配音对于专业性要求并不高&#xff0c;任何一个对配音有兴趣的用户都可以对自己喜欢的影视剧进行配音&#xff0c;同一个片段不同人在配音时所带的情感不同&#xff0c;最终呈现的听觉效果也不同&#…

VS Code 新增自定义字体

这里以 JetBrainsMono 字体为例 1、下载好字体文件安装 2、安装完成后进入系统字体文件夹 C:\Windows\Fonts 找到刚刚安装好的字体&#xff0c;复制字体文件名&#xff1a;JetBrains Mono NL 3、打开 VS Code 软件&#xff0c;依次点击左下角设置按钮 —> 常用设置 —>…

圣诞节教你如何用Html+JS+CSS绘制3D动画圣诞树

上篇文章给大家提供了一个如何生成静态圣诞树的demo。但是那样还不够高级&#xff0c;如何高级起来&#xff0c;当然是3D立体带动画效果了。 先看效果图&#xff1a; 源码如下&#xff1a; <!DOCTYPE html> <html lang"en" > <head> <meta c…

Git实战(五)| 让工作更高效,搞定Git的分支管理

上一篇讲到Git的分支管理实操&#xff0c;在线合并和本地合并都进行了实操。毕竟&#xff1a;光说不练是假把式。而只练不整理&#xff0c;只能是傻把式了。分支管理到底如何进行管理呢&#xff1f; 先以GitLab上的一张经典的图打头&#xff0c;作为一个总体概览&#xff0c;也…

数据合规圈必读!《数据合规:实务、技术与法律解码》新书发布!算力智库创始人燕丽盈科律所刘磊联袂著作

今年10月&#xff0c;上海网信办某科技公司因处理政务类数据时违规操作&#xff0c;被责令整改&#xff0c;并处以五万元罚款。 今年7月26日&#xff0c;广州市在净网“2022”专项行动中&#xff0c;某技术公司一款APP系统因未履行数据安全保护义务&#xff0c;导致1000万余条…

ubuntu 20.04 设置DNS

ubuntu 20.04 设置DNSubuntu 20.04 设置DNS 快捷步骤下面是命令解释1、决定系统dns的文件是/etc/resolv.conf2、谁能影响/etc/resolv.conf3、/etc/resolv.conf软链接到/run/systemd/resolve/resolv.confubuntu 20.04 设置DNS 快捷步骤 修改 /etc/systemd/resolved.conf 文件&a…

阿里内部出品的这5份手册的含金量有多高,你不会还不知道吧

前言 秋招过去也是有一个月有余了,该说不说顺利的伙计已经拿下offer了,肯定还有部分的伙计还在苦苦挣扎中,这里小编只说一句话,革命还未成功,同志们仍需努力哈哈哈,拿下offer了才能稳稳当当的坐住,坐踏实,那么问题来了,有些伙计在做面试准备的时候总是会抓不到重点,忽略一些重…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java成绩管理与学情分析系统11yzf

好的选题直接决定了毕业设计好坏&#xff0c;甚至决定了能否毕业。今天&#xff0c;我们就来聊一聊毕设该怎么选题。 这里分三个选题标准。 第一&#xff0c;参考所在学校往年选题类型和难度 可以向学长学姐了解往年的选题类型&#xff0c;以及使用的技术&#xff0c;不用向…

win10下PyUSB访问USB驱动

目录 一、安装pyusb 二、下载工具zadig 三、确认目标USB设备 四、为目标设备安装USB驱动 五、测试代码 六、小结 1. 关于环境搭建 2. 关于总线上的数据 环境&#xff1a; Win10专业版Python3.8.7 一、安装pyusb 命令 pip install pyusb 二、下载工具zadig Zadig是…

[附源码]Python计算机毕业设计Django疫情背景下社区互助服务系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

数据库索引分裂 问题分析

1、背景描述&#xff1a; 某客户反馈在 18 点 30 分左右出现性能问题&#xff0c;活动会话飙升&#xff0c;业务卡顿。 2、问题分析 通过awr 可以看到大量的索引分裂等待&#xff0c;和并发的事务槽等待&#xff0c;事务槽的并发等待是由于索引分裂阻塞大量会话导致的并发加剧…

测试gitlab-runner

上一篇&#xff1a;Docker安装Gitlab-ruuner_素心如月桠的博客-CSDN博客https://blog.csdn.net/m0_47010003/article/details/127997515 总结&#xff1a; 上一篇中操作到&#xff1a; &#x1f4cc;安装了gitlab-runner&#xff0c;在gitlab中创建一个项目&#xff08;testci&…

Java匿名内部类

Java匿名内部类\huge{Java匿名内部类}Java匿名内部类 匿名内部类 ①. 概念&#xff08;定义&#xff09; 通俗一点来讲匿名内部类就是没有名字的局部内部类。 注意这里的两点&#xff1a; 没有名字局部内部类 ②. 作用 方便创建子类的对象&#xff0c;最终的目的是简化代…

Linux内核Hook系统调用execve

在Linux系统中&#xff0c;用户层程序无法直接控制系统内核&#xff0c;只能通过系统调用。 一般调用顺序为: 用户进程->execve()->syscall()->stub_execve()->sys_execve()-> do_execve()..... 本文章使用的是国产uos-Linux&#xff0c;内核为 4.19.0-amd64-…