記錄一下簡單導入導出excel二級表頭

數據庫導入導出表頭
在這里插入圖片描述
之前的工具類GenerateExcelToFile新增兩個導出這種二級表頭方法

package com.njry.utils;import cn.hutool.core.util.IdUtil;
import com.njry.config.FileProperties;
import com.njry.exception.BadRequestException;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.util.IOUtils;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class GenerateExcelToFile {public static final String SYS_TEM_DIR = System.getProperty("java.io.tmpdir") + File.separator;/*** 根據導出表在后面添加每個原子的基本值和目標值* @param list 數據庫查詢出來的信息* @param atomMbListAllString  后面動態添加的原子(要動態生成二級表頭)  原子id,模版名稱,維度名稱三個用下劃線分割,在導入的時候取數據用 例如:AT10681_0627-2_測試,AT10600_水電費debug_按開戶廳* @param tableHead  基本表頭  例如list 三個寫死的表頭:組織ID,組織名稱,組織等級* @param type 導出的excel類型 1 xlsx 2  xls* @param response* @throws IOException*/public static void dataToExcel(List<Map<String, Object>> list, List<String> atomMbListAllString, List<String> tableHead, int type, HttpServletResponse response) throws IOException{String tempPath = SYS_TEM_DIR + IdUtil.fastSimpleUUID() + ".xlsx";File file = new File(tempPath);Workbook wb = null;if(type == 1){wb = new XSSFWorkbook();}if(type == 2){wb = new HSSFWorkbook();}Workbook exportWorkbook = exportMultiExcel(wb, list, atomMbListAllString, tableHead, type);
//        臨時文件 寫出流FileOutputStream outStream = new FileOutputStream(file);// 寫入Workbook到文件exportWorkbook.write(outStream);
//            也可以通過流獲取大小
//            long size = outStream.getChannel().size();// 強制刷新文件流,確保所有數據都被寫入到文件中outStream.flush();outStream.close();//response為HttpServletResponse對象response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");//test.xls是彈出下載對話框的文件名,不能為中文,中文請自行編碼response.setHeader("Content-Disposition", "attachment;filename=file.xlsx");ServletOutputStream out = response.getOutputStream();FileInputStream fileInputStream = new FileInputStream(file);IOUtils.copy(fileInputStream,out);file.deleteOnExit();fileInputStream.close();}/**** @param wb 操作的Workbook* @param list 數據庫查詢出來的信息* @param atomMbListAllString 后面動態添加的原子(要動態生成二級表頭)* @param tableHead 基本表頭* @param type 導出的excel類型 1 xlsx 2  xls* @return*/public static Workbook exportMultiExcel(Workbook wb,List<Map<String, Object>> list, List<String> atomMbListAllString, List<String> tableHead, int type){HSSFWorkbook HSSwb = null;XSSFWorkbook XSSwb = null;if(type == 1){XSSwb  = (XSSFWorkbook)wb;}if(type == 2){HSSwb  = (HSSFWorkbook)wb;}// 創建樣式CellStyle style = wb.createCellStyle();style.setAlignment(HorizontalAlignment.CENTER); // 水平居中style.setVerticalAlignment(VerticalAlignment.CENTER); // 垂直居中if(type == 1){XSSFSheet sheet = XSSwb.createSheet();
//            處理sheet的表頭
//            XSSFRow row = sheet.createRow((short) 0);(表頭兩行)
//            合并第一行和第二行的第一個單元格
//            int startrow = 0;
//            int endrow = 1;
//            int startcell = 1;
//            int endcell = 1;
//            sheet.addMergedRegion(new CellRangeAddress(startrow, endrow, startcell, endcell));//            處理表頭(合并第一行和第二行)XSSFRow row = sheet.createRow((short) 0);XSSFRow row1 = sheet.createRow((short) 1);int size = tableHead.size();//固定表頭長度for (int i = 0; i < size; i++) {int startrow = 0;int endrow = 1;int startcell = i;int endcell = i;
//                在合并單元格第一個寫內容XSSFCell cell = row.createCell(i);cell.setCellValue(tableHead.get(i));sheet.addMergedRegion(new CellRangeAddress(startrow, endrow, startcell, endcell));cell.setCellStyle(style);}int asyncSize = atomMbListAllString.size() * 2;//動態表頭長度for (int j = size; j < asyncSize+size; j += 2) {int startrow = 0;int endrow = 0;int startcell = j;int endcell = j + 1;
//                在合并單元格第一個寫內容XSSFCell cell = row.createCell(j);int circulationNum = (j - size) / 2;//循環次數cell.setCellValue(atomMbListAllString.get(circulationNum));
//                合并第二行寫固定的基本值和目標值XSSFCell cellMerge1 = row1.createCell(j);cellMerge1.setCellValue("基本值");XSSFCell cellMerge2 = row1.createCell(j+1);cellMerge2.setCellValue("目標值");sheet.addMergedRegion(new CellRangeAddress(startrow, endrow, startcell, endcell));cellMerge1.setCellStyle(style);cellMerge2.setCellStyle(style);cell.setCellStyle(style);}
//          寫入數據(固定表頭下面內容)for (int m = 0; m < list.size(); m++) {
//                已經添加的兩個行XSSFRow rowTemp = sheet.createRow(m + 2);
//                每一行數據的map,map對應的key就是固定表頭Map<String, Object> stringObjectMap = list.get(m);Cell dataCell = null;for (int n = 0; n < tableHead.size(); n++) {dataCell = rowTemp.createCell(n);dataCell.setCellValue(StringUtils.notEmpty(stringObjectMap.get(tableHead.get(n))));}}}if(type == 2){HSSFSheet sheet = HSSwb.createSheet();
//            處理sheet的表頭
//            XSSFRow row = sheet.createRow((short) 0);(表頭兩行)
//            合并第一行和第二行的第一個單元格
//            int startrow = 0;
//            int endrow = 1;
//            int startcell = 1;
//            int endcell = 1;
//            sheet.addMergedRegion(new CellRangeAddress(startrow, endrow, startcell, endcell));//            處理表頭(合并第一行和第二行)HSSFRow row = sheet.createRow((short) 0);HSSFRow row1 = sheet.createRow((short) 1);int size = tableHead.size();//固定表頭長度for (int i = 0; i < size; i++) {int startrow = 0;int endrow = 1;int startcell = i;int endcell = i;
//                在合并單元格第一個寫內容HSSFCell cell = row.createCell(i);cell.setCellValue(tableHead.get(i));sheet.addMergedRegion(new CellRangeAddress(startrow, endrow, startcell, endcell));cell.setCellStyle(style);}int asyncSize = atomMbListAllString.size() * 2;//動態表頭長度for (int j = size; j < asyncSize+size; j += 2) {int startrow = 0;int endrow = 1;int startcell = j;int endcell = j + 1;
//                在合并單元格第一個寫內容HSSFCell cell = row.createCell(j);int circulationNum = (j - size) / 2;//循環次數cell.setCellValue(atomMbListAllString.get(circulationNum));
//                合并第二行寫固定的基本值和目標值HSSFCell cellMerge1 = row1.createCell(j);cellMerge1.setCellValue("基本值");HSSFCell cellMerge2 = row1.createCell(j+1);cellMerge2.setCellValue("目標值");sheet.addMergedRegion(new CellRangeAddress(startrow, endrow, startcell, endcell));cellMerge1.setCellStyle(style);cellMerge2.setCellStyle(style);cell.setCellStyle(style);}
//          寫入數據(固定表頭下面內容)for (int m = 0; m < list.size(); m++) {
//                已經添加的兩個行HSSFRow rowTemp = sheet.createRow(m + 2);
//                每一行數據的map,map對應的key就是固定表頭Map<String, Object> stringObjectMap = list.get(m);Cell dataCell = null;for (int n = 0; n < tableHead.size(); n++) {dataCell = rowTemp.createCell(n);dataCell.setCellValue(StringUtils.notEmpty(stringObjectMap.get(tableHead.get(n))));}}}return wb;}/**** @param list  數據庫查詢出來的信息* @param tableHead  數據庫的表頭(簡單表頭)* @param dirPath  保存的文件路徑* @param fileSuffix 生成的excel格式后綴* @param separator 生成的excel帶水印格要多加一層文件路徑* @throws IOException*/public static Map<String, Object> dataToExcel(List<Map<String, Object>> list,List<String> tableHead,String dirPath, String fileSuffix, String separator) throws IOException {Map<String, Object> resultMap = new HashMap<>();Workbook wb = null;FileInputStream tempInput = null;String watermarkPath = dirPath + "watermarkPath" + separator;int type = 3;//默認用type區分一個sheet有多少行if("xlsx".equals(fileSuffix)){wb = new XSSFWorkbook();type = 1;}if("xls".equals(fileSuffix)){wb = new HSSFWorkbook();type = 2;}Workbook exportWorkbook = export(wb, list, tableHead, type);String attachmentId = IdUtil.simpleUUID();String fileSize = "";String to_file_name = attachmentId + "." + fileSuffix;	// 結果文件名稱
//        判斷保存的文件路徑是否存在,不存在就創建File outFileExist = new File(dirPath);if(!outFileExist.exists()){outFileExist.mkdirs();}File outFile = new File(dirPath, to_file_name);try {FileOutputStream outStream = new FileOutputStream(outFile);// 寫入Workbook到文件exportWorkbook.write(outStream);
//            也可以通過流獲取大小
//            long size = outStream.getChannel().size();// 強制刷新文件流,確保所有數據都被寫入到文件中outStream.flush();// 獲取文件對象File outputFile = new File(dirPath, to_file_name);long length = outputFile.length();fileSize =  length  + " bytes";outStream.close();} catch (Exception e) {throw new BadRequestException("導出結果文件異常:" + e);}//        將有數據的excel的文件再加水印File tempFile = new File(dirPath, to_file_name);tempInput = new FileInputStream(tempFile);XSSFWorkbook xSSFWorkbook = new XSSFWorkbook(tempInput);
//            將導出的數據加水印放到另一個文件watermarkPath里面File watermarkFileExist = new File(watermarkPath, to_file_name);PoiSecurity.addWatermarkToXlsx(new String[]{"test"},xSSFWorkbook,watermarkFileExist);xSSFWorkbook.close();tempInput.close();// 終止后刪除臨時文件tempFile.deleteOnExit();
//        處理文件信息返回resultMap.put("attachmentId",attachmentId);resultMap.put("fileName",to_file_name);resultMap.put("fileType","excel");resultMap.put("fileExtension",fileSuffix);resultMap.put("fileSize",fileSize);resultMap.put("attachmentPath",dirPath);return resultMap;}/**** @param wb 操作的Workbook* @param list 數據庫查詢出來的信息* @param tableHead 數據庫的表頭(簡單表頭)* @param type excel類型  xlsx  1   xls 2   -------區分sheet最大告訴* @return*/public static Workbook export(Workbook wb,List<Map<String, Object>> list, List<String> tableHead,int type) {HSSFWorkbook HSSwb = null;XSSFWorkbook XSSwb = null;
//        不定義sheet名字,自生成
//        Excel 2003及更早的版本中,行數上限是65,536行
//        2007開始,行數上限增加到了1,048,576行int maxRow = 49999;//去除一個表頭行if(type == 1){maxRow = 1048575;//去除一個表頭行XSSwb  = (XSSFWorkbook)wb;}if(type == 2){maxRow = 65535;//去除一個表頭行HSSwb  = (HSSFWorkbook)wb;}maxRow = 49999;//去除一個表頭行(無論啥格式默認都是50000一個sheet)
//        處理數據需要多少個sheetint size = list.size();int result = size / maxRow + 1;if(result == 0){result = 1;}
//        循環sheetfor (int i = 0; i < result; i++) {if(type == 1){XSSFSheet sheet = XSSwb.createSheet();//            處理每個sheet的表頭XSSFRow row = sheet.createRow((short) 0);Cell cell = null;for (int j = 0; j < tableHead.size(); j++) {cell = row.createCell(j);
//                cell.setCellStyle(headStyle);cell.setCellValue(tableHead.get(j));}
//          寫入數據for (int n = 0 + maxRow * i; n < maxRow * (i + 1); n++) {
//                判斷數據list的大小是否大于要創建的行if(size - 1 >= n ){//下面list.get(n)就取不到數據,不應該繼續創建行  size 14 get(n)時候 n只能到13row = sheet.createRow(n % maxRow + 1);Cell dataCell = null;for (int m = 0; m < tableHead.size(); m++) {dataCell = row.createCell(m);dataCell.setCellValue(StringUtils.notEmpty(list.get(n).get(tableHead.get(m))));}}}}if(type == 2){HSSFSheet sheet = HSSwb.createSheet();//            處理每個sheet的表頭HSSFRow row = sheet.createRow((short) 0);Cell cell = null;for (int j = 0; j < tableHead.size(); j++) {cell = row.createCell(j);
//                cell.setCellStyle(headStyle);cell.setCellValue(tableHead.get(j));}
//          寫入數據for (int n = 0 + maxRow * i; n < maxRow * (i + 1); n++) {
//                判斷數據list的大小是否大于要創建的行if(size - 1 >= n ){//下面list.get(n)就取不到數據,不應該繼續創建行  size 14 get(n)時候 n只能到13row = sheet.createRow(n % maxRow + 1);Cell dataCell = null;for (int m = 0; m < tableHead.size(); m++) {dataCell = row.createCell(m);dataCell.setCellValue(StringUtils.notEmpty(list.get(n).get(tableHead.get(m))));}}}}}return wb;}
}

處理之前導出的模板,把用戶輸入的基本值和目標值再放回數據庫里
解析excel保存到表里(貼一個實現層代碼)

    @Override@Transactional(rollbackFor = Exception.class)public void excelImportBatch(MultipartFile file,Long sceneId,String month) throws Exception {
//        保存在 T_ATOM_MB_CFG_ITEM 但是需要目標值,
//        前端傳了場景id,以及excel里面原子id_模式名稱_維度名稱 有atomId,模式名稱,維度名稱
//        因此要根據atomId,模式名稱,維度名稱以及場景id 獲取目標idString extension = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".") + 1).toLowerCase(); // 獲取輸入流try (java.io.InputStream fis = file.getInputStream();Workbook workbook = "xlsx".equals(extension) ? new XSSFWorkbook(fis) : new HSSFWorkbook(fis);){Sheet sheet = workbook.getSheetAt(0);//獲取Sheet中的合并單元格信息(為下文HeaderCell下屬性判斷使用)HeaderRegion[] headerRegions = new HeaderRegion[sheet.getNumMergedRegions()];for(int k = 0; k < sheet.getNumMergedRegions(); k++){HeaderRegion headerRegion = null;CellRangeAddress region = sheet.getMergedRegion(k);headerRegion = new HeaderRegion();int firstRow = region.getFirstRow();int lastRow = region.getLastRow();int firstColumn = region.getFirstColumn();int lastColumn = region.getLastColumn();headerRegion.setTargetRowFrom(firstRow);headerRegion.setTargetRowTo(lastRow);headerRegion.setTargetColumnFrom(firstColumn);headerRegion.setTargetColumnTo(lastColumn);Cell cell = sheet.getRow(firstRow).getCell(firstColumn);headerRegion.setText(cell.getStringCellValue());headerRegion.setColLength(1 + (lastColumn - firstColumn));headerRegion.setRowLength(1 + (lastRow - firstRow));headerRegions[k] = headerRegion;}
//            找到不是基礎表頭的合并單元格(前三列是基礎數據表頭合并單元格,要獲取后面動態生成的合并單元格)int size = 0;//后面動態生成的個數int sizeLength = 0;//動態占用列數int baseSize = 0;//基礎表頭Map<String,List<AtomMbCfgItem>> map = new LinkedHashMap<>();//key放動態生成的目標id(一個映射表)Map<Integer,String> cellMap = new LinkedHashMap<>();//key列對應的目標id(一個映射表,方便下面循環excel的列時候找到所屬的目標id)for(HeaderRegion item : headerRegions){
//                同一列,基礎表頭if(item.getTargetColumnFrom() == item.getTargetColumnTo()){baseSize++;}else{size++;sizeLength += item.getColLength();int targetColumnFrom = item.getTargetColumnFrom();int targetColumnTo = item.getTargetColumnTo();String text = item.getText();String[] nameText = text.split("_");String atomId = nameText[0];//atomIdString modeName = nameText[1];//模式名稱String dimenName = nameText[2];//維度名稱
//                    T_ATOM_MB_CFG表里的mb_id 是numberList<AtomMbCfg> atomMbCfgs = atomMbCfgMapper.queryMBId(sceneId, atomId, modeName, dimenName);if(atomMbCfgs == null || atomMbCfgs.size() == 0){throw new BadRequestException("導入的目標不對,可能不是當前場景的模版");}AtomMbCfg atomMbCfg = atomMbCfgs.get(0);String mbId = atomMbCfg.getMbId();cellMap.put(targetColumnFrom,mbId);cellMap.put(targetColumnTo,mbId);List<AtomMbCfgItem> temp = new ArrayList<>();map.put(mbId,temp);}}String orgid=null;String orgName="";int orglevel= -1;String orglevelName="";int baseval= 0;int chalval= 0;// 必輸驗證提示信息StringBuffer error = new StringBuffer();// 遍歷數據行(這里知道是從第三行是實際數據行)for (int i = 2; i <= sheet.getLastRowNum(); i++){int n = i + 1;//實際行數(顯示報錯用的)StringBuffer err = new StringBuffer();Row row = sheet.getRow(i);if (row == null)continue;orgid = row.getCell(0).toString().trim();if(orgid.length() == 0){err.append("\r\n第[" + n + "]行"+ 1 +"列沒有值!");}orgName = row.getCell(1).toString().trim();//獲取也存入表里if(orgName.length() == 0){err.append("\r\n第[" + n + "]行"+ 2 +"列沒有值!");}orglevelName = row.getCell(2).toString().trim();if(orglevelName.length() == 0){err.append("\r\n第[" + n + "]行"+ 3 +"列沒有值!");}
//                不循環數據固定表頭,直接上面寫死for (int j = 3; j < baseSize+sizeLength; j += 2) {String mbId = cellMap.get(j);//獲取動態表頭的目標idList<AtomMbCfgItem> atomMbCfgItems = map.get(mbId);//當前目標id的列表AtomMbCfgItem atomMbCfgitem = new AtomMbCfgItem();String basevalStr = row.getCell(j).toString().trim();if(basevalStr.endsWith(".0")){basevalStr = basevalStr.substring(0, basevalStr.length() - 2);baseval = Integer.parseInt(basevalStr);}String chalvalStr = row.getCell(j+1).toString().trim();if(chalvalStr.endsWith(".0")){chalvalStr = chalvalStr.substring(0, chalvalStr.length() - 2);chalval = Integer.parseInt(chalvalStr);}
//                    baseval = Integer.parseInt(basevalStr);
//                    chalval = Integer.parseInt(chalvalStr);if(baseval < 0){err.append("\r\n第[" + n + "]行"+ j+1 +"列數據為負數!");}if(chalval < 0){err.append("\r\n第[" + n + "]行"+ j+2 +"列為負數!");}//                為啥還要獲取一遍,不用excel里面的值 根據組織名稱和組織等級獲取組織id并不唯一
//                select * from t_report_org_template_1
//                where org_name='黨政軍組' and
//                        org_level= 3
//                orgid= atomMbCfgMapper.selectOrgIdByName(orgName,orglevelName,atomMbCfgcx.getAtomId());atomMbCfgitem.setMbId(mbId);atomMbCfgitem.setMonth(month);if(orgid!=null && !orgid.isEmpty()){atomMbCfgitem.setOrgId(orgid);}//                在t_atom_template_level只有原子是tempalte_id 是1的才能獲取到組織層級 先寫死1 查詢組織層級
//                List<Integer> integers = atomMbCfgMapper.selectOrgLevel(orglevelName, atomMbCfgcx.getAtomId());
//
//                if(integers.size()>0){
//                    orglevel = integers.get(0);
//                    atomMbCfgitem.setOrgLevel(orglevel);
//                }else{
//                    err.append("\r\n第[" + n + "]無對應組織level,請檢查!");
//                }//                根據組織名稱和 先寫死的模版id 是1 查找組織等級Integer integer = atomMbCfgMapper.selectOrgLevelByorglevelNameTemplateId(orglevelName, "1");atomMbCfgitem.setOrgLevel(integer);atomMbCfgitem.setBaseVal(baseval);atomMbCfgitem.setChalVal(chalval);atomMbCfgitem.setCreateBy(SecurityUtils.getCurrentUsername());atomMbCfgitem.setCreateTime(new Date());if ("".equals(err.toString())){atomMbCfgItems.add(atomMbCfgitem);}else{error.append(err);error.append("\r\n請修改!");throw new BadRequestException(error.toString());}}}for (String key : map.keySet()) {List<AtomMbCfgItem> atomMbCfgItems = map.get(key);System.out.println(key + " :" + atomMbCfgItems);atomMbCfgMapper.saveItam(atomMbCfgItems);}// 文件流關閉fis.close();}}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/40784.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/40784.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/40784.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

OpenGL的學習之路

Qt如何創建OpenGL的渲染窗口&#xff1f; 類比GLFW庫&#xff0c;Qt提供了OpenGL的渲染窗口類QOpenGLWidget&#xff1a; 1、重寫initializeGL()和resizeGL()函數來設置OpenGL狀態并提供透視圖轉換。 2、重寫paintGL()來繪制3D場景&#xff0c;只調用OpenGL函數。 3、還可以…

python 基礎綜合應用——小開發

#python 基礎綜合應用——小開發 綜合復習 變量- 循環- 函數- 模塊 開發 名片管理系統 名片管理系統介紹 名片管理系統可以理解成花名冊軟件&#xff0c;通過個人新建人的信息后可以進行查詢等簡單操作的程序 名片管理系統有三個作用&#xff0c; 1.新建名片 2.顯示全部名…

【設計模式】裝飾者模式里Java實現

插&#xff1a; AI時代&#xff0c;程序員或多或少要了解些人工智能&#xff0c;前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家(前言 – 人工智能教程 ) 堅持不懈&#xff0c;越努力越幸運&#xff0c;大家…

【VIM的使用】

Vim 是一個非常強大的文本編輯器&#xff0c;尤其在 Linux 環境下被廣泛使用。它基于 vi 編輯器開發而來&#xff0c;增加了許多功能和改進。下面是一個簡化的 Vim 教程&#xff0c;幫助你快速上手&#xff1a; 啟動 Vim 要啟動 Vim&#xff0c;只需在終端中輸入 vim [filen…

Leetcode刷題2---兩數相加 Python

目錄 題目及分析解法一: 迭代法解法二: 遞歸法解法三&#xff1a;反轉鏈表法 題目及分析 &#xff08;力扣序號2&#xff1a;兩數相加&#xff09; 給你兩個非空的鏈表&#xff0c;表示兩個非負的整數。它們每位數字都是按照逆序的方式存儲的&#xff0c;并且每個節點只能存儲…

python之音頻處理(2)兩個音頻文件的合并

from pydub import AudioSegment# 加載兩個音頻文件 audio1 AudioSegment.from_file(r"D:\websiteDownload\huanxing.wav") audio2 AudioSegment.from_file(r"D:\websiteDownload\我今天被一件事情搞得很煩.wav")# 設置間隔&#xff08;單位&#xff1a;…

Altium Designer專業PCB設計軟件下載安裝 Altium Designer安裝包下載獲取

在電子設計的廣袤領域中&#xff0c;PCB設計無疑占據著重要的地位。而Altium Designer作為一款業界領先的電子設計自動化軟件&#xff0c;其提供的先進布局工具&#xff0c;無疑為設計師們打開了一扇通往高效、精確設計的大門。 在PCB設計的核心環節——布局中&#xff0c;Alti…

初學Spring之自動裝配 Bean

Bean 的作用域&#xff1a; 1.單例模式&#xff08;Spring 默認機制&#xff09; scope“singleton” 2.原型模式&#xff1a;每次從容器中 get 時&#xff0c;都會產生一個新對象 scope"prototype" 3. request、session、application&#xff0c;只能在 web 開…

《c語言結構體怎么函數傳參》

在C語言中&#xff0c;結構體&#xff08;struct&#xff09;是一種用戶自定義的數據類型&#xff0c;用于組合多個不同類型的數據成員。當你要將結構體作為參數傳遞給函數時&#xff0c;可以按照以下幾種方式進行&#xff1a; 值傳遞&#xff08;Pass by Value&#xff09;&a…

【pytorch擴展】CUDA自定義pytorch算子(簡單demo入手)

Pytorch作為一款優秀的AI開發平臺&#xff0c;提供了完備的自定義算子的規范。我們用torch開發時&#xff0c;經常會因為現有算子的不足限制我們idea的迸發。于是&#xff0c;CUDA/C自定義pytorch算子是不得不磕了。 今天通過一個小實驗來梳理自定義pytorch算子都需要做哪些準…

軟設之類的繼承與泛化,多重繼承

在類中&#xff0c;假如父類已經寫好屬性或方法&#xff0c;子類想要實現相同的功能&#xff0c;不用專門寫代碼&#xff0c;直接用專門的繼承語言繼承就可以了。 比如說有一個動物類&#xff0c;有毛色和叫這兩個屬性和方法&#xff0c;又寫了一個子類是貓類&#xff0c;貓類…

騰訊云COS分布式對象存儲

騰訊云COS分布式對象存儲 騰訊云對象存儲&#xff08;Cloud Object Storage&#xff0c;COS&#xff09;是騰訊云提供的一種用于存儲海量文件的分布式存儲服務。 騰訊云 COS 適用于多種場景&#xff0c;如靜態網站托管、大規模數據備份和歸檔、多媒體存儲和處理、移動應用數據存…

Kafka搭建(單機版)

部署前提 VMware環境 : 兩臺centos系統 Jdk包:jdk-8u202-linux-x64.tar.gz Kafka包:kafka_2.12-3.5.0.tgz Zookeeper包:apache-zookeeper-3.7.2-bin.tar.gz 百度網盤自取: 鏈接: https://pan.baidu.com/s/11EWuhBoSmH3musd_3Rgodw?pwde32t 提取碼: e32t Kafka搭建&#xff08;…

Camtasia 2024新功能 Camtasia2024更新介紹:AI剪輯助力微課制作 Camtasia2024密鑰 Camtasia2023免費升級更新

Camtasia 是一款功能強大的屏幕錄制和視頻編輯軟件&#xff0c;廣泛應用于教育、商業和娛樂領域。無論是創建教學視頻、產品演示、教程還是營銷內容&#xff0c;Camtasia都能提供專業的工具和功能&#xff0c;幫助用戶制作高質量的視頻內容。 Camtasia 2024 中文免費安裝包百度…

暑假學習DevEco Studio第2天

學習目標&#xff1a; 掌握頁面跳轉 學習內容&#xff1a; 跳轉頁面 創建頁面&#xff1a; 在“project”窗口。打開“entry>src>main>ets”,右擊“pages”&#xff0c;選擇“New>ArkTS File”,命名“Second”&#xff0c;點擊回車鍵。 在頁面的路由&#xff0…

昇思25天學習打卡營第16天|文本解碼原理——以MindNLP為例

在大模型中&#xff0c;文本解碼通常是指在自然語言處理&#xff08;NLP&#xff09;任務中使用的大型神經網絡模型&#xff08;如Transformer架構的模型&#xff09;將編碼后的文本數據轉換回可讀的原始文本的過程。這些模型在處理自然語言時&#xff0c;首先將輸入文本&#…

【Unix/Linux】Unix/Linux如何查看系統版本

Unix和Linux查看系統版本的指令有些區別&#xff0c;下面分別介紹: 一.Unix查看系統版本 在Unix系統中&#xff0c;查看系統版本的方法可能會根據具體的Unix操作系統而有所不同。以下是一些通用的方法&#xff0c;適用于多種Unix系統&#xff0c;包括但不限于Solaris、AIX、H…

vienna整流器過零畸變原因分析

Vienna整流器是一種常見的三電平功率因數校正&#xff08;PFC&#xff09;整流器&#xff0c;廣泛應用于電源和電能質量控制領域。由于其高效率、高功率密度和低諧波失真的特點&#xff0c;Vienna整流器在工業和電力電子應用中具有重要地位。然而&#xff0c;在實際應用中&…

ssh:(xshell)遠程連接失敗

項目場景&#xff1a; 提示&#xff1a;這里簡述項目相關背景&#xff1a; 云服務器遠程連接失敗 xshell 遠程連接失敗 xshell (ssh客戶端&#xff09; ---------------------------------------------安全組----------防火墻-------黑白名單-----SSH服務 問題排查 1. 安全…

Playwright之錄制腳本轉Page Object類

Playwright之錄制腳本轉Page Object類 設計思路 &#xff1a; 我們今天UI自動化設計的時候&#xff0c;通常會遵循一些設計模式&#xff0c;例如Page Object模式。但是自己找元素再去填寫有一些麻煩&#xff0c;所以我們可以通過拆解錄制的腳本&#xff0c;將其中的元素提取出來…