Vue3項目實現WPS文件預覽和內容回填功能

技術方案背景:根據項目需要,要實現在線查看、在線編輯文檔,并且進行內容的快速回填,根據這一項目背景,最終采用WPS的API來實現,接下來我們一起來實現項目功能。

1.首先需要先準備好測試使用的文檔,并且做好標簽節點的標記,在要需要回填的地地方打好標記標簽

打開文檔 => 點擊菜單欄插入 => 找到要添加書簽的地方,選擇工具欄的書簽按鈕

輸入對應的命名書簽

表格書簽是打標記在表格內容上方,便于查找表格位置方便替換;

2. 引入WPS Web Office SDK代碼示例(vue項目舉例,在根目錄下的index.html文件中引入)

<script src="/wps-sdk/web-office-sdk-solution-v2.0.7.umd.js"></script>

注意事項

SDK路徑需要根據實際存放位置調整,若使用CDN方式可替換為完整URL

當前示例使用的是v2.0.7版本的UMD格式SDK,適用于大多數瀏覽器環境

建議將腳本放在<head>標簽內或<body>標簽末尾,避免阻塞頁面渲染

初始化示例

const config = {mount: document.getElementById('office-container'),url: 'https://example.com/test.docx'
};
WebOfficeSDK.initialize(config);

版本選擇建議

生產環境建議鎖定具體版本號(如示例中的v2.0.7)

測試環境可使用最新版本,但需注意API兼容性

UMD格式適用于傳統網頁開發,若使用模塊化開發可考慮ES模塊版本

以上代碼需配合WPS官方文檔使用,確保初始化參數配置正確(WPS官方文檔:快速上手 | WPS WebOffice 開放平臺)

3.使用HTML代碼塊編寫的WPS文檔在線查看容器代碼:

 <!-- 創建wps文檔在線查看容器 -->
<div id="wps-frame" class="w-full h-[calc(100%-60px)] bg-#eee custom-mount"></div>

代碼說明

該代碼創建了一個具有以下特性的div容器:

  • 使用id="wps-frame"作為唯一標識
  • 通過class屬性應用了多個樣式:
    • w-full:寬度100%
    • h-[calc(100%-60px)]:高度為總高度減去60px
    • bg-#eee:背景色設置為淺灰色
    • custom-mount:預留的自定義掛載類名

樣式補充建議

如需更精確控制樣式,可以添加CSS:

#wps-frame {border: 1px solid #ddd;margin: 0 auto;overflow: hidden;
}

4. 初始化WPS容器

const init = async () => {window.fileurlType = props.fileObj.fileurl.split('.').pop().toLowerCase();instance = WebOfficeSDK.init({//文檔類型officeType: window.fileurlType === 'xlsx' || window.fileurlType === 'xls' ? WebOfficeSDK.OfficeType.Spreadsheet : window.fileurlType === 'docx' || window.fileurlType === 'doc' ? WebOfficeSDK.OfficeType.Writer : WebOfficeSDK.OfficeType.Otl,appId: "你申請的預覽服務的appid",fileId: props.fileObj.fileid,token: token,mount: document.getElementById('wps-frame'),mode: props.submitType === true ? 'nomal' : 'simple',});//如果props.submitType為true,則設置為可以編輯 否則設置為只讀if (props.submitType == false) {await instance.ready();const app = instance.Application;await app.ActiveDocument.SetReadOnly({Value: true});} else {await instance.ready();//根據接口返回信息對文檔進行回填getInformationBackfilling();}
}

5. 容器初始化后我們拿到需要回填的數據就可以進行數據回填操作

//根據接口返回信息對文檔進行回填
const getInformationBackfilling = () => {detailObj(props.fileObj?.projectid || props.projectid ).then(res => {const { data } = res//解析JSON格式的回填數據const recruitcontent = JSON.parse(data.recruitcontent)//保存預設的書簽內容的回填信息,字段需要對應在文檔中打的標記書簽allData.value = {projectname: data.projectname,projectcode: data.projectcode,recrunit: data.recrunit,abbreviation: data.projectname,}// 執行書簽回顯業務setBookmarks()// 獲取表格回顯內容const list = recruitcontent.map((item, index) => {item.indexNumber = index + 1item.projectName = data.projectnameitem.subProjectDl = ""return item})// 執行表格回顯業務addTable(list, 1)})
}

6. 書簽回顯業務

//書簽賦值
const setBookmarks = async () => {const app = instance.Application;// 書簽對象const bookmarks = await app.ActiveDocument.Bookmarks;let replaceArr = [];needSet.forEach((item) => {let { key } = getKey(item.name);replaceArr.push({name: item.name,type: 'text',value: allDataInfo.value[key]?.toString(),});});// 替換書簽內容const isReplaceSuccess = await bookmarks.ReplaceBookmark(replaceArr);
}

7. 表格回顯業務

//插入表格(標的物)
const addTable = async (list, type) => {if (!list && list?.length == 0) return;const app = instance.Application;let tabelHeade = [{title: '序號',key: 'indexNumber',},{title: '項目名稱',key: 'projectName',},{title: '子目名稱',key: 'subProjectName',},{title: '技術服務內容',key: 'techServiceContent',},{title: '單位',key: 'unit',},{title: '數量',key: 'quantity',},{title: '備注',key: 'remark',},];const tables = await app.ActiveDocument.Tables;// 等待表格創建完成await new Promise(resolve => {const interval = setInterval(async () => {const currentCount = await tables.Count;if (currentCount >= 10) {clearInterval(interval);resolve();}}, 300);});setTimeout(async () => {// 獲取頁面中總表格數量const count = await tables.Count;const Bookmark = await app.ActiveDocument.Bookmarks.Item('定義的表格書簽名');// 插入表格await tables.Add(Bookmark.Range, // 位置信息list.length + 1, // 新增表格的行數tabelHeade.length, // 新增表格的列數1,2,);const tableOne = await tables.Item(Bookmark);for (let i = 0; i < list.length + 1; i++) {for (let j = 0; j < tabelHeade.length; j++) {const curCell = await tableOne.Rows.Item(i + 1).Cells.Item(j + 1);const rowText = await curCell.Range;// 設置單元格內容的字號const font = await rowText.Font;font.Size = 12; // 設置字號為 12rowText.Text = i == 0 ? tabelHeade[j].title : list[i - 1][tabelHeade[j].key] ? list[i - 1][tabelHeade[j].key].toString() : "";}}}, 1000 * 1.5);};

8. 擴展內容合并單元格

// 合并行表格單元格 instance:WebOfficeSDK初始化的文檔容器,tableIndex:表格編號, rowIndex:開始行,startColIndex:結束行  , value: 替換值)
async function mergeTableCells(instance, tableIndex, rowIndex, startColIndex, endColIndex, value) {const app = instance.Application;const doc = app.ActiveDocument;const tables = await doc.Tables;// 獲取指定表格const table = await tables.Item(tableIndex);// 獲取指定行const row = await table.Rows.Item(rowIndex);// 獲取起始單元格和結束單元格const startCell = await row.Cells.Item(startColIndex);const endCell = await row.Cells.Item(endColIndex);// 合并單元格await startCell.Merge(endCell);// 設置合并后單元格的值const mergedCell = await row.Cells.Item(startColIndex);const mergedCellRange = await mergedCell.Range;mergedCellRange.Text = value;
}// 合并列表格單元格(instance:WebOfficeSDK初始化的文檔容器,tableIndex:表格編號, startRowIndex:開始列,endRowIndex:結束列, value: 替換值 )
async function mergeFirstColumnRows(instance, tableIndex, startRowIndex, endRowIndex, value) {const app = instance.Application;const doc = app.ActiveDocument;const tables = await doc.Tables;// 獲取指定表格const table = await tables.Item(tableIndex);// 獲取起始行和結束行const startRow = await table.Rows.Item(startRowIndex);const endRow = await table.Rows.Item(endRowIndex);// 獲取第一列的起始單元格和結束單元格const startCell = await startRow.Cells.Item(1);const endCell = await endRow.Cells.Item(1);// 合并單元格await startCell.Merge(endCell);// 設置合并后單元格的值const mergedCell = await table.Rows.Item(startRowIndex).Cells.Item(1);const mergedCellRange = await mergedCell.Range;mergedCellRange.Text = value;
}

小結:

1. 根據業務需求,首先初始化時,實現了文檔在線查看的功能,根據是否需要編輯的狀態設置文檔只讀模式或者編輯模式;

2. 實現回填功能中,根據拿到的需要回填的數據做處理對應給需要回填的書簽內容區域

3. 回填表格功能,根據表頭配置好對應回顯字段,進行業務回填,增加擴展功能對表格中部分地方單元格合并的方法;

功能代碼是已實現的業務邏輯,中間也踩坑不少,最終實現文檔在線查看,在線編輯以及文本和表格回填功能,歡迎大家多多交流溝通,提出建議,指出錯誤,我們一起成長,最后希望大家在踩坑路上繼續成長。

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

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

相關文章

匯編語言學習(三)——DoxBox中debug的使用

目錄 一、安裝DoxBox&#xff0c;并下載匯編工具&#xff08;MASM文件&#xff09; 二、debug是什么 三、debug中的命令 一、安裝DoxBox&#xff0c;并下載匯編工具&#xff08;MASM文件&#xff09; 鏈接&#xff1a; https://pan.baidu.com/s/1IbyJj-JIkl_oMOJmkKiaGQ?pw…

關于DDOS

DDOS是一門沒什么技術含量的東西&#xff0c;其本質而言是通過大量數據報文&#xff0c;發送到目標受害主機IP地址上&#xff0c;導致目標主機無法繼續服務&#xff08;俗稱&#xff1a;拒絕服務&#xff09; DDOS灰產人期望達成的預期目標&#xff0c;幾乎都是只要把對面打到 …

Modbus轉Ethernet IP網關助力羅克韋爾PLC數據交互

在工業自動化領域&#xff0c;Modbus協議是一種廣泛應用的串行通信協議&#xff0c;它定義了主站和從站之間的通信規則和數據格式。羅克韋爾PLC是一種可編程的邏輯控制器&#xff0c;通過Modbus協議實現與其他設備之間的數據交互。然而&#xff0c;隨著以太網技術的普及和發展&…

C# winform教程(二)----button

一、button的使用方法 主要使用方法幾乎都在屬性內&#xff0c;我們操作也在這個界面 二、作用 用戶點擊時觸發事件&#xff0c;事件有很多種&#xff0c;可以根據需要選擇。 三、常用屬性 雖然屬性很多&#xff0c;但是常用的并不多 3.常用屬性 名稱內容含義AutoSize自動調…

【 java 基礎問題 第二篇 】

目錄 1.深拷貝和淺拷貝 1.1.區別 定義 定義 1.2.實現深拷貝的方式 2.泛型 2.1.定義 2.2.作用 3.對象 3.1.創建對象的方式 3.2.對象回收 3.3. 獲取私有成員 4.反射 4.1.定義 4.2.特性 4.3.原理 5.異常 5.1.異常的種類 5.2.處理異常的方法 6.Object 6.1.等于與…

Kafka 入門指南與一鍵部署

Kafka 介紹 想象一下你正在運營一個大型電商平臺&#xff0c;每秒都有成千上萬的用戶瀏覽商品、下單、支付&#xff0c;同時后臺系統還在記錄用戶行為、更新庫存、處理物流信息。這些海量、持續產生的數據就像奔騰不息的河流&#xff0c;你需要一個強大、可靠且實時的系統來接…

湖北理元理律師事務所:企業債務重組的風險控制方法論

一、擔保鏈破解&#xff1a;阻斷債務傳染的核心技術 2023年武漢某建材公司案例&#xff1a; 原始債務結構&#xff1a; A公司&#xff08;主債務人&#xff09;欠款200萬 ↓ B公司&#xff08;擔保人&#xff09;←連帶責任觸發執行 ↓ C公司&#xff08;B公司擔…

如何在CloudCompare中打開pcd文件

你只需要將pcd文件的路徑改在全英文路徑下&#xff0c;CloudCompare就可以打開。若含中文&#xff0c;就會報錯&#xff1a;

中醫的十問歌和脈象分類

中醫核心理論框架如下 診斷技術如下 本文主要介紹問診和切診。 十問歌的“十”是虛指&#xff0c;實際包含12個核心問題&#xff0c;脈象28種中常見僅10余種&#xff0c;重點解釋脈診的物理本質&#xff08;血流動力學觸覺感知&#xff09; 以下是中醫十問歌的完整內容及脈…

基于智能代理人工智能(Agentic AI)對沖基金模擬系統:模范巴菲特、凱西·伍德的投資策略

股票市場涉及眾多統計數據和模式。股票交易基于研究和數據驅動的決策。人工智能的使用可以實現流程自動化&#xff0c;讓投資者在研究上花費更少的時間&#xff0c;同時提高準確性。這使他們能夠更加專注于監督實際交易和服務客戶。 頂尖對沖基金經理發揮著至關重要的作用&…

大二下期末

一.Numpy&#xff08;Numerical Python&#xff09; Numpy庫是Python用于科學計算的基礎包&#xff0c;也是大量Python數學和科學計算包的基礎。不少數據處理和分析包都是在Numpy的基礎上開發的&#xff0c;如后面介紹的Pandas包。 Numpy的核心基礎是ndarray&#xff08;N-di…

D3ctf-web-d3invitation單題wp

#注入 #用kali構造憑證訪問MinIO服務器 #用mc帶臨時憑證訪問遠程Minion的儲存桶 還有一個 minio 服務的api&#xff0c;我們后面要用 /static/js/tools.js function generateInvitation(user_id, avatarFile) {if (avatarFile) {object_name avatarFile.name;genSTSCreds(ob…

基于 Vue 和 Spring Boot 實現滑塊驗證碼的機器驗證

基于 Vue 和 Spring Boot 實現滑塊驗證碼的機器驗證 需求概述技術選型前端實現1. 引入組件2. 修改后端請求URL3. 新增機器驗證頁面4.首頁調用驗證組件 后端實現流程梳理具體實現1. 引入依賴2. 增加yml配置3. 代碼實現4.跨域配置&#xff08;可選&#xff09; 實現效果二次驗證的…

[Java惡補day13] 53. 最大子數組和

休息了一天&#xff0c;開始補上&#xff01; 給你一個整數數組 nums &#xff0c;請你找出一個具有最大和的連續子數組&#xff08;子數組最少包含一個元素&#xff09;&#xff0c;返回其最大和。 子數組是數組中的一個連續部分。 示例 1&#xff1a; 輸入&#xff1a;nums …

sql server如何創建表導入excel的數據

在 SQL Server 中&#xff0c;可以通過幾種方式將 Excel 數據導入到數據庫表中。下面是一個完整的流程&#xff0c;包括如何創建表&#xff0c;以及將 Excel 數據導入該表的方法&#xff1a; ? 方法一&#xff1a;使用 SQL Server Management Studio (SSMS) 的導入向導&#x…

C++單例模式教學指南

C單例模式完整教學指南 &#x1f4da; 目錄 [單例模式基礎概念][經典單例實現及問題][現代C推薦實現][高級話題&#xff1a;雙重檢查鎖][實戰應用與最佳實踐][總結與選擇指南] 1. 單例模式基礎概念 1.1 什么是單例模式&#xff1f; 單例模式&#xff08;Singleton Pattern&…

使用xdocreport導出word

之前java總用freemaker進行導出&#xff0c;但是改xml實在是太繁瑣了&#xff0c;這次找了另一個工具進行體驗. 一、簡單導出 pom引入 <dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>fr.opensagres.xdocreport.core</arti…

vscode里如何用git

打開vs終端執行如下&#xff1a; 1 初始化 Git 倉庫&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 倉庫 git add . 3 使用 git commit 命令來提交你的更改。確保在提交時加上一個有用的消息。 git commit -m "備注信息" 4 …

C++.OpenGL (2/64)你好,三角形(Hello Triangle)

你好,三角形(Hello Triangle) 繪制流程概覽 #mermaid-svg-MvIGIovxiuKVfzy8 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-MvIGIovxiuKVfzy8 .error-icon{fill:#552222;}#mermaid-svg-MvIGIovxiuKVfzy8 .error…

汽車安全體系:FuSa、SOTIF、Cybersecurity 從理論到實戰

汽車安全&#xff1a;功能安全&#xff08;FuSa&#xff09;、預期功能安全&#xff08;SOTIF&#xff09;與網絡安全(Cybersecurity) 從理論到實戰的安全體系 引言&#xff1a;自動駕駛浪潮下的安全挑戰 隨著自動駕駛技術從L2向L4快速演進&#xff0c;汽車安全正從“機械可靠…