poi-excel-添加水印

1、官網快速指南

https://poi.apache.org/components/spreadsheet/quick-guide.html
訪問如上地址可以查看到poi的相關操作方式:

  • How to create a new workbook
  • How to create a sheet
  • How to create cells
  • How to create date cells
  • Working with different types of cells
  • Iterate over rows and cells
  • Getting the cell contents
  • Text Extraction
  • Files vs InputStreams
  • Aligning cells
  • Working with borders
  • Fills and color
  • Merging cells
  • Working with fonts
  • ......

https://archive.apache.org/dist/poi/release/src/

https://archive.apache.org/dist/poi/release/bin/

2、如何處理水印

在excel中沒有水印的概念,只能通過其他形式視覺上達到水印的效果;
方式一:可以通過頁眉頁腳的方式:
????????優點:全文覆蓋、打印預覽可查看??缺點:無法編輯、在非打印預覽視圖下無法查看
方式二:插入圖片方式
? ? ? ? 優點:在非打印預覽視圖下可以查看? 缺點:打印的時候無法展示

3、實現方式

3.1、頁眉頁腳實現方式

3.1.1 pom依賴

<!-- Apache POI 核心庫 -->
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.3</version>
</dependency><!-- OOXML 模式庫(提供 CTLocking 等類) -->
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-lite</artifactId><version>5.2.3</version>
</dependency>

3.1.2?簡單代碼

  public static void buildHeaderAndFooter () throws IOException {// 創建文檔Workbook wb = new HSSFWorkbook();// 創建sheet頁Sheet sheet = wb.createSheet("sheet名稱");// 創建行Row row = sheet.createRow(0);// 創建列Cell cell = row.createCell(0);// 設置單元格內容cell.setCellValue("測試測試");// 獲取頁眉Header header = sheet.getHeader();// 設置頁眉header.setCenter("&\"微軟雅黑,Bold\"&14&KAAAAAA 公司機密 - 嚴禁外傳 - 頁眉");sheet.setMargin(Sheet.HeaderMargin, 0.8);// 獲取頁腳Footer footer = sheet.getFooter();// 設置頁腳footer.setCenter("&\"微軟雅黑,Bold\"&14&KAAAAAA 公司機密 - 嚴禁外傳 - 頁腳");sheet.setMargin(Sheet.FooterMargin, 0.8);// TODO 需要根據自己的本地地址修改try (OutputStream fileOut = new FileOutputStream("D://workbook.xls")) {wb.write(fileOut);}}

3.1.3 效果

普通視圖下: 沒有任何效果

?預覽模式下:頁眉頁腳展示咱們得水印

?3.2 背景圖片實現方式

3.2.1 pom依賴

<!-- Apache POI 核心庫 -->
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.3</version>
</dependency><!-- OOXML 模式庫(提供 CTLocking 等類) -->
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-lite</artifactId><version>5.2.3</version>
</dependency>

3.2.2 簡單代碼

 public static void picture() throws IOException{// 創建文檔Workbook wb = new XSSFWorkbook();// 背景圖片的位置 TODO 需要修改成本地地址InputStream is = new FileInputStream("D://a.png");byte[] bytes = IOUtils.toByteArray(is);// 設置成背景圖片int pictureIdx = wb.addPicture(bytes, Workbook.PICTURE_TYPE_JPEG);is.close();CreationHelper helper = wb.getCreationHelper();// 創建sheet頁Sheet sheet = wb.createSheet();// 創建繪圖容器(drawing patriarch)這是 Excel 中所有形狀(包括圖片)的頂級容器。每個 sheet 只能有一個繪圖容器。Drawing drawing = sheet.createDrawingPatriarch();// 創建錨點(ClientAnchor)對象。錨點用于確定圖片在 sheet 中的位置和大小ClientAnchor anchor = helper.createClientAnchor();// 設置起始列(從0開始計數)anchor.setCol1(3);// 設置起始行(從0開始計數)anchor.setRow1(2);Picture pict = drawing.createPicture(anchor, pictureIdx);// 根據圖片原始尺寸自動調整顯示大小pict.resize();// 保存excel文件地址,TODO 需根據本地地址調整String file = "D://picture.xls";if (wb instanceof XSSFWorkbook) file += "x";try (OutputStream fileOut = new FileOutputStream(file)) {wb.write(fileOut);}}

3.2.3 效果

不足之處在于添加的背景圖片可以被刪除,這樣水印就沒啥意義了

3.2.4 針對水印可被刪除的改進方式

代碼調整

 public static void buildPicture() throws IOException{// 創建文檔XSSFWorkbook wb = new XSSFWorkbook(); //or new HSSFWorkbook();// 背景圖片的位置 TODO 需要修改成本地地址InputStream is = new FileInputStream("D://a.png");byte[] bytes = IOUtils.toByteArray(is);// 添加圖片到工作簿int pictureIdx = wb.addPicture(bytes, Workbook.PICTURE_TYPE_JPEG);//  返回工作簿中所有圖片的列表POIXMLDocumentPart poixmlDocumentPart = wb.getAllPictures().get(pictureIdx);CreationHelper helper = wb.getCreationHelper();// 創建sheet頁XSSFSheet sheet = wb.createSheet();/*** getPackagePart() 獲取圖片在 OOXML 包中的物理表示(即 ZIP 包中的一個文件)。* getPartName() 返回該文件的路徑(如 /xl/media/image1.png)。*/PackagePartName ppn = poixmlDocumentPart.getPackagePart().getPartName();String relType = XSSFRelation.IMAGES.getRelation();PackageRelationship pr = sheet.getPackagePart().addRelationship(ppn, TargetMode.INTERNAL, relType, null);// 設置圖片為工作表背景sheet.getCTWorksheet().addNewPicture().setId(pr.getId());String file = "D://picture.xls";if (wb instanceof XSSFWorkbook) file += "x";try (OutputStream fileOut = new FileOutputStream(file)) {wb.write(fileOut);}is.close();}

?效果如下: 水印無法選中也無法刪除

?4、完整示例

主要是使用背景圖片的方式來實現excel的水印效果

4.1、pom依賴

<!-- Apache POI 核心庫 -->
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.3</version>
</dependency><!-- OOXML 模式庫(提供 CTLocking 等類) -->
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-lite</artifactId><version>5.2.3</version>
</dependency>

?4.2、代碼

package water1;import org.apache.poi.ooxml.POIXMLDocumentPart;
import org.apache.poi.openxml4j.opc.PackagePartName;
import org.apache.poi.openxml4j.opc.PackageRelationship;
import org.apache.poi.openxml4j.opc.TargetMode;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFRelation;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;import javax.imageio.ImageIO;
import java.awt.Color;
import java.awt.Font;
import java.awt.*;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;public class ExcelWatermarkGenerator {public static void main(String[] args) {try {String outputFile = "D://平鋪水印數據表.xlsx";createTiledWatermarkExcel(outputFile);System.out.println("成功創建帶平鋪水印的Excel文件: " + new File(outputFile).getAbsolutePath());} catch (Exception e) {System.err.println("創建Excel文件時出錯: " + e.getMessage());e.printStackTrace();}}public static void createTiledWatermarkExcel(String outputPath) throws Exception {// 1. 創建工作簿XSSFWorkbook workbook = new XSSFWorkbook();XSSFSheet sheet = (XSSFSheet)workbook.createSheet("銷售數據");// 2. 添加標題行addTitleRow(sheet);// 3. 添加示例數據addSampleData(sheet);// 4. 設置列寬setColumnWidths(sheet);// 5. 創建平鋪水印圖片 TODO  “公司機密” 可替換成需要的水印文字byte[] watermarkImage = createTiledWatermarkImage("公司機密", 4, 3); // 4列3行平鋪// 6. 添加水印到ExceladdWatermarkToSheet(workbook, sheet, watermarkImage);// 7. 添加WPS兼容的頁眉文本水印addHeaderWatermarkForWPS(sheet);// 8. 設置打印選項setupPrintSettings(sheet);// 9. 保存文件try (FileOutputStream out = new FileOutputStream(outputPath)) {workbook.write(out);}workbook.close();}private static void addTitleRow(Sheet sheet) {Row titleRow = sheet.createRow(0);titleRow.setHeightInPoints(25);CellStyle titleStyle = createTitleStyle(sheet.getWorkbook());String[] titles = {"產品名稱", "生產日期", "庫存數量", "單價(元)", "總價值"};for (int i = 0; i < titles.length; i++) {Cell cell = titleRow.createCell(i);cell.setCellValue(titles[i]);cell.setCellStyle(titleStyle);}}private static CellStyle createTitleStyle(Workbook workbook) {CellStyle style = workbook.createCellStyle();style.setFillForegroundColor(IndexedColors.ROYAL_BLUE.getIndex());style.setFillPattern(FillPatternType.SOLID_FOREGROUND);org.apache.poi.ss.usermodel.Font font = workbook.createFont();font.setBold(true);font.setFontHeightInPoints((short) 12);font.setColor(IndexedColors.WHITE.getIndex());style.setFont(font);style.setBorderTop(BorderStyle.THIN);style.setBorderBottom(BorderStyle.THIN);style.setBorderLeft(BorderStyle.THIN);style.setBorderRight(BorderStyle.THIN);style.setTopBorderColor(IndexedColors.BLUE.getIndex());style.setAlignment(HorizontalAlignment.CENTER);style.setVerticalAlignment(VerticalAlignment.CENTER);return style;}private static void addSampleData(Sheet sheet) {CellStyle dateStyle = createDateStyle(sheet.getWorkbook());CellStyle currencyStyle = createCurrencyStyle(sheet.getWorkbook());String[] products = {"智能手機", "筆記本電腦", "平板電腦", "智能手表", "藍牙耳機"};SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");for (int i = 1; i <= 30; i++) {Row row = sheet.createRow(i);// 產品名稱row.createCell(0).setCellValue(products[i % products.length] + " " + (i % 5 + 1) + "代");// 生產日期Cell dateCell = row.createCell(1);Date date = new Date(System.currentTimeMillis() - (i * 24 * 60 * 60 * 1000L));dateCell.setCellValue(date);dateCell.setCellStyle(dateStyle);// 庫存數量row.createCell(2).setCellValue(100 + (int)(Math.random() * 500));// 單價Cell priceCell = row.createCell(3);double price = 500 + (Math.random() * 3000);priceCell.setCellValue(price);priceCell.setCellStyle(currencyStyle);// 總價值(公式計算)Cell valueCell = row.createCell(4);valueCell.setCellFormula("C" + (i+1) + "*D" + (i+1));valueCell.setCellStyle(currencyStyle);}}private static CellStyle createDateStyle(Workbook workbook) {CellStyle style = workbook.createCellStyle();style.setLocked(false); // 允許編輯CreationHelper createHelper = workbook.getCreationHelper();style.setDataFormat(createHelper.createDataFormat().getFormat("yyyy-mm-dd"));return style;}private static CellStyle createCurrencyStyle(Workbook workbook) {CellStyle style = workbook.createCellStyle();style.setLocked(false); // 允許編輯style.setDataFormat((short) BuiltinFormats.getBuiltinFormat("¥#,##0.00"));return style;}private static void setColumnWidths(Sheet sheet) {sheet.setColumnWidth(0, 25 * 256);  // 產品名稱sheet.setColumnWidth(1, 15 * 256);  // 生產日期sheet.setColumnWidth(2, 12 * 256);  // 庫存數量sheet.setColumnWidth(3, 12 * 256);  // 單價sheet.setColumnWidth(4, 15 * 256);  // 總價值}private static byte[] createTiledWatermarkImage(String text, int cols, int rows) throws IOException {// 1. 設置單個水印單元尺寸int cellWidth = 300;int cellHeight = 200;// 2. 計算總圖片尺寸int totalWidth = cellWidth * cols;int totalHeight = cellHeight * rows;// 3. 創建透明背景圖片BufferedImage image = new BufferedImage(totalWidth, totalHeight, BufferedImage.TYPE_INT_ARGB);Graphics2D g2d = image.createGraphics();// 4. 設置透明背景g2d.setComposite(AlphaComposite.Clear);g2d.fillRect(0, 0, totalWidth, totalHeight);g2d.setComposite(AlphaComposite.Src);// 5. 設置水印樣式g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);g2d.setColor(new Color(180, 180, 180, 50)); // 半透明灰色// 6. 使用WPS兼容字體Font font = new Font("微軟雅黑", Font.BOLD, 36);g2d.setFont(font);// 7. 在網格中平鋪水印for (int row = 0; row < rows; row++) {for (int col = 0; col < cols; col++) {// 計算當前單元中心位置int centerX = col * cellWidth + cellWidth / 2;int centerY = row * cellHeight + cellHeight / 2;// 保存當前變換AffineTransform originalTransform = g2d.getTransform();// 移動到當前單元中心g2d.translate(centerX, centerY);// 旋轉文本g2d.rotate(Math.toRadians(-30));// 計算文本位置(居中)FontMetrics metrics = g2d.getFontMetrics();int textWidth = metrics.stringWidth(text);int x = -textWidth / 2;int y = metrics.getHeight() / 4;// 繪制水印文本g2d.drawString(text, x, y);// 恢復原始變換g2d.setTransform(originalTransform);}}g2d.dispose();// 8. 將圖片轉換為字節數組ByteArrayOutputStream baos = new ByteArrayOutputStream();ImageIO.write(image, "PNG", baos);return baos.toByteArray();}private static void addWatermarkToSheet(XSSFWorkbook workbook, XSSFSheet sheet, byte[] watermarkImage) throws Exception {// 1. 添加圖片到工作簿int pictureIdx = workbook.addPicture(watermarkImage, Workbook.PICTURE_TYPE_PNG);//  返回工作簿中所有圖片的列表POIXMLDocumentPart poixmlDocumentPart = workbook.getAllPictures().get(pictureIdx);CreationHelper helper = workbook.getCreationHelper();/*** getPackagePart() 獲取圖片在 OOXML 包中的物理表示(即 ZIP 包中的一個文件)。* getPartName() 返回該文件的路徑(如 /xl/media/image1.png)。*/PackagePartName ppn = poixmlDocumentPart.getPackagePart().getPartName();String relType = XSSFRelation.IMAGES.getRelation();PackageRelationship pr = sheet.getPackagePart().addRelationship(ppn, TargetMode.INTERNAL, relType, null);// 設置圖片為工作表背景sheet.getCTWorksheet().addNewPicture().setId(pr.getId());}private static void addHeaderWatermarkForWPS(Sheet sheet) {// WPS兼容性:添加文本水印到頁眉Header header = sheet.getHeader();header.setCenter("&\"微軟雅黑,Bold\"&14&KAAAAAA 公司機密 - 嚴禁外傳");sheet.setMargin(Sheet.HeaderMargin, 0.8);}private static void setupPrintSettings(Sheet sheet) {// 1. 設置頁面為橫向sheet.getPrintSetup().setLandscape(true);// 2. 設置頁邊距sheet.setMargin(Sheet.TopMargin, 0.7);sheet.setMargin(Sheet.BottomMargin, 0.7);sheet.setMargin(Sheet.LeftMargin, 0.5);sheet.setMargin(Sheet.RightMargin, 0.5);// 3. 設置打印標題行sheet.setRepeatingRows(CellRangeAddress.valueOf("1:1"));// 4. 設置網格線sheet.setDisplayGridlines(true);sheet.setPrintGridlines(true);// 5. 設置縮放比例sheet.setZoom(90); // 90%縮放}
}

?4.3 效果


?

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

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

相關文章

STM32 開發的鼠標:技術詳解與實現指南

概述基于STM32微控制器開發的鼠標是一種高度可定化的輸入設備解決方案&#xff0c;廣泛應用于工業控制、嵌入式系統、特殊人機交互等領域。相比傳統鼠標&#xff0c;STM32鼠標具有以下優勢&#xff1a;高度可定制性&#xff1a;可添加特殊功能按鍵、傳感器集成低功耗設計&#…

GoLang教程007:打印空心金字塔

4.6 案例一&#xff1a;打印金字塔編寫一個程序&#xff0c;可以接收一個整數&#xff0c;表示層數&#xff0c;打印出金字塔。1??第一步&#xff1a;打印一個矩形 package mainimport "fmt"func main() {// i表示層數for i : 1; i < 3; i {// j表示每層打印多少…

iOS開發 Swift 速記3:運算符與控制結構

初級代碼游戲的專欄介紹與文章目錄-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代碼都將會位于ctfc庫中。已經放入庫中我會指出在庫中的位置。 這些代碼大部分以Linux為目標但部分代碼是純C的&#xff0c;可以在任何平臺上使用。 源碼指引&#xff1a;github源…

ElasticSearch中需要注意的點,附官方文檔解讀

1.批量更新數量大小限制 https://www.elastic.co/guide/cn/elasticsearch/guide/current/bulk.html#_How_Big_Is_Too_Big 整個批量請求都需要由接收到請求的節點加載到內存中&#xff0c;因此該請求越大&#xff0c;其他請求所能獲得的內存就越少。批量請求的大小有一個最佳值…

Git GitHub精通:前端協作開發的“瑞士軍刀“!

前言&#xff1a;為什么你的代碼總是"失蹤"&#xff1f; "啊&#xff01;我的代碼呢&#xff1f;"——這可能是每個程序員都曾發出過的靈魂吶喊。還記得上周我熬夜寫的300行JavaScript&#xff0c;第二天醒來發現被自己手賤覆蓋了&#xff0c;那一刻我深刻…

第 30 場 藍橋·算法入門賽 題解

1. 零食爭議【算法賽】 簽到題&#xff1a;1-7奇數相加 #include <bits/stdc.h> using namespace std; int main() {// 請在此輸入您的代碼cout<<1357;return 0; } 2. 數字炸彈【算法賽】 把n個人看為前n-1和后n-1 &#xff0c; 方便找到是第幾段的第幾個數 #in…

閑庭信步使用圖像驗證平臺加速FPGA的開發:第二十四課——圖像直方圖均衡化的FPGA實現

&#xff08;本系列只需要modelsim即可完成數字圖像的處理&#xff0c;每個工程都搭建了全自動化的仿真環境&#xff0c;只需要雙擊top_tb.bat文件就可以完成整個的仿真&#xff0c;大大降低了初學者的門檻&#xff01;&#xff01;&#xff01;&#xff01;如需要該系列的工程…

LabVIEW 2025安裝包| 免費免激活版下載| 附圖文詳細安裝教程

[軟件名稱]&#xff1a;LabVIEW 2025 [軟件大小]&#xff1a;13 G [系統要求]&#xff1a;支持Win7及更高版本 [下載通道]:夸克網盤 [下載鏈接]: https://pan.quark.cn/s/7e9527cc06a3 &#xff08;建議用手機保存到網盤后&#xff0c;再用電腦下載&#xff09; 更多免費軟件&a…

如何實現泵站的無人值守:御控智慧水務平臺

在城鄉供水、農田灌溉、工業循環水等場景中&#xff0c;泵站作為核心動力設施&#xff0c;其運行效率直接影響水資源調配的穩定性。然而&#xff0c;傳統泵站管理長期面臨三大痛點&#xff1a;人力成本高昂&#xff1a;偏遠地區泵站需24小時值守&#xff0c;單站年均人力成本超…

深度學習篇---車道線循跡

要實現基于深度學習的雙車道線&#xff08;黃色車道線&#xff09;循跡&#xff08;通過預測四個輪子的轉速實現自主控制&#xff09;&#xff0c;需要從數據采集、模型設計、訓練策略、環境適應等多維度系統優化。以下是具體方案及需要注意的關鍵事項&#xff0c;旨在提升精準…

JavaScript,發生異常,try...catch...finally處理,繼續向上層調用者傳遞異常信息

JavaScript中&#xff0c;?異常&#xff08;Exception&#xff09;和錯誤&#xff08;Error&#xff09; JavaScript 是一種解釋型語言&#xff0c;通常在瀏覽器中通過JavaScript引擎執行。最著名的兩個引擎是&#xff1a;SpiderMonkey&#xff08;由 Mozilla Firefox 使用&a…

SpringMVC快速入門之啟動配置流程

SpringMVC快速入門之啟動配置流程一、SpringMVC啟動的核心流程二、環境準備與依賴配置2.1 開發環境2.2 Maven依賴配置三、初始化Servlet容器&#xff1a;WebApplicationInitializer3.1 實現WebApplicationInitializer3.2 配置編碼過濾器&#xff08;解決中文亂碼&#xff09;四…

ArcGIS水文及空間分析與SWMM融合協同在城市排水防澇領域中的應用

隨著計算機的廣泛應用和各類模型軟件的發展&#xff0c;將排水系統模型作為城市洪災評價與防治的技術手段已經成為防洪防災的重要技術途徑。將創新性融合地理信息系統&#xff08;GIS&#xff09;的空間分析能力與暴雨雨水管理模型&#xff08;SWMM&#xff09;的水動力計算優勢…

PHICOMM(斐訊)N1盒子 - Armbian25.05(Debian 12)刷入U盤/EMMC

PHICOMM(斐訊)N1盒子 - Armbian25.05(Debian 12)刷入U盤/EMMC 文章目錄PHICOMM(斐訊)N1盒子 - Armbian25.05(Debian 12)刷入U盤/EMMC前言1. 確保固件版本為2.192. 刷系統到U盤3. 啟動U盤系統4. U盤系統寫入EMMC5. 關機撥U盤6. 重新上電環境&#xff1a; 系統&#xff1a;Armbi…

《計算機網絡基礎知識全解析:從協議模型到通信實踐》

《計算機網絡基礎知識全解析&#xff1a;從協議模型到通信實踐》 在數字化時代&#xff0c;計算機網絡是信息傳遞的基石&#xff0c;從日常瀏覽網頁到企業數據交互&#xff0c;都離不開網絡協議的規范與支撐。本文將系統梳理計算機網絡的核心知識&#xff0c;從通信模型到具體協…

【補題】Codeforces Global Round 26 E. Shuffle

題意&#xff1a;給出一棵樹&#xff0c;按照以下方式操作 對于當前的所有任意子樹&#xff0c;選出任何一個點從中刪除&#xff0c;然后作為新子樹的根插入到新的樹中&#xff0c;以此遞歸往復&#xff0c;直到原來的樹中節點全部進入新樹&#xff0c;問新樹最多有多少個葉子節…

金倉數據庫風云

O 記我用了這么多年&#xff0c;我最有發言權&#xff0c;我可不敢替&#xff0c;你們誰能搞定&#xff0c;誰上。” 老鄧在會上&#xff0c;狠狠甩了一句氣話。老鄧&#xff08;鄧銘&#xff09;&#xff0c;某大型期貨交易所信息化主管&#xff0c;數據庫老司機。 作為圈里最…

阿里云寶塔Linux面板相關操作記錄

1、清空nginx緩存使用Nginx時&#xff0c;靜態圖片文件會出現緩存&#xff0c;所以需要清空緩存&#xff0c;方法如下&#xff1a;sudo rm -rf /www/server/nginx/proxy_cache_dir/*2、Windows啟動spring boot jar腳本echo off setlocal enabledelayedexpansion:: 配置項目名 s…

Kotlin伴生對象

你已經知道如何為類創建單例對象&#xff08;singleton&#xff09;。不過&#xff0c;在很多情況下&#xff0c;你只需要為某個類維護一個單例&#xff0c;這時候使用類的完整名字會顯得冗長。比如&#xff0c;你可能只需要存儲一個公共的屬性。這種情況下&#xff0c;可以用 …

4G車載錄像機的作用詳解:提升行車安全與智能管理的核心技術

1. 引言隨著物流運輸、公共交通、特種車輛等行業對安全與管理需求的提升&#xff0c;4G車載錄像機已成為現代車輛智能化管理的重要組成部分。它不僅具備傳統行車記錄儀的錄像功能&#xff0c;還結合4G無線通信、AI智能分析、GPS定位、云存儲等技術&#xff0c;實現遠程監控、實…