分享一個用C#寫的Aspose.Words生成word的工具類

公共類

標題樣式

字體大小 margin設置 標題 h1-h6

namespace Common.Bo
{public class TitleStyle{/// <summary>/// 標題樣式/// </summary>/// <param name="tag"></param>/// <param name="fontSize"></param>/// <param name="margin"></param>public TitleStyle(float fontSize, string margin){FontSize = fontSize;Margin = margin;}/// <summary>/// 標題樣式/// </summary>/// <param name="tag"></param>/// <param name="fontSize"></param>/// <param name="margin"></param>public TitleStyle(string tag, float fontSize, string margin){Tag = tag;FontSize = fontSize;Margin = margin;}public string Tag { get; set; } = "h1";public float FontSize { get; set; }public string Margin { get; set; }//"h1","35px","margin-top:0px;"}
}

word的目錄信息


namespace Common.Bo
{/// <summary>/// word目錄信息/// </summary>public class WordMenuInfo{public string Title { get; set; }public int PageNumber { get; set; }}
}

公共屬性

標題級別 對應的標題樣式 漢字與數字標題對應關系

using Aspose.Words;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Text;
using System.Text.RegularExpressions;namespace Common.Bo
{public class CommonStyle{#region 標題級別 如一級標題 三級標題protected const int oneTitileLevel = 1;protected const int twoTitileLevel = 2;protected const int threeTitileLevel = 3;protected const int fourTitileLevel = 4;protected const int fiveTitileLevel = 5;#endregion#region 只讀的標題樣式public static ReadOnlyDictionary<int, TitleStyle> titleDict = new ReadOnlyDictionary<int, TitleStyle>(new Dictionary<int, TitleStyle>{{ 0,new TitleStyle("h1",35,"margin-top:0px;")},{ 1,new TitleStyle("h1",35,"margin-top:0px;")},{ 2,new TitleStyle("h2",33,"margin-top:0px;")},{ 3,new TitleStyle("h3",32,"margin-top:0px;")},{ 4,new TitleStyle("h4",30,"margin-top:0px;")},{ 5,new TitleStyle("h5",28,"margin-top:0px;")},});#endregion#region 文件格式protected static ReadOnlyDictionary<string, string> imageFormatterDict = new ReadOnlyDictionary<string, string>(new Dictionary<string, string>{{ ".jpg",default},{ ".jpeg",default},{ ".png",default},{ ".emf",default},{ ".wmf",default},{ ".bmp",default},});protected static ReadOnlyDictionary<string, string> wordFormatterDict = new ReadOnlyDictionary<string, string>(new Dictionary<string, string>{{ ".doc",default},{ ".docx",default}});#endregion#region 數字與大小漢字對照標 最大可是999=》九百九十九protected static Dictionary<int, string> numberUpCaseDict = new Dictionary<int, string>(){{0,"零"},{1,"一"},{2,"二"},{3,"三"},{4,"四"},{5,"五"},{6,"六"},{7,"七"},{8,"八"},{9,"九"},{10,"十"}};#endregion#region 1-5級 標題格式規則校驗與標題級別protected static ReadOnlyDictionary<Regex, int> titleRegexRule= new ReadOnlyDictionary<Regex, int>(new Dictionary<Regex, int>{{new Regex("^\\d{1,3}[\\.、]([^0-9]|s)"),1},{new Regex("^\\d{1,3}[\\.、]\\d{1,3}[\\.、]?([^0-9]|s)"),2},{new Regex("^\\d{1,3}[\\.、]\\d{1,3}[\\.、]\\d{1,3}[\\.、]?([^0-9]|s)"),3},{new Regex("^\\d{1,3}[\\.、]\\d{1,3}[\\.、]\\d{1,3}[\\.、]\\d{1,3}[\\.、]?([^0-9]|s)"),4},{new Regex("^\\d{1,3}[\\.、]\\d{1,3}[\\.、]\\d{1,3}[\\.、]\\d{1,3}[\\.、]\\d{1,3}[\\.、]?([^0-9]|s)"),5}});#endregionstatic CommonStyle(){int curV;StringBuilder sbf;for (int i = 11; i < 900; i++){sbf = new StringBuilder();if ((curV = i / 100) > 0){sbf.Append(numberUpCaseDict[curV] + "百");}if ((curV = i % 100 / 10) > 0){sbf.Append(i > 10 && i < 20 ? "十" : numberUpCaseDict[curV] + "十");}else if (i > 100 && curV > 0){sbf.Append("零");}if ((curV = i % 10) > 0){sbf.Append(numberUpCaseDict[curV]);}numberUpCaseDict.Add(i, sbf.ToString());}}}
}

核心代碼

生成word里面相關部分 如標題 文本 表格 圖片 目錄

using Aspose.Pdf.Operators;
using Aspose.Words;
using Aspose.Words.Drawing;
using Aspose.Words.Tables;
using Common.Bo;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text.RegularExpressions;namespace Common.Util
{/// <summary>/// Aspose.Words /// 生成table  /// 生成標題/// 生成文本  /// 插入圖片/// 生成目錄/// 獲取目錄/// 合并word/// 轉化pdf /// /// </summary>public class AsposeWordUtil : CommonStyle{/// <summary>/// 創建word document/// </summary>/// <param name="comPath"></param>/// <param name="comDoc"></param>/// <param name="comBuilder"></param>public static void CreateWordDocument(string comPath, out Document comDoc, out DocumentBuilder comBuilder){comDoc = new Document(comPath);comBuilder = new DocumentBuilder(comDoc);comBuilder.PageSetup.PaperSize = PaperSize.A4;//頁面設置為A4}/// <summary>/// 創建表格/// </summary>/// <typeparam name="T"></typeparam>/// <param name="curBuilder"></param>/// <param name="bookName"></param>/// <param name="list"></param>/// <param name="columNames"></param>/// <param name="propNames"></param>/// <param name="customFunc"></param>/// <param name="serialNum"></param>/// <param name="titleRemark"></param>public static void CreateTable<T>(DocumentBuilder curBuilder, string bookName, IList<T> list,string[] columNames, string[] propNames, Action<DocumentBuilder> customFunc = null, bool serialNum = false, string titleRemark = null){Type tbc = typeof(T);Dictionary<string, Func<T, string>> titleColumsDict = new Dictionary<string, Func<T, string>>();for (int i = 0; i < columNames.Length; i++){System.Reflection.PropertyInfo propertyInfo = tbc.GetProperty(propNames[i]);titleColumsDict[columNames[i]] = ob => propertyInfo.GetValue(ob, null)?.ToString();}CreateTable(curBuilder, bookName, list, titleColumsDict, customFunc, serialNum, titleRemark);}/// <summary>/// 創建表格/// </summary>/// <typeparam name="T"></typeparam>/// <param name="curBuilder"></param>/// <param name="bookName">word模板標簽名稱</param>/// <param name="list"></param>/// <param name="titleColumsDict">表格列名與取值的Func</param>/// <param name="customFunc">自定義函數處理 比如生成合計列</param>/// <param name="serialNum">是否需要序號</param>/// <param name="titleRemark">在表格之上需要生成文本信息</param>public static void CreateTable<T>(DocumentBuilder curBuilder, string bookName, IList<T> list, Dictionary<string, Func<T, string>> titleColumsDict, Action<DocumentBuilder> customFunc = null, bool serialNum = false, string titleRemark = null){//移到標簽部分if (bookName != null){curBuilder.MoveToBookmark(bookName);}//表格不存在if (!list.Any()){return;}string[] columNames = titleColumsDict.Select(p => p.Key).ToArray();//默認填寫表頭內容if (!string.IsNullOrWhiteSpace(titleRemark)){curBuilder.StartTable();curBuilder.ParagraphFormat.Alignment = ParagraphAlignment.Left; // RowAlignment.Center;                curBuilder.RowFormat.Height = 20;curBuilder.InsertCell();curBuilder.CellFormat.Width = 500 * (serialNum ? 1 : 0 + columNames.Length);curBuilder.CellFormat.VerticalAlignment = CellVerticalAlignment.Top;curBuilder.CellFormat.Borders[0].LineStyle = LineStyle.Single;curBuilder.CellFormat.Borders[1].LineStyle = LineStyle.None;curBuilder.CellFormat.Borders[2].LineStyle = LineStyle.None;curBuilder.CellFormat.Borders[3].LineStyle = LineStyle.None;//字體大小  curBuilder.Font.Size = 9.5d;//是否加粗  curBuilder.Bold = false;curBuilder.Write(titleRemark);curBuilder.EndRow();curBuilder.EndTable();}Type tbc = typeof(T);Table table = curBuilder.StartTable();curBuilder.ParagraphFormat.Alignment = ParagraphAlignment.Center; // RowAlignment.Center;                curBuilder.RowFormat.Height = 20;//操作序號列if (serialNum){curBuilder.InsertCell();//使用固定的列寬//table.AutoFit(AutoFitBehavior.AutoFitToContents);//Table單元格邊框線樣式  curBuilder.CellFormat.Borders.LineStyle = LineStyle.Single;//Table此單元格寬度  curBuilder.CellFormat.Width = 500;curBuilder.CellFormat.VerticalAlignment = CellVerticalAlignment.Center;//字體大小  curBuilder.Font.Size = 10;//是否加粗  curBuilder.Bold = true;curBuilder.Write("序號");}//添加列頭  for (int i = 0; i < columNames.Length; i++){curBuilder.InsertCell();//使用固定的列寬//table.AutoFit(AutoFitBehavior.AutoFitToContents);//Table單元格邊框線樣式  curBuilder.CellFormat.Borders.LineStyle = LineStyle.Single;//Table此單元格寬度  curBuilder.CellFormat.Width = 500;curBuilder.CellFormat.VerticalAlignment = CellVerticalAlignment.Center;//字體大小  curBuilder.Font.Size = 10;//是否加粗  curBuilder.Bold = true;//向此單元格中添加內容  //builder.Write(dt.Columns[i].ColumnName);curBuilder.Write(columNames[i]);}curBuilder.EndRow();//結束表頭行 下次InsertCell開啟新的行//添加每行數據  for (int i = 0; i < list.Count; i++){curBuilder.RowFormat.HeightRule = HeightRule.Auto;//操作序號列if (serialNum){//插入Table單元格  curBuilder.InsertCell();//Table單元格邊框線樣式  curBuilder.CellFormat.Borders.LineStyle = LineStyle.Single;//字體大小  curBuilder.Font.Size = 10;//是否加粗  curBuilder.Bold = false;//向此單元格中添加內容  curBuilder.Write((i + 1).ToString());}foreach (var tcItem in titleColumsDict){//插入Table單元格  curBuilder.InsertCell();//Table單元格邊框線樣式  curBuilder.CellFormat.Borders.LineStyle = LineStyle.Single;//字體大小  curBuilder.Font.Size = 10;//是否加粗  curBuilder.Bold = false;//向此單元格中添加內容  curBuilder.Write(tcItem.Value.Invoke(list[i]) ?? "");}//Table行結束  curBuilder.EndRow();}if (customFunc != null){customFunc(curBuilder);}curBuilder.EndTable();}/// <summary>/// 設置書簽具體的值/// </summary>/// <param name="v"></param>/// <param name="projectName"></param>public static void SetBookVal(Document doc, string bookName, string value){if (!string.IsNullOrEmpty(value)){doc.Range.Bookmarks[bookName].Text = value;}}/// <summary>/// 當前的domBuiler操作 插入圖片 ==》追加pdf內容/// </summary>/// <param name="curBuilder"></param>/// <param name="filePath"></param>public static void AppendImageAndPdf(DocumentBuilder curBuilder, string filePath){//文件資源不存在 ==》不插入圖片if (!File.Exists(filePath)){return;}//如果是文件夾if (Directory.Exists(filePath)){FileInfo[] fileInfoArray = new DirectoryInfo(filePath).GetFiles();#region 處理圖片FileInfo[] fileInfos = fileInfoArray.Where(fi => imageFormatterDict.ContainsKey(fi.Extension.ToLower())).OrderBy(f => f.Name).ToArray();foreach (FileInfo item in fileInfos){AppendImageAndPdf(curBuilder, item.FullName);//將圖片文件追加進去}#endregion}else{using (Image image = Image.FromFile(filePath)){curBuilder.InsertBreak(BreakType.SectionBreakNewPage);int imgWidth2 = image.Width;int imgHeight2 = image.Height;//適配寬高AdaptWh(curBuilder, ref imgWidth2, ref imgHeight2);curBuilder.InsertImage(image, RelativeHorizontalPosition.Page, 10.0, RelativeVerticalPosition.Page, 5.0, imgWidth2, imgHeight2, WrapType.None);}}}/// <summary>/// 插入標題或文本/// </summary>/// <param name="comBuilder"></param>/// <param name="title"></param>/// <param name="titleLevel"></param>/// <param name="newPage">插入新的一頁  一般為true是防止圖片把文字覆蓋了</param>/// <param name="marginCss">額外的樣式</param>/// <param name="isTitle">是否是1-5級標題 如果不是則用div</param>public static void InsertDefinedTitle(DocumentBuilder comBuilder, string title, int titleLevel, bool newPage = false,string marginCss = null, bool isTitle = true){//防止被圖片覆蓋if (newPage){comBuilder.InsertBreak(BreakType.SectionBreakNewPage);}TitleStyle curValue = null;curValue = titleDict.TryGetValue(titleLevel, out curValue) ? curValue : new TitleStyle("h1", 35, "margin-top:0px;");marginCss = marginCss ?? (curValue.Margin ?? "margin-top:0px;");if (newPage){marginCss = "margin-top:300px;";}string hmark = isTitle ? curValue.Tag : "div";string fontSize = curValue.FontSize + "px";comBuilder.InsertHtml($"<{hmark} style='text-align:center;font-family:宋體;font-size:{fontSize};{marginCss}'>" + title + $"</{hmark}><br/>");}/// <summary>/// 插入圖片/// </summary>/// <param name="curBuilder"></param>/// <param name="filePath"></param>/// <param name="imgWidth"></param>/// <param name="imgHeight"></param>public static void InsertImage(DocumentBuilder curBuilder, string filePath, int? imgWidth = null, int? imgHeight = null, WrapType wrapType = WrapType.None){using (Image image = Image.FromFile(filePath)){int _imgWidth = imgWidth ?? image.Width;int _imgHeight = imgHeight ?? image.Height;//適配寬高if (imgWidth != null && imgHeight != null){AdaptWh(curBuilder, ref _imgWidth, ref _imgHeight);}curBuilder.InsertImage(image, RelativeHorizontalPosition.Page, 10, RelativeVerticalPosition.Page, 5, _imgWidth, _imgHeight, wrapType);}}/// <summary>/// 圖片適配(頁面寬高)/// </summary>/// <param name="imgWidth"></param>/// <param name="imgHeight"></param>public static void AdaptWh(DocumentBuilder curBuilder, ref int imgWidth, ref int imgHeight){int maxWidth = (int)(curBuilder.PageSetup.PageWidth * 0.92);int maxHeight = (int)(curBuilder.PageSetup.PageHeight * 0.92);//長寬比視頻if (imgWidth > maxWidth){imgHeight = Convert.ToInt32(decimal.Multiply(decimal.Divide(maxWidth, (int)imgWidth), (int)imgHeight));imgWidth = maxWidth;}if (imgHeight > maxHeight){imgWidth = Convert.ToInt32(decimal.Multiply(decimal.Divide(maxHeight, (int)imgHeight), (int)imgWidth));imgHeight = maxHeight;}}/// <summary>/// 內容歸檔并書寫頁面/// </summary>/// <param name="doc">主doc</param>/// <param name="mergeDoc">被合并的doc</param>/// <param name="titleList">標題信息</param>/// <param name="indexTitle"></param>public static void PlaceOnFile(Document doc, Document mergeDoc){doc.AppendDocument(mergeDoc, ImportFormatMode.KeepSourceFormatting);}/// <summary>/// 獲取目錄信息/// </summary>/// <param name="doc"></param>public static List<WordMenuInfo> GetDocMenuInfo(Document doc){#region 獲取目錄信息List<WordMenuInfo> pageInfoList = new List<WordMenuInfo>();foreach (Aspose.Words.Fields.Field field in doc.Range.Fields){if (field.Type.Equals(Aspose.Words.Fields.FieldType.FieldHyperlink)){string value;string[] vs;if (!string.IsNullOrWhiteSpace(field.Result)){//頁碼內容 此次使用正則獲取 標題信息(含頁碼)value = Regex.Replace(field.Result, @"\s{1,20} PAGEREF _Toc\d+\s+\\h", "").Replace("\u0015", "").Replace("\u0014", "");value = Regex.Replace(value, @"\s{1,2}[^\d]{1,12}$", "###");vs = Regex.Split(value, @"\d{1,12}$");pageInfoList.Add(new WordMenuInfo { Title = vs[0], PageNumber = Convert.ToInt32(value.Replace(vs[0], "").Trim()) });}}}return pageInfoList;#endregion}/// <summary>/// 生成目錄/// </summary>public void CreateToc(DocumentBuilder builder, string bookMark = "目錄位置"){bool moveSuccess = builder.MoveToBookmark(bookMark);if (moveSuccess){//目錄居左builder.ParagraphFormat.Alignment = ParagraphAlignment.Left;//插入目錄,這是固定的builder.InsertTableOfContents("\\o \"1-3\" \\h \\z \\u");builder.Document.UpdateFields();// 更新域//builder.Document.UpdatePageLayout();}}}
}

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

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

相關文章

使用 Tailwind CSS 完成導航欄效果

使用 Tailwind CSS 完成導航欄效果 本文將向您介紹如何使用 Tailwind CSS 創建一個漂亮的導航欄。通過逐步演示和示例代碼&#xff0c;您將學習如何使用 Tailwind CSS 的類來設計和定制導航欄的樣式。 準備工作 在開始之前&#xff0c;請確保已經安裝了 Tailwind CSS。如果沒…

求小球落地5次后所經歷的路程和第5次反彈的高度

假設一個球從任意高度自由落下&#xff0c;每次落地后反跳回原高度的一半; 再落下, 求它在第5次落地時&#xff0c;共經歷多少米?第5次反彈多高&#xff1f; 數據范圍&#xff1a;輸入的小球初始高度滿足1≤n≤1000 &#xff0c;且保證是一個整數。 輸入描述&#xff1a;輸入…

JavaScript-自定義屬性

自定義屬性 語法&#xff1a; 定義&#xff1a; <div class"box" data-id"666"></div> //獲取&#xff1a; <script>const div document.querySelector(.box);console.log(div.dateset.id);//輸出666 </script>

Node CLI 之 Commander.js (1)

官網地址&#xff1a; https://github.com/tj/commander.js/blob/f1ae2db8e2da01d6efcbfd59cbf82202f864b0c1/Readme_zh-CN.md Commander.js是node.js命令行界面的完整解決方案 開始 新建一個node工程執行 npm install commanderpackage.json中新增代碼添加 #! /usr/bin/env…

Linux 詳細介紹strace命令

system call(系統調用)是程序向內核請求服務的一種編程方式&#xff0c;strace是一個功能強大的工具&#xff0c;可以跟蹤用戶進程和 Linux 內核之間的交互。 要了解操作系統如何工作&#xff0c;首先需要了解系統調用如何工作。操作系統的主要功能之一是為用戶程序提供了一個…

HJ94 記票統計

題目&#xff1a; HJ94 記票統計 題解&#xff1a; 利用哈希表&#xff0c;投票是按姓名從哈希表中取出對應的票數&#xff0c;如果不在哈希表內證明為無效。 public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);int n Inte…

PyQt6 QTimeEdit時間控件

?鋒哥原創的PyQt6視頻教程&#xff1a; 2024版 PyQt6 Python桌面開發 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili2024版 PyQt6 Python桌面開發 視頻教程(無廢話版) 玩命更新中~共計39條視頻&#xff0c;包括&#xff1a;2024版 PyQt6 Python桌面開發 視頻教程(無廢話…

C++新經典模板與泛型編程:將trait類模板用作模板參數

將trait類模板用作模板參數 template<typename T> struct SumFixedTraits;template<> struct SumFixedTraits<char> {using sumT int;static sumT initValue() {return 0;} };template<> struct SumFixedTraits<int> {using sumT __int64;sta…

Proteus仿真--基于DAC0808設計的直流電機調速器

本文介紹基于DAC0808設計的直流電機調速器設計&#xff08;完整仿真源文件及代碼見文末鏈接&#xff09; 設置按鍵A-H按鍵&#xff0c;每個按鍵分別對應不同的速度&#xff0c;按下后電機按照設定速度轉動 仿真圖如下 仿真運行視頻 Proteus仿真--基于DAC0808設計的直流電機調…

互聯網數據傳輸原理 |OSI七層網絡參考模型

網絡模型 OSI 網絡參考模型&#xff0c;僅作為參考&#xff0c;也就是說OSI網絡實際中并不使用。我們只是把OSI網絡模型作為參考&#xff0c;在網絡出現問題的時候&#xff0c;可以從一個宏觀的整體去分析和解決問題。而且搭建網絡的時候也并不一定需要劃分為7層 但是當今互聯…

【uniapp】小程序中input輸入框的placeholder-class不生效解決辦法

問題描述 uniapp微信小程序&#xff0c;使用input組件時&#xff0c;想要改變提示詞 placeholder 的樣式&#xff0c;但是使用placeholder-class 改變不了 如下&#xff1a; <input type"text" placeholder"搜索" placeholder-class"placeholde…

2024最新金三銀四軟件測試面試題

一直以來大大小小參與過不少面試&#xff0c;遇到過不少坑&#xff0c;但是沒來的及好好總結匯總下。現在把之前遇到的問題匯總下&#xff0c;希望以后自己能加深印象。 1、appium 怎么定位toast彈框 appium1.6以后回答需要升級u2進行定位。 2、什么是事務&#xff0c;知道事…

PADS9.5封裝庫轉換為AD庫

1、打開PADS Layout&#xff0c;File – Library&#xff0c;選中usr&#xff0c;如下圖&#xff1a; 2、封裝– 導入&#xff0c;選中你的 .d后綴文件(也就是PADS的封裝文件)&#xff0c;打開。 3、元件 – 新建 – PCB封裝 - 分配 - 確定。 4、&#xff0c;選擇“斜線”…

Laya2.13.3接入第三方庫Socket.io

服務端&#xff1a; 1.新建一個文件夾&#xff0c;使用npm.init -y創建node工程 2.在控制臺使用以下代碼下載Socket.io npm install socket.io 3.創建一個app.js的文件&#xff0c;將以下代碼填入 import { Server } from "socket.io"; import { createServer }…

Linux學習筆記3 xshell(lnmp)

xshell能連接虛擬機的前提是真機能夠ping通虛擬機網址 裝OpenSSL依賴文件 [rootlocalhost nginx-1.12.2]# yum -y install openssl pcre-devel 依賴檢測[rootlocalhost nginx-1.12.2]# ./configure [rootlocalhost nginx-1.12.2]# yum -y install zlib [rootlocalhost n…

【騰訊云 HAI域探秘】StableDiffusionWebUI 讓我找到了宮崎駿動漫里的夏天

目錄 前言一、HAI二、應用場景三、構建 Stable Diffusion 模型1、新建HAI應用2、StableDiffusionWebUI&#xff08;1&#xff09;功能介紹&#xff08;2&#xff09;頁面轉中文&#xff08;3&#xff09;AI繪圖① 正向提示詞語② 反向提示詞③ “” 、“ AND”、“|” 用法④ 權…

自定義函數參數傳遞問題

最近&#xff0c;被一個函數調用參數傳遞的問題困惑了一陣。自己寫的解釋程序&#xff0c;一直用的好好的。在暗自得意的過程中&#xff0c;突然出現了bug&#xff0c;被潑了一頭冷水。當然&#xff0c;bug是在無意中被發現的&#xff0c;確定以后則可以編制專用的代碼來揭示它…

重積分的應用@物體對外部質點的引力問題

文章目錄 引力(*)分析兩質點間的引力公式三重積分計算引力薄片情形計算例 引力(*) 這里討論的是:空間一物體對于物體外一點 P 0 ( x 0 , y 0 , z 0 ) P_{0}(x_0,y_0,z_0) P0?(x0?,y0?,z0?)處單位質量的質點的引力 分析 仍然使用元素法, 設占有空間有界閉區域 Ω \Omega …

網絡協議與 IP 編址

網絡協議與 IP 編址 之前大概了解過了網絡的一些基礎概念&#xff0c;見文章&#xff1a; 網絡基礎概念。 之前簡單了解OSI模型分層&#xff1a; TCP/IP模型OSI模型TCP/IP對等模型應用層應用層表示層應用層會話層主機到主機層傳輸層傳輸層因特網層網絡層網絡層網絡接入層數據鏈…

jsonwebtoken生成token和解析

先上npm地址 jsonwebtoken&#xff1a;jsonwebtoken - npm express-jwt&#xff1a;express-jwt - npmps const express require(express); const jwt require(jsonwebtoken); const { expressjwt: expressJWT} require(express-jwt)const app express();// 設置密鑰 co…